![]() |
Objekt incl. untergeordnete objecte
Huhu,
ich frage mal anders. Ich möchte zur laufzeit ein Objekt mit all seinen untergeordneten kopieren. Wie geht das??? Und wie greife ich danach auf diese kopierten objekte zu? Danke im voraus..... |
Re: Objekt incl. untergeordnete objecte
Kurz und knapp: von TPersistent ableiten und Assign/AssignTo überschreiben.
|
Re: Objekt incl. untergeordnete objecte
Zitat:
sowas habe ich auch schon gelesen. Aber nirgends ein brauchbare beispiel gefunden. So ein 3zeiler mit einem unterobjekt würde mir waaahnsinnig helfen, wenn einer so nett wäre. Danke |
Re: Objekt incl. untergeordnete objecte
Mal eben heruntergetippt, keine Garantie auf Fehlerfreiheit ;)
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type //simuliertes Unterobjekt TDummyData = class private FString: string; FInteger: integer; public property StringVal: string read FString write FString; property IntVal: integer read FInteger write FInteger; end; //Klasse mit Kopierfunktion TBaseDummy = class(TPersistent) private FDummy: TDummyData; public constructor Create; destructor Destroy; override; //Überschreiben von AssignTo procedure AssignTo(Dest: TPersistent); override; property Dummy: TDummyData read FDummy; end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; Image1: TImage; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } FTest1, FTest2: TBaseDummy; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TBaseDummy } procedure TBaseDummy.AssignTo(Dest: TPersistent); begin //wenn Dest ein TBaseDummy ist, Werte kopieren if Assigned(Dest) and (Dest is TBaseDummy) then begin TBaseDummy(Dest).Dummy.StringVal := FDummy.StringVal; TBaseDummy(Dest).Dummy.IntVal := FDummy.IntVal; end else inherited AssignTo(Dest); end; constructor TBaseDummy.Create; begin inherited; FDummy := TDummyData.Create; end; destructor TBaseDummy.Destroy; begin FDummy.Free; inherited; end; procedure TForm1.Button1Click(Sender: TObject); begin //aktuelle Werte des 2. Objektes anzeigen ShowMessage(Format('%s: %d',[FTest2.Dummy.StringVal,FTest2.Dummy.IntVal])); end; procedure TForm1.Button2Click(Sender: TObject); begin //Werte kopieren FTest2.Assign(FTest1); end; procedure TForm1.FormCreate(Sender: TObject); begin FTest1 := TBaseDummy.Create; FTest1.Dummy.StringVal := 'Erster String'; FTest1.Dummy.IntVal := 1; FTest2 := TBaseDummy.Create; FTest2.Dummy.StringVal := 'Zweiter String'; FTest2.Dummy.IntVal := 2; end; procedure TForm1.FormDestroy(Sender: TObject); begin FTest1.Free; FTest2.Free; end; end. |
Re: Objekt incl. untergeordnete objecte
Zitat:
Vielen vielen dank für deine hilfe. Ich finde so ein beispiel sagt immer mehr aus, als 20 antworten. Nochmal, danke... ich mach mir mal ein testprg. Rückmeldung kommt.... |
Re: Objekt incl. untergeordnete objecte
Liste der Anhänge anzeigen (Anzahl: 1)
So,
das mit deinem kopieren klappt. Aber was ich im moment nicht verstehe ist, wie ich eine fertige groupbox kopiere. Ich habe es dir mal als project angehängt, um zu veranschaulichen was ich meine. Die GroupBox1 ist nicht Visible. Und die möchte ich incl. inhalt kopieren, und die kopie würde dann einfach Visible gemacht. Wie ich dann auf die inhalte der Edits zugreife, habe ich anhand deines beispiels verstanden. Blos leider nicht wie ich die Objekte die mit der IDE gemacht wurden kopiere. Halt so das alles erhalten bleibt. Positionen, Fontfarbe usw... Danke schomal im voraus.... PS.: Dein beispiel ist fehlerfrei :thumb: |
Re: Objekt incl. untergeordnete objecte
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei ein kleines Beispiel. Je nach Anspruch muss die AssignTo-Methode dann noch ausgebaut werden.
|
Re: Objekt incl. untergeordnete objecte
Danke, damit komm ich nun klar. Nun kann ich es an meine bedürfnisse anpassen, bzw. begreifen.
Vielen vielen dank nochmal...... |
Re: Objekt incl. untergeordnete objecte
Kannst du auch mit RTTI machen, ganz generisch:
Delphi-Quellcode:
procedure assign(Source: TPersistent);
... case Proptype of tkInt: SetIntProp(self, Propname, GetIntProp(source, propname)); tkClass: TPersistent(GetObjectProp(self, Propname)).Assign(GetObjectProp(source, PropName)); .... end; //case .... end; //assign |
Re: Objekt incl. untergeordnete objecte
Hmmm, eine "dumme" frage hätte ich da noch. Wie komme ich bei der kopie an den inhalt der EditObjekte? Ich dachte mit Grp2.Edit1.Text. Aber so geht es leider nicht.
|
Re: Objekt incl. untergeordnete objecte
Was mir noch aufgefallen ist, man muss ja alle geänderten Attribute (Eigenschaften, z.b. TLabel.Autosize) "zu fuss" setzen. :cry:
Trotzdem vielen dank für die hilfe. So habe ich wieder was dazu gelernt was ich nicht wusste. |
Re: Objekt incl. untergeordnete objecte
Ich frag dich echt nur ungern, aber gibt es bei dir den Edit Button nicht? Bei mir schon ;)
|
Re: Objekt incl. untergeordnete objecte
Das weiss ich, aber da war es schon zu spät. Ich hatte es 2x offen und nicht aufgepasst. Kann passieren. Die MySQL vom Board wird dadurch nicht beschädigt :zwinker:
|
Re: Objekt incl. untergeordnete objecte
Wenn ich so nachdenke, sind
![]() |
Re: Objekt incl. untergeordnete objecte
Hmm, jo, sehe ich mir an. Ich dachte es geht so einfach wie ein .Free. Also wenn ich zur laufzeit objekte erstelle die in einem, auch zur laufzeit erstellen, TabSheet liegen reicht ja ein TabSheet.Free und alles ist weg.
Nun dachte ich es gibt sowas wie z.b. TabSheet.Copy um es mal platt zu sagen. Tut mir leid wenn ich dir zeit geklaut habe. Aber ich danke dir das du mir geholfen hast. Gruss |
Re: Objekt incl. untergeordnete objecte
Hi,
mal als rückmeldung. Ich mache das nun so wie in deiner Demo. Also quasi "zu fuss". Ich habe Panels wo ich meinen kram drauflege und sauber ordne, der Panelinhalt wird dann kopiert. Ich habe mir überlegt, vielleicht hat man irgendwann mal eine unit die alles kopieren kann :zwinker: Öhm, eine möglichkeit in einer schleife die eigenschaften eine objects auslesen gibt es wohl nicht, oder? Nochmal danke für deine hilfe... |
Re: Objekt incl. untergeordnete objecte
Zum Auslesen könnte dieser Thread interessant sein:
![]() |
Re: Objekt incl. untergeordnete objecte
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
super vielen dank. Das klappt soweit ganz gut. Blos ich/man kann 3 sachen nicht kopieren. Da meckert er rum. Constraints Font PopupMenu und natürlich den namen. Das mit dem Namen leuchtet mir ein. Aber warum z.b. Font nicht geht verstehe ich nicht. Anbei mal mein kleines DemoProg. Vielleicht fällt dir ja was ein. Gruss und danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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