![]() |
Variablenname mehrere Typen
So, ich weiß nicht einmal wirklich, wie ich dieses Problem benennen soll (deswegen war meine Suche erfolglos)
Ich möchte folgendes: ich möchte einem Variablennamen je nach Bedarf zwei verschiedene Veriablentypen zuweisen. In meinem Fall würde ich je nach Bedarf dem Namen "MyPopupsource" - der Parent eines TPopupcomponents - entweder TLabel oder TPanel zuweisen. Ich könnte natürlich zwei ähnliche Prozeduren schreiben, aber ich möchte das elegant lösen. Leider finde ich im Internet und diesem Forum nichts vergleichbares, darum muss ich mich direkt and euch wenden. Jemand eine Idee? |
AW: Variablenname mehrere Typen
Wenn man das kleinsten gemeinsamen Teiler benutzt, dann geht alles.
Also einen Typen, von welchem beide Klassen erben. (ganz oben ist immer TObject und dazwischen liegt oft auch TComponent) Meistens nimmt man den kleinsten Typen, welcher die nötigen Funktionen implementiert. |
AW: Variablenname mehrere Typen
Zitat:
Delphi-Quellcode:
function Divide(x, y: real): real; overload;
begin result := x / y; end; function Divide(x, y: integer): integer; overload; begin result := x div y; end; ![]() |
AW: Variablenname mehrere Typen
Zitat:
Der am meisten spezialisierte gemeinsame Vorfahre von ![]() ![]() ![]() Zitat:
|
AW: Variablenname mehrere Typen
Quatsch gelöscht!
|
AW: Variablenname mehrere Typen
Die Fragestellung deutet auf ein verbesserungswürdiges Design hin. Beschreibe doch mal, weshalb Du deine Variable -je nach Anwendungsfall- unterschiedlich deklarieren willst.
|
AW: Variablenname mehrere Typen
Genau das löst sich ja mit dem gemeinsamen Vorfahren auf ... nur noch ein Code für diesen einen Vorfahren.
|
AW: Variablenname mehrere Typen
TControl ist der erste gemeinsame Vorfahr.
Jetzt stellt sich die Frage, auf welche Methoden und Eigenschaften will der TE zugreifen? Schon "Caption" gibt es noch nicht in TControl. Und ein Zugriff auf TLabel ohne die Nutzung der Caption stelle ich mir relativ sinnlos vor. Natürlich kann man ein Typecast machen. Aber dann muss man im Source ja doch wieder unterscheiden, was man gerade benutzen möchte. Der Vorteil ist futsch. Man muss sich also auch die Frage stellen, wie sinnvoll die Nutzung des gemeinsamen Vorfahren ist. Es kann durchaus sein, dass es dadurch komplizierter wird, als 2 Variablen mit unterschiedlichem Typ zu haben. Man verliert in einem gewissen Rahmen auch die Typsicherheit. Vielleicht lohnt es sich ja auch, eine eigene Komponente dafür zu programmieren. Diese kann ja von TLabel oder TPanel abgeleitet sein. Kommt halt drauf an, was besser zur Lösung der Aufgabe passt. |
AW: Variablenname mehrere Typen
Zitat:
|
AW: Variablenname mehrere Typen
Wieso?
Wenn das Feature bereits in dem Vorfahren drin ist, dann ist das praktisch DIE Lösung. |
AW: Variablenname mehrere Typen
TComponent als gemeinsamer Vorfahre funktioniert, prima. Danke!
Dabei find ich es merkwürdig, dass TControl oder TWinControl beide nicht funktionieren. So aus Neugier, weiß einer warum? Das mit dem Overload probiere ich gleich mal aus, klingt interessant. Zitat:
Ich Probier die Overload Direktive mal aus (nachdem ich herausfinde, wie sie funktioniert), vielleicht ist sie nützlich. |
AW: Variablenname mehrere Typen
Zitat:
|
AW: Variablenname mehrere Typen
Zitat:
Wenn es sich dagegen darum handelt, aus einer Basis-Klasse weitere spezialisierte Klassen abzuleiten (was ich angesichts deines Outings als Amateur eher nicht annehme), muß man das anders lösen, wie oben bereits von anderen Usern aufgezeigt. Nachtrag: Wenn du deine Methoden im Interface-Teil deklarierst, genügt es, dort die Direktive overload anzugeben. In diesem Falle kannst du sie im Implementation-Abschnitt weglassen:
Delphi-Quellcode:
Mit diesen beiden Proceduren kann ich entweder ein TjvRichEdit oder ein TjvDBRichEdit als Parameter angeben. Delphi wählt anhand der übereinstimmenden Parameter die richtige Procedure aus. Stimmen die übergebenen Parameter mit keiner der Overload-Versionen überein, gibt's eine Fehlermeldung beim Compilieren.
Interface
... Procedure SetMargin(Const RE: TjvDBRichEdit; Const L,R,T,B : Integer); overload; Procedure SetMargin(Const RE: TjvRichEdit; Const L,R,T,B : Integer); overload; ... Implementation // ----- Ränder bei DB-RichEdits setzen (DBRichEdit)-------- Procedure SetMargin(Const RE: TjvDBRichEdit; Const L,R,T,B : Integer); Var Rect : TRect; begin Rect := RE.ClientRect; Rect.Left := Rect.Left + L; Rect.Right := Rect.Right - R; Rect.Top := Rect.Top + T; Rect.Bottom := Rect.Bottom - B; SendMessage(RE.Handle,EM_SETRECT,0,LongInt(@Rect)); end; // ----- Ränder bei RichEdits setzen (RichEdit)------------- Procedure SetMargin(Const RE: TjvRichEdit; const L, R, T, B: Integer); Var Rect : TRect; begin Rect := RE.ClientRect; Rect.Left := Rect.Left + L; Rect.Right := Rect.Right - R; Rect.Top := Rect.Top + T; Rect.Bottom := Rect.Bottom - B; SendMessage(RE.Handle,EM_SETRECT,0,LongInt(@Rect)); end; |
AW: Variablenname mehrere Typen
Zitat:
|
AW: Variablenname mehrere Typen
Zitat:
TWinControl kann nicht funktionieren, da es kein gemeinsamer Vorfahre von TLabel und TPanel ist. Ob die Ableitung in Turbo Delphi anderst ist, dass kann ich leider nicht sagen. |
AW: Variablenname mehrere Typen
Zitat:
![]() Ich finde überladene Funktionen besonders für 2 verschiedene Sachen nützlich:
|
AW: Variablenname mehrere Typen
TJvCustomRichEdit :stupid:
Ein Vorfahre für beide Typen, der bestimmt alles Nötige enthält. Im Notfall kann man intern, für noch nicht sichtbare Property, welche in TJvRichEdit nur auf Published gesetzt werden, auch Beides hart nach TJvRichEdit casten, auch wenn es mal ein TJvDBRichEdit ist. (hier muß man halt nur bissl genauher drauf achten) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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