04. august 2001 - 12:23Der er
18 kommentarer og 2 løsninger
Dynamiske arrays i praksis
Nu har jeg efterhånden læst og spurgt så meget om disse dynamiske arrays, men lige lidt hjælper det. Jeg kan simpelthen bare ikke forstå hvordan det fungererer i praksis - om det er fordi jeg er dum eller fordi jeg simpelthen har ledt de forkerte steder lader vi stå som et ubesvaret spørgsmål. Derfor anmoder jeg om en venlig sjæls hjælp til at tyde min menneskelige anmodning og omsætte det til noget nyttigt kode:
Lad os nu sige at denne kode skal kunne beherske grupper og emner. Emnerne er naturligvis nogle der hører ind under grupperne således:
Gruppe 1 Emne 1 Emne2 Gruppe 2 Emne 1
Dette er nemt at lave hvis man ved at der er 2 grupper og henholdsvis to og et emne, men hvis antallet af grupper og antallet af emner er ubestemt kommer problemet. Algoritmen/funktionen/rutinen skal derfor kunne håndtere at der kommer ekstra emner på eller at der ryger en gruppe, og at det hele kan hentes og gemmes.
De 600 point udloddes til den, der giver mig et fyldestgørende svar på min forespørgsel - jeg vil også helt klart blive gladest for en kodestump, der viser hvordan det fungerer.
Det er \"måden\" at gøre det på i Delphi. Rene tekster med TStringList, og hvis du skal have et ukendt antal TStringList så bare en TList. Man skal lige vide hvad objekter, klasser og referencer er.
Er det noget du kunne tænke dig at give et svar på refererenede til subj. cont. ? Jeg er bekendt med hvad objekter, klasser og referencer er, men har sovet lidt i timen, da jeg læste om subj. (har faktisk aldrig læst det) - det er derfor jeg anmoder om en venlig sjæl, der evt. ville skrive mig lidt kode ;-)
Med hensyn til DynamiskeArray\'s så er der egentlig kun 3 ting du skal vide: Low, High og SetLength. De 2 først nævte giver dig henholdvis \"nummeret\" på det første og det sidste element i array\'et og SetLength benytter du til at sætte størrelsen på arrayet.
Følgende funktion Addere et eller flere strenge til en streng (mellem hvert element en \"adskilelse\" i form af szSeperator. Den eller de strenge der skal tilføjes overføres som et \"array of string\". <SNIP> Function AddElements(szElements : String; szSeperator : String; aszNewElements : Array of String) : String; var iIdx : Integer; szElement : String; begin Result := szElements; if High(aszNewElements) > 0 then begin for iIdx := 0 to High(aszNewElements) do begin szElement := BTrim(StripStr(aszNewElements[iIdx], szSeperator)); if length(szElement) > 0 then begin if not IsBlank(Result) then Result := Result + szSeperator; Result := Result + szElement; end; end; end; end; </SNIP>
Når dette er sagt så ville jeg i dit tilfælde IKKE bruge dynamiske arrays. Jeg ville i stedet (alt efter Delphi version) anvende TObjectList til at have indeholde dine \"Grupper\". De elementer jeg så indsætter i denne liste ville igen være TStringList (eller TObjectList) indeholdende de Emner der hører til den enkelt gruppe. <SNIP> var Grupper: TObjectList; Emner: TStringList; begin Gruppe := TObjectList.Create; Emner := TStringList.Create; Emner.Add(\'Emne1\'); Emner.Add(\'Emne2\'); Gruppe.Add(Emner); Emner := TStringList.Create; Emner.Add(\'Emne1\'); Gruppe.Add(Emner); end; </SNIP>
Tak for svaret, pellelil ! Jeg ville egentlig straks acceptere svaret, men håbede på at jeg måske kunne få dig til at svare på nogle få spørgsmål inden da :-)
For mig synes det som om, man ikke kan ændre på hvor mange emner og hvilke der er når først de er kommet ind i TObjectList\'en. Jeg har brug for både at kunne ændre på de forskellige, men også for at kunne gemme og hente det fra en fil.
En anden ting jeg glemte i farten er, at TStringList\'en helst skulle pege til en record af 2 variabler eller noget. Jeg skal i hvert fald have 2 strings med hvert emne -
Håber du/I kan hjælpe mig med dette - efter dette har jeg ikke andre skjulte spørgsmål og pointene bliver endelig frigivet !
blomme> TObjectList er \"forholdsvis ny\" så det passer nok med at den kom i Delphi 5 (eftersom du ikke har den i Delphi4). Du kan også bruge en \"alm.\" TStringList da denne har en methode der hedder: \"function AddObject(const S: string; AObject: TObject): Integer;\". Når du vil have fat i de objecter som listen indeholder så bruger du blot propertien: \"property Objects[Index: Integer]: TObject;\".
Personligt bruger jeg stor set ikke records mere da jeg hellere vil lave en class da den giver mig mulighed for at tilføje de methoder jeg (evt.) måtte få brug for. Ligeledes så \"skjuler\" jeg somregel class\'ens variabler og så laver properties til disse, så jeg ville derfor vælge noget i retning af:
Denne classe kan nu bruges sammen med en TStringList på flg. måde: <SNIP> var List: TStringList; MyTwoVariable: TMyTwoVariable; begin List := TStringList.Create; //--- Skriv --- MyTwoVariable := TMyTwoVariable.Create; MyTwoVariable.Var1 := \'Emne1\'; MyTwoVariable.Var2 := \'1\'; List.AddObject(MyTwoVariable.Var1, MyTwoVariables); MyTwoVariable.Var1 := \'Emne2\'; MyTwoVariable.Var2 := \'2\'; List.AddObject(MyTwoVariable.Var1, MyTwoVariables); //--- Læs --- MyTwoVariables := List.Objects[0]; Label1.Caption := MyTwoVariable.Var1; Label2.Caption := IntToStr(MyTwoVariable.Var1); end; </SNIP>
pellelil >> dette svar ser straks mere interessant ud :-) jeg har rettet lidt til hist og her, men har stadigvæk 2 anker.
Denne linie ||: MyTwoVariable := List.Objects[0]; :|| kan min compiler absolut ikke lide ;-) Udover det, kan jeg heller ikke se hvor overskrifterne er blevet af, altså grupperne. Denne rutine sørger jo kun for at emnerne fungerer ?
Prøv at typecast den <SNIP> MyTwoVariable := TMyTwoVariable(List.Objects[0]); </SNIP>
Med hensyn til grupperne så ville jeg lave en classe til disse: <SNIP> TMinGruppe = TClass private FNavn: String; FEmner: TStringList; public Constructor Create; Destructor Destroy; property Navn: String read FNavn write FNavn; property Emner: TStringList read FEmner; end;
blomme >> bare fjern unitet fra uses-listen, så virker det. det var fordi jeg først lavede eksemplet med tobjectlist, så kom jeg i tanker om at du havde d4, og så ændrede jeg alle tobjectlist til tlist men glemte at fjerne contnrs.
Så virker det jo helt perfekt, cms ! Rigtig mange gange tak :-) Idet mit spørgsmål nu er besvaret, er der vel ikke andet for end gladeligt at overføre pointene til din konto (pellelil får 100 af dem som tak for entusiasmen) - håber stadigvæk du er villig til at hjælpe mig, hvis der evt. er mere end gemme- og hente procedurerne jeg skulle have problemer med at løse selv !
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.