| Autor |
Beitrag |
FrankTheFox
      
Beiträge: 51
|
Verfasst: Di 20.05.08 12:24
Hi,
wenn ich per Code TControls bzw. TcxControls erzeugen will, kann ich das über
...Create(self) oder Create(Mein_spezielles_TForm)
wenn ich aber dann über die Controls, die ich erzeuge zsaätliche Attibute (die sie so nicht bestitzen) wie z.B: idX...
speichern will, wie mache ich das am besten ? Über einen dynamischen Array auf einen Record z.B.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ... type TcxControlsRec = Record Control: TWinControl; idX : String; DateCreated: String; End;
arrTcxControlsRec := Array of TcxControlsRec; ... |
als verkettte Liste....?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| ... type TcxControlsRec = Record Control: TWinControl; idX : String; DateCreated: String; End; pTcxControlsList = ^TcxControlList; TTcxControlsList = record data:TcxControlsRec; next:pTcxControlsList; end; ... |
oder mit TObjectList (hier fehlen mir aber Delphiprogrammiererfahrung...wäre also schön ein Beispiel zu bekommen)?
Also der Sinn ist k Controls zu erzeugen und dann Infos über die Controls zu speichern, und diese dann auch über deren eigene Attribute anzusprechen!!!!
Gruß
Franky
|
|
FrankTheFox 
      
Beiträge: 51
|
Verfasst: Mi 21.05.08 12:13
Titel: Hab 'mal ein Beispiel....
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| ... Type TMyObjects = class(TObjectList) public idX: integer; Author: String; Location: String; end; ... |
Deklaration
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| ... var Form1: TForm1; MyObjects: TMyObjects; MyButton:TButton;
... |
dann in z.B. FormShow...
Delphi-Quelltext 1: 2: 3: 4: 5:
| ... MyObjects.Create; MyObjects.idX:=1002; MyObjects.add( MyButton); ... |
erzeugt aber einen Fehler "EAccessViolation" sobald ich mit MyObjects arbeite.
Weiß jemand warum?
Muss ich noch was beachten?
Gruß
Franky
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Mi 21.05.08 12:46
Objekte werden so erzeugt:
Delphi-Quelltext 1:
| MyObject := TMyObjects.Create; |
Du versuchst eine Funktion von einem noch nicht erzeugten Objekt aufzurufen, daher
bekommst du die "EAccessViolation".
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 21.05.08 12:46
MyObjects.Create; bringt dir nix, du versuchst die Methode Create eines Objekts aufzurufen, das du noch gar nicht erzeugt hast. Du musst ein Objekt des Typs erzeugen und in deine Variable tun: MyObjects := TMyObjects.Create;
|
|
FrankTheFox 
      
