Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Objekt incl. untergeordnete objecte (https://www.delphipraxis.net/149076-objekt-incl-untergeordnete-objecte.html)

DelTurbo 13. Mär 2010 16:47


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.....

DeddyH 13. Mär 2010 16:55

Re: Objekt incl. untergeordnete objecte
 
Kurz und knapp: von TPersistent ableiten und Assign/AssignTo überschreiben.

DelTurbo 14. Mär 2010 10:12

Re: Objekt incl. untergeordnete objecte
 
Zitat:

Zitat von DeddyH
Kurz und knapp: von TPersistent ableiten und Assign/AssignTo überschreiben.

Moin erstmal,

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

DeddyH 14. Mär 2010 12:02

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.

DelTurbo 14. Mär 2010 12:19

Re: Objekt incl. untergeordnete objecte
 
Zitat:

Zitat von DeddyH
Mal eben heruntergetippt, keine Garantie auf Fehlerfreiheit ;)

Wenn wir keine fehler machen würden, gäbe es keine Radiergummis. Soviel zu fehlern. ;)

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....

DelTurbo 14. Mär 2010 12:53

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:

DeddyH 14. Mär 2010 13:49

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.

DelTurbo 14. Mär 2010 15:26

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......

webcss 14. Mär 2010 15:27

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

DelTurbo 14. Mär 2010 15:39

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.

DelTurbo 14. Mär 2010 15:56

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.

ghost007 14. Mär 2010 16:19

Re: Objekt incl. untergeordnete objecte
 
Ich frag dich echt nur ungern, aber gibt es bei dir den Edit Button nicht? Bei mir schon ;)

DelTurbo 14. Mär 2010 16:23

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:

DeddyH 14. Mär 2010 17:07

Re: Objekt incl. untergeordnete objecte
 
Wenn ich so nachdenke, sind Hier im Forum suchenComposite Controls für Deine Belange vielleicht die bessere Wahl, oder?

DelTurbo 14. Mär 2010 17:29

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

DelTurbo 18. Mär 2010 17:04

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...

DeddyH 19. Mär 2010 07:44

Re: Objekt incl. untergeordnete objecte
 
Zum Auslesen könnte dieser Thread interessant sein: http://www.delphipraxis.net/internal...t.php?t=154890

DelTurbo 19. Mär 2010 13:58

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