Avatar billede blomme Nybegynder
04. august 2001 - 12:23 Der 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.

- Thomas
Avatar billede erikjacobsen Ekspert
04. august 2001 - 12:52 #1
Bruger du TList eller TStringList ??
Avatar billede blomme Nybegynder
04. august 2001 - 12:58 #2
Jeg bruger ikke noget specielt - hvis det er nemmer at lave det med TStringList, so be it :-)
Avatar billede erikjacobsen Ekspert
04. august 2001 - 13:01 #3
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.
Avatar billede blomme Nybegynder
04. august 2001 - 13:19 #4
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 ;-)
Avatar billede pellelil Nybegynder
04. august 2001 - 13:19 #5
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>
Avatar billede blomme Nybegynder
04. august 2001 - 13:31 #6
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 !

- Thomas
Avatar billede blomme Nybegynder
04. august 2001 - 13:37 #7
Hov ! Har lige prøvet dit eksempel igennem min OP Compiler, og den påstår at den ikke kender til noget objekt ved navn TObjectList (bruger Delphi4)

- Thomas
Avatar billede martinlind Nybegynder
04. august 2001 - 15:55 #8
TYPE

MyRec = record
  Navn  : String;
  Alder : Integer;
end;

VAR
 
  MyArr : Array of MyRec;
  Cnt : Integer;

begin
  SetLength(MyArr,100);
  for Cnt := 100 do
  begin
      MyArr[X].Navn := \'Svend Ferskenglad\'+IntToStr(Cnt);
      MyArr[X].Alder := Cnt;
  end;
end;

/Martin

PS. TObjectList er en D5 ting
Avatar billede martinlind Nybegynder
04. august 2001 - 15:56 #9
ups ! X = Cnt
Avatar billede cms Nybegynder
04. august 2001 - 16:20 #10
jeg har lavet et lille eksempel...

se på
www.innovision.it/www/DynamiskeArraysObjekter.zip

UI\'et er ikke så brugervenligt, men det er jo heller ikke pointen.
Der ligger to funktioner SaveToFile og LoadFromFile, håber de funker...
Avatar billede cms Nybegynder
04. august 2001 - 16:24 #11
hmm. Vi prøver lige en server, der fungerer...

www.eksperten.cnt.dk/DynamiskeArraysObjekter.zip
Avatar billede blomme Nybegynder
04. august 2001 - 16:57 #12
cms >> for at compile din kode, mangler jeg \"contnrs\" -
Avatar billede pellelil Nybegynder
04. august 2001 - 16:58 #13
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:

<SNIP>
  TMyTwoVariable = Class(TObject)
  private
    FVar1: String;
    FVar2: Integer;
  public
    property Var1: String read FVar1 write FVar1;
    property Var2: Integer read FVar2 write FVar2;
  end;
</SNIP>


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>
Avatar billede blomme Nybegynder
04. august 2001 - 17:00 #14
cms >> jeg mangler desværre unitten, \"contnrs\" for at compile - hvis du også er i besiddelse af denne ser det straks meget mere interessant ud :-)
Avatar billede blomme Nybegynder
04. august 2001 - 17:11 #15
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 ?

- Thomas
Avatar billede pellelil Nybegynder
04. august 2001 - 17:25 #16
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;

Constructor TMinGruppe.Create;
begin
  Inherited;
  FNavn := \'\';
  FEmner := TStringList.Create;
end;

Destructor  TMinGruppe.Destroy;
begin
  FreeAndNil(FEmner);
  Inherited;
end;
</SNIP>

Avatar billede cms Nybegynder
04. august 2001 - 20:00 #17
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.
Avatar billede cms Nybegynder
04. august 2001 - 20:43 #18
blomme >> du skal selvfølgelig også lige have puttet noget kode i savetostream-funktionerne. send mig en mail, så skal jeg hjælpe.
Avatar billede blomme Nybegynder
04. august 2001 - 22:09 #19
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 !

- Thomas
Avatar billede cms Nybegynder
05. august 2001 - 14:17 #20
Selvfølgelig :-)

cnt@cnt.dk
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