AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

vererbtes Formular - abstrakter Fehler

Ein Thema von t2000 · begonnen am 2. Feb 2021 · letzter Beitrag vom 3. Feb 2021
Antwort Antwort
mytbo

Registriert seit: 8. Jan 2007
483 Beiträge
 
#1

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 10:27
Jetzt erzeuge ich ein neues Formular (vererbt von dem ersten).
Ernstgemeinte Frage: Warum willst du hier überhaupt visuell vererben? Erzeuge alles per Quelltext in einem TBaseForm und ersetze in deinen Formularen TForm durch TBaseForm. Ganz früher ging das nicht, aber seit Delphi 2007 ist das kein Problem mehr.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 10:58
Vererben geht, man muß nur einiges Beachten.

* der Formdesigner geht bei Fehlern zu Mammi ... wenn er was nicht erkennt, dann springt er immer auf TForm zurück
* * z.B. wenn die TypInfos in DPR/DPROJ falsch sind -> der {Kommentar} in der der UNIT in der DPR, bzw. der daraus synchronisierte <FORM>-Eintrag in der DPROJ

* im FormDesigner wird bei FormVererbung niemals deine Klasse benutzt
* * selbst dann nicht, wenn du diesen Vorfahren in ein eigenes Package kompilierst und bei Delphi bekannt machst. (RegisterComponent und/oder RegisterClass)

* im DormDesigner wird eine "virtuelle" Klasse generiert und geladen (die heißt zufällig genau wie deine Klasse, aber die RTTI wird dynamisch zusammengebaut)
* * und die RTTI wird auch immer direkt von TForm geerbt, selbst wenn dein Vorfahre mehrere Ebenen hat (weitere Vorfahren zwischen deinem Typ und TForm/TCustomForm)
* * diese RTTI hat nur den gleichen Namen und vermutlich eine Kopie der "published" Felder/Methoden, aber ohne Inhalt/Code

* das ist auch der Grund, warum überschiebene Methoden im FormDesigner nicht aufgerufen werden und warum auch niemals die eigenen Property im ObjektInspektor angezeigt werden.

* das Einzige, was im FormDesigner wirklich "vererbt" wird, sind die DFMs, also es werden erst die Komponenten des/der Vorfahren geladen, aus deren DFMs, und darüber dann die Änderungen aus der DFM der aktuellen Form eingefügt







PS:
* bei vererbten Frames kommt es drauf an, wie die auf der Form liegen
* * als Vererbung über Objektablage reingezogen, bzw. über ProjektManager oder direkt aus der PAS mit dem Frame ... dann ist alles wie bei TForm
* * oder als registrierte Komponente ... hier ist es die echte Klasse und die hat dann auch alle Property im OI und überschriebene Methoden werden ausgeführt (in deinem geladenen Package)


Besonders merkt man sowas, wenn man eine abgeleitete Form hat
und eine eigenen Komponente, welche auf Methoden/Eigenschaften der Form zugreifen will, was im FormDesigner so nie direkt funktionieren kann, da der Owner dort eben eine "andere" Klasse ist ... merkt man auch daran, dass IS/AS hier sagen das passe nicht
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Feb 2021 um 11:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
249 Beiträge
 
Delphi 12 Athens
 
#3

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 11:22
So genau wusste ich das gar nicht. Danke. Das würde zumindest das eine oder andere Problem etwas erleuchten.

Ich bin schon kein großer Freund der visuellen Entwicklung, aber gibt es hierfür bessere Alternativen?
Es geht um mehrere Programme, die alle die gleiche Basisfunktionalität und das gleiche Design haben sollen. Weiterhin müssen wir ein an MVVM angelehntes Verfahren einsetzen, da wir VCL und FMX entwickeln müssen. Nicht zu 100% identisch, aber in vielen Teilen.
Die Form-Vererbung hat unter FMX bisher keine Probleme gemacht, aber nun ist eben VCL dran. (und daran führt kein Weg vorbei, DevExpress-Grid, Fastreport, und einige weitere spezielle Dinge)

Vielleicht versuche ich mal eine Technik auf Basis von TForm, die sich Prinzipien wie interfaces bedienen. Aber die ersten Prototypen werden wir wohl erstmal so (Vererbung) oder als Cut'n Copy versuchen.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
483 Beiträge
 
#4

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 16:32
Vielleicht versuche ich mal eine Technik auf Basis von TForm, die sich Prinzipien wie interfaces bedienen. Aber die ersten Prototypen werden wir wohl erstmal so (Vererbung) oder als Cut'n Copy versuchen.
Du suchst nach einer Lösung für ein Problem, das du mit der visuellen Vererbung selbst schaffst. Mehr als TrackingTimerTimer() zuzuweisen, machst du über den Objektinspektor nicht. Diese Zuweisung kann auch in einer von TForm abgeleiteten TBaseForm Klasse hardcodiert erledigt werden. Daher noch mal meine Frage: Warum willst du hier partout visuell vererben?

Ich definiere in einer Basis Unit eine Kaskade abgeleiteter Form-Klassen, von denen ich meine Formulare ableite. Dazu ist nur der Austausch von TForm gegen die gewünscht Klasse notwendig. Visuelle Vererbung wird dazu nicht benötigt. Ab Delphi 2007 ist dieses Vorgehen kein Problem mehr, nur ältere Versionen haben sich daran verschluckt.
Code:
TBaseForm = class(TForm)
TBaseLayoutForm = class(TBaseForm)
TBaseDataForm = class(TBaseLayoutForm)
...
Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
249 Beiträge
 
Delphi 12 Athens
 
#5

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 18:23
Du hast im Prinzip Recht. Dieses oben genannte Beispiel, bzw. kein Beispiel sondern die "echte" Basis wird nicht visuell gebaut.
Bisher (vorher) hatte ich aber noch ein paar mehr Formulare. U.a. das Basis-Mainform, welches eigene Kopfzeilen mit den typischen Windowsfunktionen , Statuszeile, usw. hat. Speziell dafür werde ich mir die Vererbung auch nochmal überlegen. Bei den anderen gehe ich wohl wieder auf eine Technik mit Frames. Die kann man schön zur Laufzeit kombinieren und einfach in die Fenster (Forms) einpflanzen. Das hat schon die letzten 20 Jahre mehr oder weniger schlecht geklappt. Aber die Probleme kenne ich wenigstens alle und es funktioniert letztendlich.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:09 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