03. august 2004 - 16:23
Der er
6 kommentarer og
1 løsning
Bedre måde at håntere data end TStrings
Jeg er i gang med et program, der skal håndtere en masse data. Før har jeg brugt ListBox's men har nu forsøgt mig med TStrings (jeg vil gerne have alle værdierne i variabler)... Men jeg har ikke andet en fejl ud af de TStrings.
Er der en bedre måde at lagre/håntere liste-data på? -Uden en masse komponenter.
På forhånd tak
05. august 2004 - 14:14
#4
Den simple udgave
procedure TForm1.Button1Click(Sender: TObject);
var
s : TStringList;
begin
s := TStringList.Create;
s.Values['GNR'] := 'The worlds greatets band';
s.Values['metallica'] := 'Way to overrated';
showmessage('What is Guns N Roses ?'+ #13#10#13#10 + s.Values['gnr']);
s.Free;
end;
Stoney
05. august 2004 - 17:33
#5
Guns'n'roses er også "overrated".
Stoney bruger det at man kan have et navn=værdistr, hvilket er ganske fikst, men man kan ikke ændre i værdistr uden der går kage idet. Man kan heller ikke oprette et navn og tilføje værdi bagefter. Fikst men begrænset.
Nu får du hele koden til et eksempel på hvordan man tilføjer et objekt til en nedarving af TStrings (og alt i Delphi er næsten en nedarving af denne):
unit FMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TPersonData = class
private
fNavn : string;
fAdr : string;
fPostNr : string;
fBy : string;
public
constructor Create(aNavn, aAdr, aPostNr, aBy : string);
property Navn : string read fNavn;
property Adr : string read fAdr;
property PostNr : string read fPostNr;
property By : string read fBy;
function GetTheLot : string;
end;
TfrmMain = class(TForm)
btnSetHans: TButton;
btnGetHans: TButton;
lbPersoner: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnSetHansClick(Sender: TObject);
procedure btnGetHansClick(Sender: TObject);
procedure lbPersonerClick(Sender: TObject);
private
fPersonListe : TStringList;
public
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
{ TPersonData }
constructor TPersonData.Create(aNavn, aAdr, aPostNr, aBy : string);
begin
inherited Create;
fNavn := aNavn;
fAdr := aAdr;
fPostNr := aPostNr;
fBy := aBy;
end;
function TPersonData.GetTheLot: string;
begin
result := format('%s, %s, %s %s',[fNavn,fAdr,fPostNr,fBy]);
end;
{ TfrmMain }
procedure TfrmMain.FormCreate(Sender: TObject);
begin
fPersonListe := TStringList.Create;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
fPersonListe.Free;
end;
procedure TfrmMain.btnSetHansClick(Sender: TObject);
Person : TPersonData;
begin
Person := TPersonData.Create('Hans Clausen','Kronborgvej 1','5000','Odense C');
fPersonListe.AddObject(Person.Navn,Person);
{ Hvilket svarer til nedenstående:
var
Index : integer;
begin
Index := fPersonListe.Add(Person.Navn);
fPersonListe.Objects[Index] := Person;
end;
}
end;
procedure TfrmMain.btnGetHansClick(Sender: TObject);
begin
// Kopierer PersonListe til et ListView, men kunne for den sags skyld ligeså godt
// have oprettet TPersonData direkte til lbPersoner og skippet fPersonListe - men
// så var det ikke blevet så pædagogisk.
lbPersoner.Items.Assign(fPersonListe);
end;
// Finder TPersonData igen når man klikker på en linie i TListBoksen.
procedure TfrmMain.lbPersonerClick(Sender: TObject);
var
Person : TPersonData;
begin
with (Sender as TListBox) do
if ItemIndex >= 0 then
Person := (Items.Objects[ItemIndex] as TPersonData);
// Var lidt i tvivl om Assign også kopierede vedhæftede objekter, men det gør den
if assigned(Person) then
MessageDlg(Person.Navn, mtWarning, [mbOK], 0);
end;
end.
Held og lykke..
05. august 2004 - 17:37
#6
Ang. teksten:
// Kopierer PersonListe til et ListView, men kunne for den sags skyld ligeså godt
// have oprettet TPersonData direkte til lbPersoner og skippet fPersonListe - men
// så var det ikke blevet så pædagogisk.
Egentlig havde jeg et loop der fandt Person fra listen og fyldte den over i listboksen sammen med et kald til Person.GetTheLot (= 'Hans Clause, Kronborgvej 1, 5000 Odense C) - glemte at slette teksten igen.
Bemærk at det med pædagogikken er så som så idet jeg har glemt at frigive de TPersonData objekter som jeg opretter. Det skyldes at jeg normalt arbejder med TObjektLister der automatisk sørger for den slags.
05. august 2004 - 17:44
#7
Ved frigivelse kan dette kode benyttes
procedure TfrmMain.FormDestroy(Sender: TObject);
var
i : integer;
begin
try
for i := 0 to fPersonListe.Count - 1 do
TPersonData(fPersonListe.Objects[i]).Free;
finally
fPersonListe.Free;
end;
end;