Extrair dados de uma string separada por Caracteres
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
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
Curtidas 0
Respostas
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.
Para usar:
[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
12/08/2003
campo1, campo2 e campo3 seriam os nomes de seus Edits?
GOSTEI 0
Marcelo Saviski
12/08/2003
ou:
strVariavel := ´campo1=10 campo2=20 campo3=30´;
valor : array[0..2] of string;
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
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
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...
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