Avatar billede thecokeguy Nybegynder
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
Avatar billede borrisholt Novice
03. august 2004 - 16:31 #1
brog Tobject / Tclasslist
Avatar billede borrisholt Novice
05. august 2004 - 13:48 #2
Sover du ?
Avatar billede hrc Mester
05. august 2004 - 13:57 #3
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.

Eksempelvis her: http://www.eksperten.dk/spm/505203
Avatar billede stoney Nybegynder
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
Avatar billede hrc Mester
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..
Avatar billede hrc Mester
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.
Avatar billede hrc Mester
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;
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester