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
Seite 1 von 2  1 2   
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#1

vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 09:51
Ich hab einen Fehler, bei dem ich noch keinen (schnellen) Ansatz für die Fehlersuche habe.
Ich stelle hier mal die Frage, ehe ich die aufwendige Methode nutze und alle Komponenten entferne und nacheinander wieder einfüge. (noch unklar, türlich)

Ich habe eine VCL-Form mit einigen Komponenten/Funktionen. Diese soll als Basis für weitere dienen.
Als "echte" Komponente liegt auf der Form nur ein TTimer.
Weiterhin einige eigene Feldvariablen und Funktionen.
Interessant vielleicht noch
Delphi-Quellcode:
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    function CloseQuery: Boolean; override;
aber wirklich nicht wildes drin.

Jetzt erzeuge ich ein neues Formular (vererbt von dem ersten).
Mehr nicht.

Nun das Problem.

Wenn ich den Vorgänger offen habe, kann ich das abgeleitete Formular öffnen. Kompilieren, läuft alles.
Wenn ich das Vorgängerformular NICHT offen habe, kommt beim Öffnen des abgeleiteten Formulars dieser Fehler:

"Fehler beim Erzeugen von Formular: Abstrakter Fehler."

Ich klicke "ok" und das Formular öffnet sich.

Das gleich passiert auch, wenn ich Delphi schließe und beim Neustart BEIDE Formulare offen waren. (also sie wieder automatisch geöffent werden sollen). Nur dass dann sich der ganze IDE-Editor nicht öffnet.


Kennt das jemand? Hat schom mal jemand sowas gehat und ein Tipp für mich?
Sonst muss ich wohl mit einem neuen leeren Formular neu anfangen und nach jeder kleinen Änderung neu testen. Reichlich aufwendig.

Gruß Thomas
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.838 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 11:06
Zeig mal das Basisformular. Da fehlt imho ein "virtual"...
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 11:27
Delphi-Quellcode:
type
  TBasisView = class(TForm)
    TrackingTimer: TTimer;
    procedure TrackingTimerTimer(Sender: TObject);
  private
    FViewmodel : TsngViewmodel;
    FTrackingTimerTime : Cardinal;
    FOnTrackingTimer : TNotifyEvent;
    FHandleEnterAsOk : Boolean;
    FHandleEscAsCancel : Boolean;

    procedure RestartTrackingTimer;
  protected
    procedure edEnter(Sender: TObject);
    procedure edExit(Sender: TObject);
    procedure edKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure edEditChange(Sender: TObject);
    procedure edCheckboxChange(Sender: TObject);
    procedure edRadioChange(Sender: TObject);
    //procedure IsDialogKey(const Key: Word; const KeyChar: WideChar; const Shift: TShiftState;var IsDialog: boolean); override;
  public
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    function CloseQuery: Boolean; override;
// {$REGION 'function HandleDialogKey'}
// /// <summary>Behandelt zentral in der TForm Tastatureingaben.
// /// <para>MUSS in der abgeleiteten Form überschrieben werden!</para></summary>
// /// <returns>Boolean: Tastaturereignis abgehandelt ja/nein</returns>
// {$ENDREGION}
// function HandleDialogKey(const Key: Word; const KeyChar: WideChar; const Shift: TShiftState;var IsDialog: boolean): boolean; virtual;
    procedure Init; virtual;

    property Viewmodel : TsngViewmodel read FViewmodel write FViewmodel;
    property TrackingTimerTime : Cardinal read FTrackingTimerTime write FTrackingTimerTime;
    property OnTrackingTimer : TNotifyEvent read FOnTrackingTimer write FOnTrackingTimer;
    property HandleEnterAsOk : Boolean read FHandleEnterAsOk write FHandleEnterAsOk;
    property HandleEscAsCancel : Boolean read FHandleEscAsCancel write FHandleEscAsCancel;
  end;
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
mytbo

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

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 11: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
38.732 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 11: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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

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

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 12: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 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
135 Beiträge
 
#7

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 17: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: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: vererbtes Formular - abstrakter Fehler

  Alt 2. Feb 2021, 19: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 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.193 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: vererbtes Formular - abstrakter Fehler

  Alt 3. Feb 2021, 01:35
Interessant vielleicht noch
Delphi-Quellcode:
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    function CloseQuery: Boolean; override;
aber wirklich nicht wildes drin.
Inherited in den überschriebenen Methoden vergessen?

Edit: Ähm Lese grade, daß der Fehler nicht zur Laufzeit auftritt, sondern in der IDE. Dann ist es eigentlich egal, was im Quellcode des Formulars drin steht. Der kann ja erst Fehler produzieren, wenn Compiliert ist.

Ich verwende Vererbung von Forms und Frames ständig. Wenn ich ein neues Projekt starte, wird wie bei dir erst einmal ein TBaseForm angelegt. Alle Formulare werden davon abgeleitet. Habe noch nicht wirklich Probleme gehabt. Formvererbung ist eines der Coolsten Dinge überhaupt.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de

Geändert von bernau ( 3. Feb 2021 um 01:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.819 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: vererbtes Formular - abstrakter Fehler

  Alt 3. Feb 2021, 10:01
Kannst du mal die dproj-Datei des Projekts anhängen oder wenigstens die Einträge der beiden Forms zeigen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 04:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf