Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Frames und Vererbung (https://www.delphipraxis.net/58908-frames-und-vererbung.html)

Jens Schumann 14. Dez 2005 14:16


Frames und Vererbung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe heute mit D7 Pro ein neues Projekt angefangen. Die Oberfläche möchte ich mit Frames realisieren. Weil ich die Konstruktorsignatur erweitern möchte habe ich einen zusätzlich Konstruktor eingefügt. TFrameBase ist der Vorfahre aller Frames.
Delphi-Quellcode:
unit tpm_base_frame;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, tpm_SystemDataprovider_impl, StdCtrls;

type
  TFrameBaseClass = class of TFrameBase;

  TFrameBase = class(TFrame)
  private
    { Private-Deklarationen }
    FActionIndex          : Integer;
    FSystemDataprovider   : TSystemDataprovider;
  protected
    property ActionIndex       : Integer read FActionIndex;
    property SystemDataprovider : TSystemDataprovider read FSystemDataprovider;
  public
    { Public-Deklarationen }
    constructor CreateNew(AOwner: TComponent; ActionIndex : Integer; SystemDataprovider : TSystemDataprovider); virtual;
  end;

implementation

{$R *.dfm}

{ TFrameBase }

constructor TFrameBase.CreateNew(AOwner: TComponent; ActionIndex: Integer; SystemDataprovider: TSystemDataprovider);
begin
  inherited Create(AOwner);
  FActionIndex:=ActionIndex;
  FSystemDataprovider:=SystemDataprovider;
end;

end.
Jetzt habe einen Nachfahren erzeugt
Delphi-Quellcode:
unit tpm_stammdaten_frame;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, tpm_base_frame;

type
  TFrameStammdaten = class(TFrameBase)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

end.
Bis jetzt habe Delphi noch nicht neu gestartet! Alles läuft einwandfrei.
Nach dem ich Delphi geschlossen habe (ohne irgendwelche Fehlermeldungen) und anschließend wieder geöffnet habe erhalten ich beim Laden (also beim Start von Delphi) des Frames TFrameStammdaten folgende Fehlermeldung:

Fehler beim Lesen von FrameStammdaten.TabOrder:
Eigenschaft TabOrder existiert micht. Fehler ignorieren
und fortfahren usw.

Wenn ich den Fehler ignoriere siehtder Frame TFrameStammdaten aus wie ein Formualr und im OI erscheinen auch fast alle Eigenschaften und Ereignisse eines TForm.

Ich bin völlig ratlos. Woran kann das liegen?
Ich habe schon auf den Borlandseiten gesucht und im CodeCentral ein Beispiel gefunden. Dort machen die es aber genauso wie ich.

[EDIT]Ich habe mal ein minimales Beispiel angehängt [/EDIT]

tomsel 14. Dez 2005 14:46

Re: Frames und Vererbung
 
das passiert, wenn die Eigenschaft "Name" des Frames nicht mit dem Typbezeichner in der Deklaration übereinstimmt (Typbezeichner muß 'T'+Name sein).

Falls dies der Fall ist: Typdeklaration gleich 'T' + <jetziger_Name_des_Frame> setzen ('TFrame1' o.ä.), anschließend Frame in 'FrameStammdaten' bzw. 'FrameBase' umbenennen, der Typbezeichner wird dabei automatisch angepasst.

Nachtrag: du könntest einfach auch die *.DFM - Datei bearbeiten und dort die Name-Eigenschaft ändern.

Jens Schumann 14. Dez 2005 15:13

Re: Frames und Vererbung
 
Zitat:

Zitat von tomsel
das passiert, wenn die Eigenschaft "Name" des Frames nicht mit dem Typbezeichner in der Deklaration übereinstimmt (Typbezeichner muß 'T'+Name sein).

Falls dies der Fall ist: Typdeklaration gleich 'T' + <jetziger_Name_des_Frame> setzen ('TFrame1' o.ä.), anschließend Frame in 'FrameStammdaten' bzw. 'FrameBase' umbenennen, der Typbezeichner wird dabei automatisch angepasst.

Nachtrag: du könntest einfach auch die *.DFM - Datei bearbeiten und dort die Name-Eigenschaft ändern.

Vielen Dank, da komme ich aber nicht ganz mit. Die Eigenschaft Name von TFrameStammdaten war und ist FrameStammdaten.
Bei TFrameBase ist es analog.

tomsel 14. Dez 2005 17:51

Re: Frames und Vererbung
 
o.k., dann gibt es für diesen Fehler wohl mindestens noch eine zweite mögliche Ursache. Die kenn' ich aber leider nicht.

omata 14. Dez 2005 17:59

Re: Frames und Vererbung
 
Moin,

ja diesen Fehler hatte ich auch mal.

Deklariere einfach in deiner neuen Oberklasse folgendes, dann hast du keine Probleme mehr...

Delphi-Quellcode:
  :
  TFrameBase = class(TFrame)
  private
    _OldCreateOrder:boolean;
    _PixelsPerInch:integer;
    _TextHeight:integer;
  published
    property OldCreateOrder:boolean read _OldCreateOrder write _OldCreateOrder;
    property PixelsPerInch:integer read _PixelsPerInch write _PixelsPerInch;
    property TextHeight:integer read _TextHeight write _TextHeight;
  :
MfG
Thorsten

Jens Schumann 14. Dez 2005 20:01

Re: Frames und Vererbung
 
Hallo omata,
vielen Dank. Damit ist der Fehler beim Öffnen des Projektes
Zitat:

Fehler beim Lesen von FrameStammdaten.TabOrder:
Eigenschaft TabOrder existiert micht. Fehler ignorieren
und fortfahren usw.
leider nicht verschwunden.

omata 14. Dez 2005 21:24

Re: Frames und Vererbung
 
Hallo Jens,

dein Fehler hörte sich an, wie meiner. Das scheint aber doch anders zu sein.
Ich habe mir mal dein Beispiel angesehen.

Und da geht es auch ohne irgendwelchen Zusatzcode.

Also ich habe folgendes gemacht...

1. Projekt geöffnet.
2. Die beiden Fehlermeldungen mit Ignorieren bestätigt
3. Unit3 geöffnet
4. Unit3 aus der linken oberen Ecke ziehen (irgendwo anders hin)
4. Unit1 auch verschieben (minimal, damit Speichern möglich wird)
5. Projekt speichern, Fehlermeldung mit ja bestätigen

fertig.


MfG
Thorsten

Hansa 15. Dez 2005 00:55

Re: Frames und Vererbung
 
Zitat:

Zitat von omata
2. Die beiden Fehlermeldungen mit Ignorieren bestätigt

Und dann beten ? :mrgreen: Ich glaube nicht, daß Jens so was will.

Aber egal. Es geht mir hierdrum :

Zitat:

Zitat von Jens Schumann
ich habe heute mit D7 Pro ein neues Projekt angefangen. Die Oberfläche möchte ich mit Frames realisieren.

Unter Oberfläche ist wohl die Benutzeroberfläche gemeint ? Und die soll einheitlich und vererbbar sein ? Falls ja : So was schiebt man ins Repository, läßt Delphi die nötigen Deklarationen automatisch machen, agiert von da aus und dann kommen keine Fehlermeldungen. Mit Frames hat das dann eben nichts mehr zu tun. Wozu sollen die überhaupt gut sein ? :gruebel:

omata 15. Dez 2005 01:07

Re: Frames und Vererbung
 
Es geht hier nicht um beten. Delphi hat sich irgendwie verschluckt, das bedeutet ich versuche nur einen sinnvollen Weg vorzugeben, mit dem man den Code wieder zum Laufen bekommt.
Dazu gehört eben auch mal das Delphi da erst wieder manipulieren darf, wenn der User einen sinnvollen Weg vorgegeben hat. Und dazu gehört dann auch mal, dass man etwas ignoriert, weil man weiss was man tut.
Mir geht es hier um Problemlösungen, deshalb die nachvollziebaren Schritte, wie das Projekt zu retten ist (auch wenn es nur ein leeres Dummy-Projekt ist)

Hansa, wenn du keinen Sinn in Frames siehst, dann tust du mir leid. Frames sind einfach nur genial. Sie erhöhen die Übersichtlichkeit von Programmen ungemein. So kann man komplizierte Oberflächen aus kleinen Einzelunits zusammenbauen. Die Einzelunit sind dabei kleiner und dadurch erhöht sich die Programmübersichtlichkeit.

Und was ist so schlimm an vererbaren Oberflächenelementen?
Stell dir doch mal vor, die Funktionalität in deiner Oberfläche besteht aus vielen immer wieder ähnlichen Funktionen. Dann ist die Vererbung doch sehr interessant, um nicht immer das Rad neu zuerfinden. Also, wenn man etwas weiterdenkt kommen einem schon sinnvolle Ideen für Frames und Vererbung. Man kann damit natürlich auch viel Unsinn machen, aber das gilt wohl für viele Dinge. Man kann natürlich auch auf Frames verzichten und sich das Leben selber schwer machen.

Hansa 15. Dez 2005 01:38

Re: Frames und Vererbung
 
Omata : Wiederholung. 8) hierum geht es mir :

Zitat:

Zitat von Hansa
Aber egal. Es geht mir hierdrum :

Zitat:

Zitat von Jens Schumann
ich habe heute mit D7 Pro ein neues Projekt angefangen. Die Oberfläche möchte ich mit Frames realisieren.

Unter Oberfläche ist wohl die Benutzeroberfläche gemeint ? :gruebel:

Geht es um was komplett anderes, dann schlagt euch eben die Frames um die Ohren, aber ohne mich. :mrgreen: Ich brauche sie jedenfalls nicht und wollte eine Alternative aufzeigen. Zumindest für die Benutzeroberfläche : geht es also um folgendes : immer gleiche Tastenbedeutungen und Mausereignisse. Dimensionen, Farben, Schriftgrößen, Koordinaten usw. der Forms und der Controls darauf festlegen (auch daß überhaupt die richtigen da sind). Diese notfalls anpassen oder neu hinzunehmen und sie vererben oder eben nicht. Ist das die Frage, dann geht das wie beschrieben. Und zwar ohne Fehlermeldungen, weil auch die DFMs und andere Dateien davon betroffen sind und Delphi das schon richtig macht. Das bedeutet auch die Vorgabe INHERITED, die dann so einfach nicht mehr vergessen werden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr.
Seite 1 von 3  1 23      

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