03. august 2004 - 16:23Der 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.
Der bliver investeret massivt i AI. Teknologien er mere tilgængelig end nogensinde, og ambitionerne er høje. Alligevel oplever mange virksomheder, at resultaterne udebliver.
Du kan i øvrigt se adskillige eksempler, efterladt af undertegnede, der netop beskriver hvordan man pakker data ind i klasser og bruger dem i TObjectList's.
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 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):
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;
// 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.
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;
Synes godt om
Ny brugerNybegynder
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.