Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz