Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Übergabe eines nicht instanziierten Objektes als Parameter (https://www.delphipraxis.net/168296-uebergabe-eines-nicht-instanziierten-objektes-als-parameter.html)

Nico93 14. Mai 2012 13:29

Übergabe eines nicht instanziierten Objektes als Parameter
 
Hallo Zusammen,
leider habe ich mal wieder ein kleines Problemchen.

Es sollen relativ viele Komponenten zur Laufzeit innerhalb einer Prozedur erzeugt werden.
Da ziemlich viel Platz für die Zuweisung der Attribute zu den einzelnen Komponenten drauf geht, war die Idee eine "universelle Prozedur" zu erstellen, der einfach die Parameter der zu erstelleden Komponente übergeben werden und diese Komponente dann in der Prozedur erstellt wird.

Beispiel:
Code:
class = .....
   private
     btnTest: TButton;
     dbedtTest: TDbEdit;

..........

implementation


Prozedur1()
begin
  Prozedur2('dbedt',dbedtTest,nil,50,50);
  Prozedur2('btn',nil,btnTest,50,50);

end;

Prozedur2(typ:string; dbedt:TDbEdit; btn:TButton, Atop,Aleft:Integer)
begin
   if typ = 'dbedt' then
   begin
     dbedt := TDbEdit.Create(Self);
     dbedt.top := ATop;
     dbedt.left := ALeft;
   end;
   if typ = 'btn' then
   begin
     btn := TButton.Create(Self);
     btn.top := ATop;
     btn.left := ALeft;
   end;
end;
Das Ganze funktioniert vom Prinzip her auch, jedoch bekomme ich eine Zugriffsverletzung soblad ich später versuche auf die Komponente z.B. dbedtTest zuzugreifen. Ich habe auch schon versucht die Prozedur2 als funktion mit einem Rückgabewert zu gestalten, sodass z.B. TDbEdit zurückgegeben wird und somit direkt dem dbedtTest zugewiesen wird, was auch funktioniert Bsp.: dbedtTest := Function2(Parameter);.
Jedoch kann ich ja immer nur eine "Art" von Rückgabewert festlegen, also nur TDbEdit oder TButton, sodass ich dann also für jede Komponente eine eigene Funktion erstellen müsste, was den Code nicht gerade übersichtlicher macht.

Hat hierzu jemand eine Idee oder eine guten Ratschlag, wie ich das Problem so elegant wie möglich lösen kann?

Vielen Dank für die Hilfe schonmal im Vorraus.

Gruß Nico

DeddyH 14. Mai 2012 13:34

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
Zitat:

Jedoch kann ich ja immer nur eine "Art" von Rückgabewert festlegen, also nur TDbEdit oder TButton, sodass ich dann also für jede Komponente eine eigene Funktion erstellen müsste, was den Code nicht gerade übersichtlicher macht.
Wieso gibst Du nicht TComponent zurück?

Nico93 14. Mai 2012 13:35

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
Hab ich schon versucht, dann bekomme ich das gar nicht mehr compiliert, da Delphi dann irgendwas von wegen 'inkompatible Typen' oder so meckert.

himitsu 14. Mai 2012 13:36

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
Delphi-Quellcode:
procedure Prozedur2(CompType: TComponentClass; out Component: TComponent; Top, Left: Integer);
begin
  Component := CompType.Create(Self);
  Component.Top := Top;
  Component.Left := Left;
  if CompType = TButton then begin
    // etwas, welches nur für TButton gilt
  end;
  if CompType is TButton then begin
    // etwas, welches nur für TButton und Nachfahren gilt
  end;
end;


Prozedur2(TButton, btn, 50, 50);
TComponent ist der Vorfahr für alle VCL-Componenten.
Man könnte aber auch was anderes verwenden, welches Alle gemeinsam haben, wie z.B. TCustomEdit für TMemo, TEdit und TRichEdit.

TComponentClass ist ein Klassenzeiger für TComponents, worin man also Typen von TComponentnachfahren ablegen kann.
Delphi-Quellcode:
TComponentClass = class of TComponent

DeddyH 14. Mai 2012 13:37

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
Delphi-Quellcode:
dbedtTest := Function2(Parameter) as TDBEdit;

shmia 14. Mai 2012 14:38

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
Was du vielleicht suchst ist ein sog. Builder.
Delphi-Quellcode:
TControlBuilder = class(TObject)
public
  function CreateControl(c:TControlClass):TControl;
  function CreateButton(p:TPoint; Caption:string):TCustomButton;
  function CreateLabel(p:TPoint; Caption:string):TCustomLabel;
  ...


  property Owner:TComponent;
  property Parent:TControl;
end;

grenni999 14. Mai 2012 14:56

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
Hi!

Also ungetestet würde ich sagen, versuchs mal mit var-Parametern

Delphi-Quellcode:
Prozedur2(typ:string; var dbedt:TDbEdit; var btn:TButton, Atop,Aleft:Integer)
ohne var ist die Variable quasi routinenlokal, d.h. die Zuweisung der Instanz wird nicht nach aussen an deine Variable weitergereicht.
-> ich versehe die Parameter immer mit einem Prefix (auf Arbeit bei mir immer ein 'A'), damit kann ich auf einen Blick sagen ob die Variable übergeben wurde, oder ein Member ist.

Delphi-Quellcode:
Prozedur2(Atyp:string; var Adbedt:TDbEdit; var Abtn:TButton, Atop,Aleft:Integer)

grüsse grenni

Nico93 15. Mai 2012 13:29

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
@himitsu

ich habe die Version so gerade ausprobiert, nur leider erhalte ich die die Meldung, dass Component gar keine Attribute "top,left" etc. enthält!?

himitsu 15. Mai 2012 13:36

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
Ohh, dann verwende stattdessen TWinControl und TWinControlClass.

Nico93 15. Mai 2012 13:58

AW: Übergabe eines nicht instanziierten Objektes als Parameter
 
Ok vielen Dank für die Hilfen :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 Uhr.

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