| Autor |
Beitrag |
FrankTheFox
      
Beiträge: 51
|
Verfasst: Sa 24.05.08 15:19
Hallo,
mein Code
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: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Contnrs;
Type
TControlObjects = class(TObject) public Parent:TControlObjects; Children:array of TControlObjects; Data: TObject; MyProperties:integer; MyActions:integer; procedure Add(Obj: TControlObjects); end;
TForm1 = class(TForm) procedure FormShow(Sender: TObject); procedure FormDestroy(Sender:TObject);
private public end;
var Form1: TForm1; Form2: TForm; MyButton:TButton; MyButton2:TButton; CtrlObjs: TControlObjects;
implementation
{$R *.dfm}
procedure TControlObjects.Add(Obj: TControlObjects); begin SetLength(Children,High(Children)+1); Children[High(Children)]:=Obj; end;
procedure TForm1.FormDestroy(Sender:TObject); begin CtrlObjs.Free; end;
procedure TForm1.FormShow(Sender: TObject); begin
CtrlObjs.Create; MyButton.Create(self);
MyButton.Width:=111; MyButton.Height:=22; MyButton.Caption:='Knöpple'; MyButton.Visible:=true; self.insertcomponent(MyButton);
CtrlObjs.Data:=MyButton; MyButton2.Create(self); self.insertcomponent(MyButton); MyButton2:=CtrlObjs.Data as TButton; ShowMessage(inttostr(MyButton2.width));
end;
end. |
Ich versuche in der Klasse erzeugt Element TForm, TButton, TLabel, .... zu speichern.
Data soll dann das Object aufnehmen das gerade erzeugt wird z.B.: TForm (oder eben TButton) damit ich dann die Properties und Action auslesen kann.
MyProperties enthalt dann z.B. :=1+4+8+32 und ich weiß welche Properties gesetzt waren weil propWidth=1 propHeight=2 propCation=4 usw.
gleiches gilt dann für MyActions onClick=1 onDblClick=2 usw.
somit kann ich dann Infos über Forms rauschreiben z.B. in eine Datei.
Leider funktionert der obige Code nicht! Fehler: EAccessViolation in der Unit Projekt1 (wo steht Application.initialze....) beim end.
Irgendwas habe ich vergessen zu initialisieren, aber was?
Gruß
Franky
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 24.05.08 15:29
Hallo,
Erstmal erzeugt man Objekte so
Delphi-Quelltext 1:
| CtrlObjs := TControlObjects.Create; |
und zweitens muss du das Object initialisieren - am Besten im Constructor der Klasse:
Delphi-Quelltext 1: 2: 3: 4: 5:
| constructor TControlObjects.Create; begin inherited Create; Data := TObject.Create; end; |
Im Destruktor dann wieder freigeben.
_________________ We are, we were and will not be.
|
|
FrankTheFox 
      
Beiträge: 51
|
Verfasst: Sa 24.05.08 15:46
Neues Spiel altes Pech...
Ich habe den constructor eingefügt...
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: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Contnrs;
Type
TControlObjects = class(TObject) public Parent:TControlObjects; Children:array of TControlObjects; Data: TObject; procedure Add(Obj: TControlObjects); constructor Create; end;
TForm1 = class(TForm) procedure FormShow(Sender: TObject); procedure FormDestroy(Sender:TObject);
private public end;
var Form1: TForm1; Form2: TForm; MyButton:TButton; MyButton2:TButton; CtrlObjs: TControlObjects;
implementation
{$R *.dfm}
constructor TControlObjects.Create; begin inherited Create; Data := TObject.Create; end;
procedure TControlObjects.Add(Obj: TControlObjects); begin SetLength(Children,High(Children)+1); Children[High(Children)]:=Obj; end;
procedure TForm1.FormDestroy(Sender:TObject); begin CtrlObjs.Free; end;
procedure TForm1.FormShow(Sender: TObject); begin
CtrlObjs:=TControlObjects.Create; MyButton.Create(self);
MyButton.Width:=111; MyButton.Height:=22; MyButton.Caption:='Knöpple'; MyButton.Visible:=true; self.insertcomponent(MyButton);
CtrlObjs.Data:=MyButton; MyButton2.Create(self); self.insertcomponent(MyButton); MyButton2:=CtrlObjs.Data as TButton; ShowMessage(inttostr(MyButton2.width));
end;
end. |
Allerdings habe ich die AccessViolation jetzt bei MyButton.Create(self);
Schiet..
Gruß
Franky
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 24.05.08 15:48
MyButton := TButton.Create(Self) 
_________________ We are, we were and will not be.
|
|
FrankTheFox 
      
Beiträge: 51
|
Verfasst: Sa 24.05.08 16:11
Ok, vielleicht bin ich heute zu blöd, aber jetzt bekomme ich, wenn ich das Form schliesse eine
EIvalidPointer Exception
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: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Contnrs;
Type
TControlObjects = class(TObject) public Parent:TControlObjects; Children:array of TControlObjects; Data: TObject; fProperties:integer; fActions:integer; procedure Add(Obj: TControlObjects); constructor Create; destructor Destroy; end;
TForm1 = class(TForm) procedure FormShow(Sender: TObject); procedure FormDestroy(Sender:TObject);
private public end;
var Form1: TForm1; Form2: TForm; MyButton:TButton; MyButton2:TButton; CtrlObjs: TControlObjects;
implementation
{$R *.dfm}
constructor TControlObjects.Create; begin inherited Create; Data := TObject.Create; end;
destructor TControlObjects.Destroy; begin inherited Destroy; Data.free; end;
procedure TControlObjects.Add(Obj: TControlObjects); begin SetLength(Children,High(Children)+1); Children[High(Children)]:=Obj; end;
procedure TForm1.FormDestroy(Sender:TObject); begin ctrlobjs.Destroy; CtrlObjs.Free; end;
procedure TForm1.FormShow(Sender: TObject); begin
CtrlObjs:=TControlObjects.Create; MyButton:=TButton.Create(self);
MyButton.Width:=111; MyButton.Height:=22; MyButton.Caption:='Knöpple'; MyButton.Visible:=true; self.insertcomponent(MyButton);
CtrlObjs.Data:=MyButton; MyButton2:=TButton.Create(self); MyButton2:=CtrlObjs.Data as TButton; ShowMessage(inttostr(MyButton2.width));
end;
end. |
Gruß
Franky
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 24.05.08 16:28
Ich glaubem du solltest dir nochmal die Grundlagen anschauen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.FormDestroy(Sender:TObject); begin CtrlObjs.Free; end; |
und was soll das werden?
Delphi-Quelltext 1: 2: 3:
| CtrlObjs.Data := MyButton; MyButton2 := TButton.Create(self); MyButton2 := CtrlObjs.Data as TButton; | Du erzeugst einen Button, und weist danach diesem Button ein TObject zu. Wenn am Ende die Form versucht, den Button freizugeben, und da nur ein Object findet...ich weiß nicht, ob das gut geht...
Und das self.insertcomponent(MyButton); hab ich auch noch nicht gesehen. Kann sein, dass das was sinnvolles ist, aber iirc fehlt ein MyButton.Parent = Self oder etwas vergleichbares.
_________________ We are, we were and will not be.
|
|
|