Avatar billede refpsych Nybegynder
22. marts 2004 - 21:48 Der er 4 kommentarer og
3 løsninger

Deling af string

Hej

Jeg skal have fat i værdierne i en string som ser sådan her ud
var1=text;info=text;time=text;
Så jeg kan ligge dem i tilsvarende variabler.
Hvordan gør jeg lettest det?
Avatar billede dkn Nybegynder
22. marts 2004 - 22:59 #1
det kommer jo an på om der altid er 3 værdier, men ellers kan det laves noget lign sådan:

Var
Var1:string;
Info:String;
Ftime:string;
Text:string;
begin
Text := 'var1=text;info=text;time=text;';

//Var1
Text := copy(Text, pos('=', Text)+1, length(Text));
Var1 := copy(Text, 0, pos(';', Text)-1);

//Info
Text := copy(Text, pos('=', Text)+1, length(Text));
Info := copy(Text, 0, pos(';', Text)-1);

//Time
Text := copy(Text, pos('=', Text)+1, length(Text));
ftime := copy(Text, 0, pos(';', Text)-1);

showmessage(var1+#13#10+info+#13#10+ftime);
end;


koden er ikke testet...
Avatar billede athlon-pascal Juniormester
22. marts 2004 - 23:04 #2
Jeg forstår ikke helt hvad du vil - vil du have en liste med alle værdierne, eller vil du bare trække en enkelt værdi ud ad gangen?

Men prøv at oprette et nyt projekt med følgende kode i Unit1:

type
  TMyRec = record
    Name: String;
    Value: String;
  end;

  TMyRecArray = Array of TMyRec;

function ExtractString(S: String): TMyRecArray;
var
  I: Integer;
  MyRec: TMyRec;
begin
  SetLength(Result, 0);

  while Length(S) > 0 do
  begin
    I := Pos('=', S);
    if I = 0 then
      Break;
    MyRec.Name := Copy(S, 1, I - 1);
    Delete(S, 1, I);

    I := Pos(';', S);
    if I = 0 then
      I := Length(S) + 1;
    MyRec.Value := Copy(S, 1, I - 1);
    Delete(S, 1, I);

    SetLength(Result, Length(Result) + 1);
    Result[High(Result)] := MyRec;
  end;
end;



!!! >>> Indsæt en TListBox, ListBox1, samt en TEdit, Edit1 og en TButton, Button1, på din form.
I Button1's OnClick-event skriver du følgende:

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  MyRecArray: TMyRecArray;
begin
  ListBox1.Clear;
  MyRecArray := ExtractString(Edit1.Text);
  for I := Low(MyRecArray) to High(MyRecArray) do
    ListBox1.Items.Add('"' + MyRecArray[I].Name + '" er sat til "' + MyRecArray[I].Value + '"');
end;
Avatar billede athlon-pascal Juniormester
22. marts 2004 - 23:19 #3
Hvis du vil trække en bestemt værdi ad gangen ud af strengen, kan du prøve følgende:

function ExtractValue(S, Name: String): String;
var
  I, NameLength: Integer;
begin
  Result := '';
  Name := AnsiLowerCase(Name);

  I := Pos(';' + Name + '=', AnsiLowerCase(S)) + 1;
  if I < 2 then
  begin
    I := Pos(Name + '=', AnsiLowerCase(S));
    if I <> 1 then
      Exit;
  end;

  Delete(S, 1, I + Length(Name));

  I := Pos(';', S);
  if I < 1 then
    I := Length(S) + 1;

  Result := Copy(S, 1, I - 1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Str: String;
begin
  Str := 'var1=text;info=text;time=text;';
  ShowMessage(ExtractValue(Str, 'info'));
end;
Avatar billede doc404 Novice
23. marts 2004 - 08:22 #4
Hvis du bruger Delphi 7 (måske også 6..) kan du bruge en kombination af ExtractStrings og en TStringList.

Eksempel:

procedure TForm1.Button1Click(Sender: TObject);
var
  s : string;
  Vars : TStringList;
begin
  s := 'var1="abc";var2="def";var3="ghi"';

  Vars := TStringList.Create;
  ExtractStrings([';'],[],PChar(s),Vars);

  ShowMessage(Vars.Values['var1']);
  ShowMessage(Vars.Values['var2']);
  ShowMessage(Vars.Values['var3']);

  Vars.Free;

end;
Avatar billede doc404 Novice
23. marts 2004 - 08:31 #5
PS... Det er ALT formange point til et sådan spm. Max 30.
Avatar billede hrc Mester
23. marts 2004 - 14:26 #6
Hæ, hæ - synes også den var lidt vel overhældt med points...

doc404: Elegant eksempel - og det virker...
Avatar billede refpsych Nybegynder
23. marts 2004 - 16:36 #7
Super :) det var lige hvad jeg havde brug for.
Jeg skal nok prøve på at være lidt mere nærig med pointene næste gang *g*

Tak!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester