AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Übergabe eines nicht instanziierten Objektes als Parameter
Thema durchsuchen
Ansicht
Themen-Optionen

Übergabe eines nicht instanziierten Objektes als Parameter

Offene Frage von "Nico93"
Ein Thema von Nico93 · begonnen am 14. Mai 2012 · letzter Beitrag vom 15. Mai 2012
Antwort Antwort
Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#1

Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 14. Mai 2012, 13:29
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
Nico
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 14. Mai 2012, 13:34
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#3

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 14. Mai 2012, 13:35
Hab ich schon versucht, dann bekomme ich das gar nicht mehr compiliert, da Delphi dann irgendwas von wegen 'inkompatible Typen' oder so meckert.
Nico
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.131 Beiträge
 
Delphi 12 Athens
 
#4

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 14. Mai 2012, 13:36
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.
TComponentClass = class of TComponent
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (14. Mai 2012 um 13:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 14. Mai 2012, 13:37
dbedtTest := Function2(Parameter) as TDBEdit;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 14. Mai 2012, 14:38
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;
Andreas
  Mit Zitat antworten Zitat
grenni999

Registriert seit: 17. Apr 2008
7 Beiträge
 
#7

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 14. Mai 2012, 14:56
Hi!

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

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.

Prozedur2(Atyp:string; var Adbedt:TDbEdit; var Abtn:TButton, Atop,Aleft:Integer)
grüsse grenni
  Mit Zitat antworten Zitat
Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#8

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 15. Mai 2012, 13:29
@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!?
Nico
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.131 Beiträge
 
Delphi 12 Athens
 
#9

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 15. Mai 2012, 13:36
Ohh, dann verwende stattdessen TWinControl und TWinControlClass.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Nico93
Nico93

Registriert seit: 6. Sep 2011
Ort: Grafschaft
48 Beiträge
 
Delphi 2007 Architect
 
#10

AW: Übergabe eines nicht instanziierten Objektes als Parameter

  Alt 15. Mai 2012, 13:58
Ok vielen Dank für die Hilfen
Nico
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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