Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Variablenname mehrere Typen (https://www.delphipraxis.net/185410-variablenname-mehrere-typen.html)

Antonov 8. Jun 2015 09:14

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:

Zitat von Perlsau (Beitrag 1304436)
Was findest du an overload unelegant? Mit der Direktive overload ist es möglich, zwei oder mehr Varianten einer Methode oder einer Routine zu schreiben:

Das setzt voraus, dass ich weiß was Overload ist. Ich bin Amateur, also entspannt euch :P
Ich Probier die Overload Direktive mal aus (nachdem ich herausfinde, wie sie funktioniert), vielleicht ist sie nützlich.

Popov 8. Jun 2015 09:23

AW: Variablenname mehrere Typen
 
Zitat:

Zitat von Antonov (Beitrag 1304476)
Ich Probier die Overload Direktive mal aus (nachdem ich herausfinde, wie sie funktioniert), vielleicht ist sie nützlich.

Das ist einfach: die Prozedur oder Funktion muss gleichen Namen haben, muss sich aber bei den Parametern unterscheiden. Dann muss die Prozedur oder Funktion noch mit der Direktive Overlaod deklariert werden. Meiner Kenntnis nach, ich hab es aber nicht getestet, müssen sich die Parameter unterscheiden. Unterschiedliche Ergebnisse bei Funktionen reichen meiner Kenntnis nach nicht aus.

Perlsau 8. Jun 2015 09:23

AW: Variablenname mehrere Typen
 
Zitat:

Zitat von Antonov (Beitrag 1304476)
Das mit dem Overload probiere ich gleich mal aus, klingt interessant.
Zitat:

Zitat von Perlsau (Beitrag 1304436)
Was findest du an overload unelegant? Mit der Direktive overload ist es möglich, zwei oder mehr Varianten einer Methode oder einer Routine zu schreiben:

Das setzt voraus, dass ich weiß was Overload ist. Ich bin Amateur, also entspannt euch :P
Ich Probier die Overload Direktive mal aus (nachdem ich herausfinde, wie sie funktioniert), vielleicht ist sie nützlich.

Overload ist der Fachausdrück für Überladen. Du kannst eine Routine oder eine Methode (also eine Procedure oder eine Function) überladen. Das bedeutet, daß Delphi je nach Zusammensetzung der Parameter die jeweils richtige Routine auswählt. In obigem Beispiel wird einmal ein Integer übergeben und ein Integer im Result zurück erwartet. Rufst du also die Funtion mit Integer-Variablen auf, wählt Delphi die Integer-Variante. Analog verhält sich das mit der Real-Variante. Probier's doch einfach mal aus – dein PC wird davon schon nicht kaputtgehen, vertrau mir :cyclops:

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:
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;
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.

himitsu 8. Jun 2015 09:46

AW: Variablenname mehrere Typen
 
Zitat:

Zitat von Antonov (Beitrag 1304476)
Dabei find ich es merkwürdig, dass TControl oder TWinControl beide nicht funktionieren. So aus Neugier, weiß einer warum?

Nee, da du es wohl für ein Staatsgeheimnis hältst und uns nicht verraten willst, was nicht funktioniert. :roll:

BadenPower 8. Jun 2015 11:21

AW: Variablenname mehrere Typen
 
Zitat:

Zitat von Antonov (Beitrag 1304476)
Dabei find ich es merkwürdig, dass TControl oder TWinControl beide nicht funktionieren. So aus Neugier, weiß einer warum?

In Delphi müßte TControl gehen.

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.

BUG 8. Jun 2015 12:03

AW: Variablenname mehrere Typen
 
Zitat:

Zitat von Perlsau (Beitrag 1304482)
Mit diesen beiden Proceduren kann ich entweder ein TjvRichEdit oder ein TjvDBRichEdit als Parameter angeben.

Obwohl ich mich fragen würde, ob die beiden Klassen nicht schon einen gemeinsamen Vorfahren mit der Handle-Proberty haben ... zum Beispiel TWinControl. Dann könntest du den doppelten Code komplett loswerden. Ansonsten könnte das Berechnen das Rects extrahieren.

Ich finde überladene Funktionen besonders für 2 verschiedene Sachen nützlich:
  1. nicht verwandte Typen mit ähnlicher/gleicher Semantik (z.B. unterschiedliche Zahlentypen)
  2. spätere Spezialisierung von Funktionen (z.B. im Visitor)

himitsu 8. Jun 2015 12:47

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 12:09 Uhr.
Seite 2 von 2     12   

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