Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Funktion als Generic - wie? (https://www.delphipraxis.net/199424-funktion-als-generic-wie.html)

exasoft 22. Jan 2019 18:14

Funktion als Generic - wie?
 
Hi @ALL,
hab mal bissi mit generics rumprobiert und wollte mal testweise eine Funktion umstellen - bekomme es aber nicht hin:

Wenn ich zB:
Delphi-Quellcode:
function TForm1.getY_TEdit(Sender: TObject; AMaster: TLayout): single;
var
stufe: integer;
begin
  Result := 0;
  stufe := 0;

  if tedit(sender).Parent = AMaster then
    stufe := 1...
umstellen wollte, habe ich das so versucht:

Delphi-Quellcode:
function TForm1.getY<T>(Sender: TObject; AMaster: TLayout): single;
var
stufe: integer;
begin
  Result := 0;
  stufe := 0;

  egal, was ich hier versuche - ich kann nicht auf ".Parent" zugreifen bzw. da wird gemeckert.
Ich möchte zB TEdit aber auch TMemo, TComboEdit, etc. mitgeben. Hab da bestimmt noch nen Denkfehler. Jemand nen Tipp?

Tks vorab..

de schorsch

Der schöne Günther 22. Jan 2019 18:24

AW: Funktion als Generic - wie?
 
Generics sind erst einmal völlig generisch - Da kann alles rein. Und nicht alles hat
Delphi-Quellcode:
.Parent
.

Deshalb müssen wir hingehen und sagen: "Ok, alles jetzt nicht, aber bitte alles was ein
Delphi-Quellcode:
TControl
ist
."

Einschränkungen für Generics formuliert man mit einem Doppelpunkt, z.B. so:
Delphi-Quellcode:
function TForm1.getY<T: TControl>(Sender: TObject; AMaster: TLayout): single;
Von da an kannst du in deiner Methode auf alles zugreifen was ein TControl hat. Und wenn du die Methode aufrufst kann der Compiler sicherstellen dass du auch ein TControl reinstecken musst, sonst macht das alles wenig Sinn. Es sähe dann also eher so aus:
Delphi-Quellcode:
function TForm1.getY<T: TControl>(Sender: T; AMaster: TLayout): single;


Lesestoff: http://docwiki.embarcadero.com/RADSt...isierte_Typen)

Ganz verstanden was du wirklich willst habe ich allerdings nicht. Leute neigen oft dazu Generics als eine Lösung für alles mögliche anzusehen, obwohl Generics hier überhaupt nichts helfen.

Auf einem Formular kann man sich wahnsinnig tolle Hilfsfunktionen bauen wie z.B. "Gib mir alles auf dem Formular was ein T ist" und ich kann für T einfach
Delphi-Quellcode:
TEdit
einsetzen und bekomme als Rückgabe ein Array mit allen Edit-Felder auf dem Formular. Oder alle Buttons. Oder was auch immer.

exasoft 22. Jan 2019 18:33

AW: Funktion als Generic - wie?
 
Hey, do solltest Bücher scheiben - das habe sogar ich verstanden.

Tks!

exasoft 22. Jan 2019 18:41

AW: Funktion als Generic - wie?
 
das funktioniert so aber nicht - da meckert er.

Ich möchte im Prinzip aus einigen "Edit-Controls" im jew. onEnter eine "globale" Funktion aufrufen an die ich "Sender" übergebe. In der Funktion möchte ich auf "Sender.Parent" zugreifen ohne eben den "Sender" abfragen zu müssen "if Sender.ClassType = TEdit... - da dachte ich, dass das vielleicht mit generics geht, weil ja alle entspr. Kompos .Parent haben.

DeddyH 22. Jan 2019 18:45

AW: Funktion als Generic - wie?
 
Wieso übergibst Du dann nicht direkt TControl als Sender-Type? Generics braucht man dafür nicht.

exasoft 22. Jan 2019 18:46

AW: Funktion als Generic - wie?
 
Also so:

Delphi-Quellcode:
function TfrmMain.getY<T>(Sender: TObject; AMaster: TLayout): single;
begin

end;
wirds wenigstens kompiliert - und so stehts auch irgendwie im Buch nur, wie behandel ich jetzt <T>?

exasoft 22. Jan 2019 18:53

AW: Funktion als Generic - wie?
 
uups, da habe ich mir wohl die falsche Funktion als Testfunktion ausgesucht. Klar einfach als TControl übergeben ist viel einfacher in dem Fall. Uralter Code. Mich interessiert es halt - deswegen probiere ich jetzt noch bissi rum..

Tks..

DP-Maintenance 22. Jan 2019 22:24

Dieses Thema wurde am "22. Jan 2019, 22:24 Uhr" von "Luckie" aus dem Forum "Programmieren allgemein" in das Forum "Object-Pascal / Delphi-Language" verschoben.

Rollo62 23. Jan 2019 08:03

AW: Funktion als Generic - wie?
 
Vielleicht hilft dir das weiter ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 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