Extrair dados de uma string separada por Caracteres

Delphi

12/08/2003

Galera, estou me perdendo na lógica disso aqui:

strVariavel := ´campo1=valor1;campo2=valor2;campo3=valor3;´

Preciso extrair desta forma:

Edit1.Text := valor1;
Edit2.Text := valor1;
Edit3.Text := valor1;

mais, puts não consigo montar a lógica...alguém tem algo parecido pra me mandar?

valeu


Adriano Santos

Adriano Santos

Curtidas 0

Respostas

Cebikyn

Cebikyn

12/08/2003

Segue uma função que faz o que você que você quer, a única diferença é que ao invés de:

[b:5782f42975]strVariavel := ´campo1=valor1;campo2=valor2;campo3=valor3´;[/b:5782f42975]

deve-se usar:

[b:5782f42975]strVariavel := ´campo1=valor1 campo2=´valor 2´ campo3=valor3´;[/b:5782f42975]

ou seja, deve-se separar com espaços ao invés de [b:5782f42975];[/b:5782f42975]. Note também o uso de aspas quando há espaços em brancos no valor do campo.

function GetValue(ValueName, Text : String) : String;
var
  S     : String;
  L,
  X,
  P     : Integer;
  FoundEquals,
  WordStarted,
  InQuote : Boolean;
begin
  Result := ´´;
  S := UpperCase(Text);
  P := Pos(UpperCase(ValueName),S);
  if P = 0 then exit;

  Delete(Text,1,P-1);

  L := Length(S);
  WordStarted := False;
  FoundEquals := False;
  InQuote := False;

  for X := 1 to L do
    if Text[X] = ´=´ then begin
      FoundEquals := True;
      P := X;
      Break;
    end;

  if not FoundEquals then exit;

  for X := P +1 to L do
    if Text[X] <> ´ ´ then begin
      WordStarted := True;
      P := X;
      Break;
    end;

  if not WordStarted then exit;

  if Text[X] in [´"´, ´´´´] then begin
    InQuote := True;
    Inc(P);
  end;

  for X:= P to L do begin
    if InQuote then begin
      if Text[X] in [´"´, ´´´´] then
        Break
      else
        Result := Result + Text[X];
    end else begin
      if UpCase(Text[X]) in [´A´..´Z´,´0´..´9´,´\´,´/´,´.´,´-´,´_´,´:´] then
        Result := Result + Text[X]
      else
        Break;
    end;
  end;
end;


Para usar:
Edit1.Text := GetValue(´campo1´, strVariavel);
Edit2.Text := GetValue(´campo2´, strVariavel);
Edit3.Text := GetValue(´campo3´, strVariavel); 



GOSTEI 0
Allen74

Allen74

12/08/2003

campo1, campo2 e campo3 seriam os nomes de seus Edits?


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

12/08/2003

ou:

strVariavel := ´campo1=10 campo2=20 campo3=30´;
valor : array[0..2] of string;

var
ts : TStrings;
va i : integer;
begin
ts := TStringlist.create;
try
  ts.DelimiterText := strVariavel;
  ts.Delimiter := ´ ´;
  for i := 0 to ts.count-1 do
    valor[i] := copy(ts[i],pos(´=´, ts[i])+1, 100);
finally
ts.free;
end;
end;



GOSTEI 0
Cebikyn

Cebikyn

12/08/2003

campo1, campo2 e campo3 seriam os nomes de seus Edits?


São os campos que fazem parte da [i:59de9a12a9]string[/i:59de9a12a9]:

strVariavel := ´[color=red:59de9a12a9]campo1[/color:59de9a12a9]=valor1 [color=red:59de9a12a9]campo2[/color:59de9a12a9]=´valor 2´ [color=red:59de9a12a9]campo3[/color:59de9a12a9]=valor3´;


GOSTEI 0
Adriano Santos

Adriano Santos

12/08/2003

O Allen74 está correto, o [color=red:9964430904]campo1[/color:9964430904], [color=red:9964430904]campo2 [/color:9964430904]etc são os edits na tela.

O que estou fazendo é uma rotina para gravar todos os dado do form. Quando o usuário abrir o form vou trazer as últimas configurações usadas na tela, e quando o usuário fechar eu gravo. Vou usar isso para tela de impressão de relatórios para que o usuário não precise redigitar e selecionar datas, filtros etc na tela de configuração do relatório. Com base na função que o cebikyn mandou montei isso vejam.

[color=green:9964430904]{
Button1: TButton;
edValor1: TEdit;
edValor2: TEdit;
edValor3: TEdit;
edValor4: TEdit;
dtValor4: TDateTimePicker;
procedure Button1Click(Sender: TObject);

}[/color:9964430904]
procedure TForm1.Button1Click(Sender: TObject);
var
I : Integer;
strVariavel,strCampo,strValor : String;
function GetValue(ValueName, Text : String) : String;
var
S : String;
L,
X,
P : Integer;
FoundEquals,
WordStarted,
InQuote : Boolean;
begin
Result := ´´;
S := UpperCase(Text);
P := Pos(UpperCase(ValueName),S);
if P = 0 then exit;

Delete(Text,1,P-1);

L := Length(S);
WordStarted := False;
FoundEquals := False;
InQuote := False;

for X := 1 to L do
if Text[X] = ´=´ then begin
FoundEquals := True;
P := X;
Break;
end;

if not FoundEquals then exit;

for X := P +1 to L do
if Text[X] <> ´ ´ then begin
WordStarted := True;
P := X;
Break;
end;

if not WordStarted then exit;

if Text[X] in [´´´, ´´´´] then begin
InQuote := True;
Inc(P);
end;

for X:= P to L do begin
if InQuote then begin
if Text[X] in [´´´, ´´´´] then
Break
else
Result := Result + Text[X];
end else begin
if UpCase(Text[X]) in [´A´..´Z´,´0´..´9´,´\´,´/´,´.´,´-´,´_´,´:´] then
Result := Result + Text[X]
else
Break;
end;
end;
end;
begin
strVariavel := ´edValor1=valor1 edValor2=´valor 2´ edValor3=valor3 edValor4=01/12/2003 dtValor4=01/12/2003´;
for I := 0 to Form1.ComponentCount-1 do begin
strCampo := Components[I].Name;
strValor := GetValue(strCampo, strVariavel);
if (Form1.Components[I] is TEdit) then TEdit(Components[I]).Text := strValor;
if (Form1.Components[I] is TDateTimePicker) then TDateTimePicker(Components[I]).DateTime := StrToDateTime(strValor);
end;
end;


valeu a todos...


GOSTEI 0
POSTAR