Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Generics TForm (https://www.delphipraxis.net/214678-generics-tform.html)

Stefan1286b 20. Feb 2024 19:38

Delphi-Version: 11 Alexandria

Generics TForm
 
Guten Abend.
Ich versuche gerade Generics mit Ableitungen von TForm insbesondere im Form Designer hinzubekommen.

Folgendes Beispiel:

Unit1
Delphi-Quellcode:
type
TForm1 = class(TForm)  // DFM:  object Form1: TForm1

end;

TForm2<T> = class(TForm1)
public
 A: T;
 B: T;

end;
Unit3
Delphi-Quellcode:
type
TForm3 = class(TForm2<Integer>)

end;

TForm4 = class(TForm3)  // DFM:  inherited Form4: TForm4

end;
Das scheint allerdings alleine deswegen schon nicht zu funktionieren, da es wohl nicht möglich ist das sich zwischen TForm4 und TForm1 eine Klasse befindet die keine DFM hat.
Aber DFM untersützt anscheinend keine Generics.

Jemand eine Idee?

himitsu 20. Feb 2024 20:05

AW: Generics TForm
 
Du hast natürlich auch eine DFM-Ressource, welche wirklich
Delphi-Quellcode:
'TForm2<Integer>'
heißt?

Weiß garnicht, ob < und > in Resourcenbezeichnern erlaubt sind (glaub aber fast nicht dran).

Uwe Raabe 20. Feb 2024 21:34

AW: Generics TForm
 
Das würde auch nicht gehen, wenn man eine Klasse
Delphi-Quellcode:
TForm2Integer = class(TForm2<Integer>)
dazwischen schaltet. Generics werden bei visueller Formvererbung einfach nicht unterstützt.

Rollo62 21. Feb 2024 06:12

AW: Generics TForm
 
Du kannst aber einen eigenen TForm-Interposer bauen, der dann deine eigenen Funktionen mit hereinbringt.
Wenn man es nicht übertreibt, dann bleibt die neue TForm auch ganz normal im Designer verfügbar, es muss nur deine Unit z.B. "FMX.Form.Interposer" immer hinter dem normalen FMX.Form eingebunden werden, damit das neue TForm verwendet wird.

Das geht natürlich für VCL genauso wie für FMX.

Delphi-Quellcode:
unit FMX.Form.Interposer;

interface

Uses
  FMX.Form;


type
  TForm = class( FMX.Form.TForm )

      procedure MeineTolleFunktion;

  end;

jaenicke 21. Feb 2024 06:56

AW: Generics TForm
 
Ich hätte dafür nie Bedarf, denn die generische Funktionalität gehört zur Formularlogik, nicht zum Formular selbst. Wenn man das entsprechend trennt, hat man das Problem auch nicht.

Es gibt viele Möglichkeiten, z.B. kann man dem Formular eine Property geben, die vom Typ der Basisklasse für die generischen Ableitungen ist, so dass man die dort reinpacken kann. Dann kann das Formular darauf zugreifen. Umgekehrt kann man auch einen TMyFormController<T> verwenden, der das Formular steuert und sich in dessen veröffentlichte Events einklinkt. Für neue Implementierungen ist eher die zweite Variante interessant, die erste, wenn man bestehende Funktionalität auslagern möchte.

himitsu 21. Feb 2024 09:17

AW: Generics TForm
 
Da im FormDesigner eh immer nur eine generische Dummy-Klasse von TForm verwendet wird, welche "bloß" so wie deine Form-Klasse heißt, und nicht der originale Typ, sind eh keine Published-Property der Vorfahren, sowie überschriebene "Ereignisse" (Create/Loaded/...), im Designer sichtbar bzw. aktiv ... egal welche Art der Vererbung.

Und soll die Form im Designer bearbeitbar oder im Code via Create erstellbar sein, dann müssen alle Vorfahren bis/nach TForm eine DFM-Ressource gleichen Namens besitzen.


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