![]() |
Vererbung bei Formularen
Hallo,
ich habe mir eine neue Form angelegt. Diese Form habe ich angelegt, weil alle Element die sich auf dieser Form befinden immer wieder auftauchen. Jetzt wollte ich weitere Formulare davon erben lassen. Wenn ich mein Projekt kompiliere, dann wird mir aber die MainForm angezeigt und nicht die Form die ich eigentlich habe will. Was kann ich dagegen tun?
Delphi-Quellcode:
LG Chris
Application.Initialize;
Application.CreateForm(TFMainForm, FMainForm); // Hauptformular Application.CreateForm(TFMain, FMain); // erbt vom Hauptformular Application.Run; |
Re: Vererbung bei Formularen
|
Re: Vererbung bei Formularen
Hallo,
ich bins nochmal!!! Wenn ich in meiner Mutterklasse funktionalitäten implementiere, dann sollte das doch auch in den Nachfolgern funktionieren oder? Das tut es bei mir aber leider nicht. Was habe ich falsch gemacht? Hier mein Code:
Delphi-Quellcode:
unit UMainForm;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TFMainForm = class(TForm) bgTop: TImage; bgBottom: TImage; bgBorderLeft: TImage; bgBorderRight: TImage; bgIcon: TImage; LCaption: TLabel; bgMinimize: TImage; bgExit: TImage; procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure Minimize(Sender: TObject); procedure Exit(Sender: TObject); private Point : TPoint; Down : Boolean; { Private-Deklarationen } public { Public-Deklarationen } end; var FMainForm: TFMainForm; implementation uses Types; {$R *.dfm} procedure TFMainForm.Exit(Sender: TObject); begin FMainForm.Close; end; procedure TFMainForm.FormCreate(Sender: TObject); begin FMainForm.DoubleBuffered:=True; end; procedure TFMainForm.Minimize(Sender: TObject); begin Application.Minimize; end; procedure TFMainForm.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Point.X:=X; Point.Y:=Y; Down:=True; end; procedure TFMainForm.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Down = True then begin FMainForm.Left:=Mouse.CursorPos.X - Point.X; FMainForm.Top:=Mouse.CursorPos.Y - Point.Y; end; end; procedure TFMainForm.MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Down:=False; end; end. |
Re: Vererbung bei Formularen
Welches ist denn dein Mutterformular? Dein Code
Delphi-Quellcode:
leitet von TForm ab - und ich glaube nicht, dass dies schon irgendwelche Funktionalitäten von dir besitzt.
TFMainForm = class(TForm)
|
Re: Vererbung bei Formularen
Delphi-Quellcode:
Spätestens wenn es um Vererbung geht, solltest du die Benutzung der hässlichen globalen Formvariablen unterlassen - ruft eine abgeleitete Klasse diesen Code auf, wird nicht ihre eigene Close-Methode aufgerufen, sondern die der (wahrscheinlich gar nicht erstellten) globalen Mainform-Instanz.
procedure TFMainForm.Exit(Sender: TObject);
begin FMainForm.Close; end; |
Re: Vererbung bei Formularen
Hallo,
ich rufe von der abgeleiteten Klasse nichts auf. Ich dachte mir das es alleine gemacht wird. Hier meine abgeleitete Klasse:
Delphi-Quellcode:
Wie will man denn sonst das Fenster schließen oder die Form veschieben.
unit UPatients;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, UMainForm, StdCtrls, ExtCtrls, Grids, DBGrids, Buttons; type TFPatients = class(TFMainForm) DBGrid1: TDBGrid; B1: TBitBtn; B2: TBitBtn; B3: TBitBtn; B4: TBitBtn; B5: TBitBtn; B6: TBitBtn; B7: TBitBtn; B8: TBitBtn; private { Private-Deklarationen } public { Public-Deklarationen } end; var FPatients: TFPatients; implementation {$R *.dfm} end. |
Re: Vererbung bei Formularen
Nur den PAS-Quelltext abzuändern ist zu wenig ! Forms sind Spezialfall, weil sie aus zwei Teilen bestehen. Es geht deshalb so nicht, weil die dazugehörige DFM nichts von den Änderungen mitbekommt. Deine DFM der "ageleiteten" Form beginnt mit OBJECT, stimmts ? Oder fehlt die sogar ganz ? Das ist einer der Fehler. Da muss INHERITED stehen. Aber das ist noch längst nicht alles. Ich sage es gleich : eine DFM und eine PAS von Hand synchron zu halten, das ist sehr sehr fehlerträchtig und keinesfalls zu empfehlen !
Was soll denn so etwas ?
Delphi-Quellcode:
Das geht mit fast allem, aber eben nicht so einfach bei Forms. Ich will ja schließlich auf der vererbten Form z.B. auch Buttons verschieben können. Die eine Zeile erzeugt aber eben keine DFM oder verwaltet die. Delphi hat für Form-Vererbung deshalb die Objektablage. Schiebe mal die Form die vererbt werden soll da rein (rechter Mausklick auf Form). Erstelle die nächste Form, die als Basis die vorher haben soll so : Datei -> Neu -> weitere Irgendwo ist jetzt die Form, die vorher in die Objektablage verschoben wurde. Notfalls alle Registerkarten durchgucken. Sobald gefunden, unten in der vertikalen RadioGroup "vererben" aktivieren und fertig. Auf die Form können dann in diesem Fall die BitButtons draufgepappt werden. Natürlich kann man das Spielchen weiter treiben und die Form mit den BitButtons auch in die Objektablage schieben. Für die dritte hätte man dann falls nötig auch schon die BitButtons auf der Form usw.
TMyForm = class (TForm);
Noch ein Hinweis für die DFM-Handverunstalter. :mrgreen: Damit so etwas recht einfach geht, also im Prinzip nur : Datei -> Neu -> weitere und schon ist die vorgefertigte Form mit geerbten Eigenschaften da, dafür verwendet Delphi eine *.DRO Datei. Ab D2005 ist es eine im XML-Format. Selbst wenn einer zuviel Zeit hat und die Vererbung überflüssigerweise selbst im Quelltext macht, dann soll er auch an die DRO denken. Eventuell sind sogar noch mehr Dateien beteiligt. P.S.: bei mir ist alles von zwei Basisforms hierarchich abgeleitet. Die eine dient für Eingaben, die andere für Ausgaben. Die Basisforms enthalten im Prinzip Tastatur/Maussteuerung und einige Gestaltungsmerkmale (z.B. Farbeinstellungen). Mit jeder Vererbungsstufe kommt dann irgendwas dazu oder wird geändert. D.h. heißt, selbst bei einer Änderung, die für jedes Formular gelten soll, es reicht die entsprechende Basisform zu ändern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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