Nesse post, vou apresentar um exemplo de uso da propriedade Values da classe TStringlist.
É muito comum precisarmos manter uma lista de variaveis totalizando campos numericos. O problema é que toda vez que precisamos de um novo totalizador, temos que criar uma nova variavel no programa.
Uma abordagem mais pratica dessa situação, é utilizar a classe TStringlist.
Nesse caso o TStringlist funcionará como um array, com a vantagem que seus elementos podem ser acessados pelo nome.
A propriedade Values
O TStringlist nos dá a opção de nomear elementos, associando seu respectivo valor, através do metodo Values.
Exemplo:
var
Lista1:TStringlist;
x:integer;
begin
Lista1:=TStringlist.Create;
for x:=1 to 5 do
begin
Lista1.Values['elemento'+inttostr(x)]:=inttostr(x*2);
end;
end;
Resultará em:
elemento1=2
elemento2=4
elemento3=6
elemento4=8
elemento5=10
Para acessar o valor de 'elemento3' basta executar:
Edit1.text:=Lista1.Values['elemento3'];
Que retornará a string '6'.
Pronto! Muito pratico não é mesmo?
Vamos então a um exemplo mais completo.
Para esse caso, criei duas funções:
function GetStringValue(svVar:string):Real;
procedure setStringValue(svVar:string;svValue:Real);
function GetStringValue(svVar:string):Real;
begin
Result:=StrtoFloat(CalcList.Values[svVar]);
end;
procedure setStringValue(svVar:string;svValue:Real);
begin
CalcList.Values[svVar]:=FloatToStr(svValue);
end;
A função GetStringValue retorna um valor convertido no tipo Real, de modo que podemos utilizar como totalizador, ou qualquer uso que desejar.
A função setStringValue cria/atribui um determinado valor a um elemento do Stringlist.
Exemplos:
setStringValue('total1',100); -> cria/atribui valor 100 a um elemento chamado total1
MinhaVariavelFloat:=GetStringValue('total1');-> atribui o 100 a MinhaVariavelFloat;
Agora incrementamos a variavel:
MinhaVariavelFloat:=MinhaVariavelFloat+20;
E atribuimos novamente ao elemento 'total1':
setStringValue('total1',MinhaVariavelFloat);
MinhaVariavelFloat:=GetStringValue('total1'); Resulta em 120
Espero que essas funções sirvam para você leitor, tanto quanto serviu pra mim.
Qualquer duvida, sugestão ou critica, fiquem a vontade para comentar.
Abaixo, o codigo fonte do nosso exemplo:
unit testa_strings_values0;
{$mode objfpc}{$H+}
interface
uses
LCLIntf, LCLType, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls, ComCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
calcular: TButton;
box_varlist: TComboBox;
box_operation: TComboBox;
Criar_variavel: TButton;
Edit_calcval: TEdit;
Edit_valor1: TEdit;
Edit_var1: TEdit;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Label10: TLabel;
Label11: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
ListBox1: TListBox;
Memo1: TMemo;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
procedure calcularClick(Sender: TObject);
procedure Criar_variavelClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
function GetStringValue(svVar:string):Real;
procedure setStringValue(svVar:string;svValue:Real);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
CalcList:TStringlist;
implementation
{$R *.lfm}
procedure TForm1.calcularClick(Sender: TObject);
var
V1,V2,V3:Real;
begin
Memo1.lines.add( 'Valor inicial...:'+CalcList.Values[box_varlist.Text]);
V1:=GetStringValue(box_varlist.Text);
V2:=StrToFloat(Edit_CalcVal.Text);
if box_operation.ItemIndex=0 then
begin
Memo1.lines.add('Valor a somar...:'+Edit_CalcVal.Text);
V3:=V1+V2;
end;
if box_operation.ItemIndex=1 then
begin
Memo1.lines.add('Valor a subtrair:'+Edit_CalcVal.Text);
V3:=V1-V2;
end;
setStringValue(box_varlist.Text,V3);
ListBox1.Items.Values[box_varlist.Text]:=FloatToStr(V3);
V1:=GetStringValue(box_varlist.Text);
Memo1.lines.add(' *-*-* Resultado='+FloatToStr(V1));
Memo1.lines.add(' ');
end;
function TForm1.GetStringValue(svVar:string):Real;
begin
Result:=StrtoFloat(CalcList.Values[svVar]);
end;
procedure TForm1.setStringValue(svVar:string;svValue:Real);
begin
CalcList.Values[svVar]:=FloatToStr(svValue);
end;
procedure TForm1.Criar_variavelClick(Sender: TObject);
begin
CalcList.Values[edit_var1.Text]:=edit_valor1.Text;
box_varlist.Items.Add(edit_var1.Text);
ListBox1.Items.Values[edit_var1.Text]:=edit_valor1.Text;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CalcList:=TStringlist.Create;
Memo1.lines.Clear;
box_operation.ItemIndex:=-1;
box_varlist.ItemIndex:=-1;
end;
end.
A tela do nosso programinha, deve ficar assim:
Download dos Fontes:
Faça o download dos fontes aqui
Até a próxima.
Assinar:
Postar comentários (Atom)
Muito bom seu artigo, parabens e obrigado pela aula. MarcioBR
ResponderExcluir