Hvis ikke du vil have det i et stringgrid, så lad være med at bruge stringgrid, det tager for meget hukommelse, brug hellere arrays. Her bliver der lavet et dynamisk array, dvs. et array der kan fyldes op til du brækker dig. Dvs. at fx MyArray[0][0] er ID og fx MyArray[0][1] er Varenavn.
var MyArray : array of array [0..1] of String;
Når du skal tilføje noget kan det gøres således, ved først at øge arrayet, da det er dynamisk, og så bagefter sætte S, som er teksten, ind på enten ID eller Varenavns plads (du må selv bestemme om det 0 eller 1 ID skal stå på, det gør ingen forskel):
procedure AddString(Valg : Integer, S : String); begin SetLength(MyArray, High(MyArray)+1); MyArray[High(MyArray)][Valg] := S; end;
procedure add(i: integer; t: string; begin inc(count); setLength(myArray,count); with myArray[count] do begin id:=i; vareTxt:=t; end; end;
begin //det her er pseudokode count:=0; find første vare while not vare.eof do begin add(varenr,vareTxt); next vare; end; msg('Dinne varer er nu i ram array.'); end.
constructor TVare.Create(aSt: string); var i : integer; bField : boolean; bString : boolean; StringList : TStringList;
function RemoveDelimiters(aSt : string) : string; begin result := copy(aSt,2,length(aSt)-2); end;
begin inherited Create;
StringList := TStringList.Create; // Parse strengen try repeat i := 1; bString := false; bField := false; while (i < length(aSt)) and not bField do begin if aSt[i] = StringDelimiter then bString := not bString;
if not bString then bField := aSt[i] = FieldDelimiter;
if bField then begin StringList.Add(copy(aSt,1,i-1)); delete(aSt,1,i); end; // if inc(i); end; // while until i = length(aSt); StringList.Add(aSt);
function TVareListe.Count: integer; begin result := fList.Count; end;
constructor TVareListe.Create(const aFileName: string); var fp : textfile; st : string; begin inherited Create; fList := TObjectList.Create;
assignfile(fp,aFileName); reset(fp); try while not eof(fp) do begin readln(fp,st); fList.Add(TVare.Create(st)); end; // while finally closefile(fp); end; // try end;
function TVareListe.GetVare(aIndex: integer): TVare; begin result := TVare(fList.Items[aIndex]); end;
I dit program kan du eksempelvis lave følgende:
var VareList : TVareListe; i : integer; begin VareList := TVareListe.Create('c:\varer.txt'); try for i := 0 to VareList.Count - 1 do lbVarer.Items.Add(VareList[i].Navn); // Læser vare i's navne-property finally VareList.Free; end; end;
Med fare for at jokke i spinaten igen, så er det den rette måde at gøre tingene på. TVare ved hvordan constructorens aSt skal håndteres og TVareListe åbner en fil og opretter så mange TVare objekter som der er linier i filen.
Du er blevet rådet til at arbejde med en TStringGrid - hvad med en TListView imed ViewStyle sat til vsReport. Det er bagefter også let eksempelvis at sortere listen efter de kolonner man klikker på. Jeg foretrækker klart TListView fremfor TStringGrid, en komponent som er blevet lavet under en mental blackout.
Bemærk, at det forudsættes at txt-filen er korrekt. Der er ingen fejlhåndtering.
Desuden så laver jeg en stor fejl i "fList := TObjectList.Create;". Den korrekte linie er: "fList := TObjectList.Create(true);" idet objekterne i listen, først nu, frigives. Beklager.
Lige endnu en rettelse. Der er ingen forskel om man opretter en TObjectList med eller uden Create(true). Hjælpeteksten påstår godtnok noget andet, men uanset hvad man gør, så frigiver listen tilsyneladende objekterne uden problemer.
Mht. StringList.CommaText, så kan jeg bekræfte at det virker. En lille ulempe er, at man ikke kan se om tal er tal eller en række tegn fordi anførselstegnene fjernes. Eksempelvis er kan man ikke se om 20041211 er et stort tal eller en streng der angiver en dato. Det havde været synligere med "20041211".
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.