Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auf ein dyn. Array innerhalb eines Objekts zugreifen?? (https://www.delphipraxis.net/2903-auf-ein-dyn-array-innerhalb-eines-objekts-zugreifen.html)

phlux 12. Feb 2003 19:27


Auf ein dyn. Array innerhalb eines Objekts zugreifen??
 
Hi!
Ich habe ein Object mit definiert:
Delphi-Quellcode:
type
  TContainer = class(TObject)
                 FileCount: LongWord;
                 FileNames: Array of String;
               end;
Wenn ich jetz im Quellcode auf FileNames zugreifen will steht dort als Typ (in der Codeergänzung) ^Array of String. Ich weiß das ich da jetzt mit nem Pointer drauf zugreifen muss nur hab ich nicht die geringste Ahnung wie :?. Hilfe?!!

oki 12. Feb 2003 19:46

Hallo,

zum Anfang erst mal ein Tipp. Verwende nicht Array of String, sondern definiere als Eigenschaft
Delphi-Quellcode:
FileNames : TStringList;
In Deinem Constructor fügst du dann erst mal ein:
Delphi-Quellcode:
FileNames := TStringList.Create;
Der Zugriff auf deine Werte in der Stringliste mit Anfügen, löschen, suchen, sortieren .... fällt viel leichter.

Willst du unbedingt ein dynamisches Array verwenden, so schau in Deiner Hilfe unter "dynamische Arrays" oder "Array" mit Verweis auf dynamische Arrays nach. Währe dann aber alles recht umständlich.

Hier ein kurzer Leitfaden:

- Variable FileNames instanziieren mit SetLength,
- vor neuer Längendefinition vorhandene Werte retten (glaube ich),
- suchen etc. immer über Schleife usw.,

Das macht alles keinen richtigen Spaß und zusätzlich viel Schreibarbeit.

Also nehm lieber eine StringListe.

Gruß oki

phlux 12. Feb 2003 19:52

Ich will das gleiche aber auch noch mit Nummern vom typ Int64 machen :D das dass bei meinem Beispiel mit Strings einfacher ist sehe ich ein :lol: Aber Integer-Typen in ner StringList zu speicher find ich ziemlich unleet :(

oki 12. Feb 2003 20:05

Wurscht!

nehme Zeiger und eine TList!

hier mußt du auch ein bischen doktern und bist letztendlich auch nicht sehr viel besser dran als bei den Arrays, aber wenn du zusammengehörige Werte über mehrere Typen benötigst bringt es wieder was.

Bsp.:
Delphi-Quellcode:
 PMyItem = ^TMyItem;
 TMyItem = Record
   MS : String;
   IS : Integer;
 end;
.
.
.

MyItem : PMyItem;

.
.
.

New(MyItem)
MyItem^.ms := 'oki';
MyItem^.IS := 1;
MyList.Add(MyItem);
In Stringlisten kannst du auch Objekte speichern. Das gibt Dir die Möglichkeit an Hand des Stringeintrages einen Suchbezeichner zu Nutzen und im Objektteil alles mögliche abzulegen.
Aufwand/Nutzen muß natürlich berücksichtigt bleiben.

Wenns bei numerischen Werten bleibt wandel sie doch einfach in Strings um und leg sie in der Stringliste ab. Zurück umgekehrt.

Gruß oki

phlux 12. Feb 2003 20:12

Okay dann hast du mich jetzt überzeugt :D

phlux 12. Feb 2003 20:39

Hi!
Also ich hab es jetzt so gedeichselt:
Delphi-Quellcode:
type
  TContainer = class(TObject)
                 FileCount: LongWord;
                 FileNames: Array of String;
               end;
  PContainer = ^TContainer;
Ausführen tu ich es jetzt so:
Delphi-Quellcode:
begin
  New(MyContainer);
  MyContainer^.FileNames[1] := 'Test.dat';
end;
Muss ich jetzt zu Programmende noch MyContainer mit FreeMem freigeben??

moin339 12. Feb 2003 20:47

Moin!

Zitat:

Zitat von oki
- vor neuer Längendefinition vorhandene Werte retten (glaube ich)

Nein, wenn man ein array mit SetLength(meinArray, length(meinArray) + 1) vergrößert bleibt der alte "inhalt" erhalten

ciao, moin339

oki 13. Feb 2003 10:00

Hallo moin339,
stimmt, bei neuer Längendefinition wird das vorhandene Array mit neuer Länge in einen anderen Speicherbereich mit Inhalt kopiert (reserviert).

Jetzt für Phlux!

Also, ich schreibe es mal auf. (gott gebe, dass alles richtig ist)


Delphi-Quellcode:
type
  TContainer = class(TObject)
                 FFileCount: LongWord;
                 FFileNames: Array of String;
   public
      constructor MyCreate(FileAnz : LongWord);
      Destructor Destroy;
      procedure NewFileAnz(FileAnz : LongWord);
      property FileCount : LongWord read FFileCount;
end;

var MyContainer : TContainer

Constructor TContainer.MyCreate(FileAnz : Longword);
begin
   inherited create;
   NewFileAnz(FileAnz);
end;

Destructor TContainer.Destroy;
begin
  FFileNames := nil;
  inherited destroy;
end;

procedure TContainer.NewFileAnz(FileAnz : Longword);
begin
  SetLength(FFileNames, FileAnz);
  FFileCount := High(FFileNames)+1;
end;

...
-> irgentwo im Hauptprogramm:

Delphi-Quellcode:
   MyContainer := TContainer.MyCreate(5);
.
.
.
Ob Du jetzt weitere Parameter oder eigene Methode für die Übergabe Deiner Werte schreibst bleibt Dir überlassen. Praktisch ist hier zum Bsp. eine Methode

Delphi-Quellcode:
procedure AddFileName(Name : String);

procedure TContainer.AddFileName(Name : String);
begin
  NewFileAnz(FFileCount + 1);
  FFileNames[FFileCount - 1] := Name;
end;
und so weiter.

Gruß oki

phlux 13. Feb 2003 10:56

:thuimb: Danke oki du bist mein Mann!!! :thuimb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz