![]() |
Auf ein dyn. Array innerhalb eines Objekts zugreifen??
Hi!
Ich habe ein Object mit definiert:
Delphi-Quellcode:
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?!!
type
TContainer = class(TObject) FileCount: LongWord; FileNames: Array of String; end; |
Hallo,
zum Anfang erst mal ein Tipp. Verwende nicht Array of String, sondern definiere als Eigenschaft
Delphi-Quellcode:
In Deinem Constructor fügst du dann erst mal ein:
FileNames : TStringList;
Delphi-Quellcode:
Der Zugriff auf deine Werte in der Stringliste mit Anfügen, löschen, suchen, sortieren .... fällt viel leichter.
FileNames := TStringList.Create;
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 |
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 :(
|
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:
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.
PMyItem = ^TMyItem;
TMyItem = Record MS : String; IS : Integer; end; . . . MyItem : PMyItem; . . . New(MyItem) MyItem^.ms := 'oki'; MyItem^.IS := 1; MyList.Add(MyItem); 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 |
Okay dann hast du mich jetzt überzeugt :D
|
Hi!
Also ich hab es jetzt so gedeichselt:
Delphi-Quellcode:
Ausführen tu ich es jetzt so:
type
TContainer = class(TObject) FileCount: LongWord; FileNames: Array of String; end; PContainer = ^TContainer;
Delphi-Quellcode:
Muss ich jetzt zu Programmende noch MyContainer mit FreeMem freigeben??
begin
New(MyContainer); MyContainer^.FileNames[1] := 'Test.dat'; end; |
Moin!
Zitat:
ciao, moin339 |
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:
-> irgentwo im Hauptprogramm:
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; ...
Delphi-Quellcode:
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
MyContainer := TContainer.MyCreate(5);
. . .
Delphi-Quellcode:
und so weiter.
procedure AddFileName(Name : String);
procedure TContainer.AddFileName(Name : String); begin NewFileAnz(FFileCount + 1); FFileNames[FFileCount - 1] := Name; end; Gruß oki |
:thuimb: Danke oki du bist mein Mann!!! :thuimb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz