Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Vererbung bei Formularen (https://www.delphipraxis.net/100107-vererbung-bei-formularen.html)

Christian18 22. Sep 2007 13:21


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:
  Application.Initialize;
  Application.CreateForm(TFMainForm, FMainForm); // Hauptformular
  Application.CreateForm(TFMain, FMain);         // erbt vom Hauptformular
  Application.Run;
LG Chris

Muetze1 22. Sep 2007 13:38

Re: Vererbung bei Formularen
 
Es wird immer nur automatisch die MainForm angezeigt. Alle anderen Formulare musst du selber explizit anzeigen lassen (siehe Delphi-Referenz durchsuchenShow, Delphi-Referenz durchsuchenShowModal, Delphi-Referenz durchsuchenHide). Und MainForm ist immer die mit Application.CreateForm() als erste erzeugte Form.

Christian18 22. Sep 2007 15:13

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.

Muetze1 22. Sep 2007 15:37

Re: Vererbung bei Formularen
 
Welches ist denn dein Mutterformular? Dein Code
Delphi-Quellcode:
  TFMainForm = class(TForm)
leitet von TForm ab - und ich glaube nicht, dass dies schon irgendwelche Funktionalitäten von dir besitzt.

Khabarakh 22. Sep 2007 16:09

Re: Vererbung bei Formularen
 
Delphi-Quellcode:
procedure TFMainForm.Exit(Sender: TObject);
begin
  FMainForm.Close;
end;
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.

Christian18 22. Sep 2007 17:08

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:
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.
Wie will man denn sonst das Fenster schließen oder die Form veschieben.

Hansa 22. Sep 2007 20:36

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:
TMyForm = class (TForm);
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.

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