![]() |
Ü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:
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);.
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; 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 |
AW: Übergabe eines nicht instanziierten Objektes als Parameter
Zitat:
|
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.
|
AW: Übergabe eines nicht instanziierten Objektes als Parameter
Delphi-Quellcode:
TComponent ist der Vorfahr für alle VCL-Componenten.
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); 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
|
AW: Übergabe eines nicht instanziierten Objektes als Parameter
Delphi-Quellcode:
dbedtTest := Function2(Parameter) as TDBEdit;
|
AW: Übergabe eines nicht instanziierten Objektes als Parameter
Was du vielleicht suchst ist ein sog.
![]()
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; |
AW: Übergabe eines nicht instanziierten Objektes als Parameter
Hi!
Also ungetestet würde ich sagen, versuchs mal mit var-Parametern
Delphi-Quellcode:
ohne var ist die Variable quasi routinenlokal, d.h. die Zuweisung der Instanz wird nicht nach aussen an deine Variable weitergereicht.
Prozedur2(typ:string; var dbedt:TDbEdit; var btn:TButton, Atop,Aleft:Integer)
-> 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 |
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!? |
AW: Übergabe eines nicht instanziierten Objektes als Parameter
Ohh, dann verwende stattdessen TWinControl und TWinControlClass.
|
AW: Übergabe eines nicht instanziierten Objektes als Parameter
Ok vielen Dank für die Hilfen :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 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 by Thomas Breitkreuz