Beiträge: 51
|
Verfasst: Do 22.05.08 06:47
Derzeit habe ich das so gemacht
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ... Type TMyObjects = class (TObjectList) public idX: integer; Location: String; end;
TForm1 = class(TForm) ... |
und dann...
Delphi-Quelltext 1: 2: 3: 4:
| Var Form1: TForm; MyObjects: TMyObjects; ... |
um dann ...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure TForm1.FormShow(Sender: TObject); Var MyButton: TButton; Begin MyButton:=TButton.Create(Self); MyButton.Caption:='Knöppi'; MyButton.Top:=10; MyButton.Left:=10; MyButton.Width:=100; MyButton.Height:=20; MyButton.Parent:=self; MyButton.OnClick:=Buttonlick;
Self.InsertComponent(MyButton);
MyButton:=TButton.Create(Self); MyButton.Caption:='Knöpple'; MyButton.Top:=10; MyButton.Left:=30; MyButton.Width:=100; MyButton.Height:=20; MyButton.Parent:=self; MyButton.OnClick:=Buttonlick;
Self.InsertComponent(MyButton); MyObjects:=TMyObjects.Create; MyObjects.idX:=1002; MyObjects.Location:='D:\....'; MyObjects.add(MyButton);
end; |
und dann die Ereignissmethode
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.ButtonClick(Sender: TObject); begin if Sender is TButton then begin if TButton(Sender).Caption = 'Knöppi' Then ....
if TButton(Sender.Caption = 'Knöpple' Then .... TButton(Sender).DoSomething;
end;
end; |
aber wie ordne ich denn nun die idX genau einem Button zu, weil ich glaube (...war vielleicht auch schon spät gestern...),
das ich so nicht genau einem Button eine idX zuordnen kann, oder sehe ich dass falsch?
Ich blick im Augenblick da nicht mehr so durch.
Gruß
Franky
|
|
Silas
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Do 22.05.08 07:10
Morgen,
jede Komponente hat eine Tag-Eigenschaft, die sich beliebig verwenden lässt. Da sie ein 32-Bit Integer ist, kannst du sie einfach als Pointer zweckentfremden:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| unit MyUnit;
interface
uses ...
type PMyObjAttributes = ^TMyObjAttributes TMyObjAttributes = record MyAttribute1: Integer; MyAttribute2: Double; MyAttribute3: String; end;
...
implementation
procedure TMyForm.FormCreate(Sender: TObject); var PAttrStruct: PMyObjAttributes; begin GetMem(PAttrStruct, sizeof(TMyObjAttributes)); MyButton.Tag := Integer(PAttrStruct); end;
procedure TMyForm.MyButtonClick(Sender: TObject); begin with PMyObjAttributes(MyButton.Tag)^ do begin ShowMessage(MyAttribute3); MyLabel.Caption := IntToStr(MyAttribute1); end; end;
procedure TMyForm.OnDestroy(Sender: TObject); begin FreeMem(PMyObjAttributes(MyButton.Tag)); end; |
Die Buttons kannst du natürlich auch in ein Array packen und dann in einer Schleife durchlaufen.
Mit Klassen statt Records ist das Ganze noch etwas einfacher, wenn du möchtest, kann ich dir dazu auch ein Beispiel geben. 
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
FrankTheFox 
      
Beiträge: 51
|
Verfasst: Do 22.05.08 07:57
Hi,
das mit der Tag Eigenschaft ist cool.
Ich hatte mir schon sowas überlegt
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type TFormComponent class(TObject) idX: integer; location:string; end;
TComponentList = class(TObjectList) private function GetComponent(index: integer): TFormComponent; public poperty Items[Index: integer]:TFormComnponent; read GetComponent; end; |
aber ich weiss nicht ob das so schlau ist und zuviel Overhead bedeutet und sich dann etliche Fehlerquellen
einschleichen können. Weil mit dem Tag Prop. müsste das ja einfacher gehen.
Gruß
Franky
|
|
Silas
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Do 22.05.08 08:17
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
FrankTheFox 
      
Beiträge: 51
|
Verfasst: Do 22.05.08 09:21
Hi,
ich kann die Tag-Eigenschaft nicht benutzen, weil sie anderweitig verwendet werden soll.
Also muß ich das anders machen. Ich hatte auch schon an einen Record gedacht, aus dem ich dann einen Array mache, denn ich dann dynamisch erweitere. Aber nach Möglichkeit soll ich eine ObjectList nutzen. Ich krieg 'nen Vogel!
Gruß
Franky
|
|
Silas
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Do 22.05.08 09:38
FrankTheFox hat folgendes geschrieben: | | Ich kann die Tag-Eigenschaft nicht benutzen, weil sie anderweitig verwendet werden soll. |
Dann musst du eben auf die Object-List-Möglichkeit zurückgreifen, oder du speicherst den Wert, den die Tag-Eigenschaft eigentlich haben soll, ebenfalls in deinem Record / deiner Klasse.
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
FrankTheFox 
      
Beiträge: 51
|
Verfasst: Do 22.05.08 13:32
Hi,
ich denke ich gehe ganz anders ran! Da ich die Controls (T....) ja dynamisch erzeugen will (vielleich aus einer XML Datei)
kann ich mir für alle Controls eine Klasse bauen....
also mein Versuch...
speichere Struktur zur Laufzeit...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| ...TDesignTimeObject = class Children: array of TDesignTimeObject; Parent: TDesignTimeObject; Typ: String; idX: integer; end; ... |
dann habe ich ja pro Control unterschiedliche Attribute die ich so dann jeweils einbinden kann
wie z.B.:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| ...
TAttrCxControl = class (TDesignTimeObject) private public property Height: integer; property Width: integer;
end;
... |
ich weiß aber nicht ob das so wirklich helle ist, da ich ja dann für jedes Control eine Klasse definieren muß.
Ich hatte schon gedacht, die Attributlisten dynamisch an die Klasse TDesignTimeObject zu binden, aber mir fallen da nur Interfaces ein... Aber ob ich Interfaces... hua.
Attibutlisten sind dann ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| ... Width :Integer; Height:Integer; Caption:String; Tag:integer; Top:Integer; ... |
in den Klassen.
Gruß
Franky
|
|