AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vererbung bei Formularen

Ein Thema von Christian18 · begonnen am 22. Sep 2007 · letzter Beitrag vom 22. Sep 2007
Antwort Antwort
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#1

Vererbung bei Formularen

  Alt 22. Sep 2007, 13:21
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Vererbung bei Formularen

  Alt 22. Sep 2007, 13:38
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.
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#3

Re: Vererbung bei Formularen

  Alt 22. Sep 2007, 15:13
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Vererbung bei Formularen

  Alt 22. Sep 2007, 15:37
Welches ist denn dein Mutterformular? Dein Code   TFMainForm = class(TForm) leitet von TForm ab - und ich glaube nicht, dass dies schon irgendwelche Funktionalitäten von dir besitzt.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Vererbung bei Formularen

  Alt 22. Sep 2007, 16:09
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#6

Re: Vererbung bei Formularen

  Alt 22. Sep 2007, 17:08
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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Vererbung bei Formularen

  Alt 22. Sep 2007, 20:36
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 ?

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.

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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:50 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