Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TDataModule und eine Ableitung (https://www.delphipraxis.net/180544-tdatamodule-und-eine-ableitung.html)

TRomano 27. Mai 2014 19:56

Delphi-Version: XE4

TDataModule und eine Ableitung
 
Hallo zusammen,

in einem Projekt mit sehr vielen Formularen und Datenmodulen wollte ich ohne großen Aufwand für TForm & TDatamodule jeweils ein paar Properties einführen ... gesagt, getan:

Delphi-Quellcode:
unit EDMExtClasses;

interface
  uses System.Classes, System.SysUtils, System.Types, Vcl.Forms ;

type
  TLanguageTL = (GER,ENG,ZXX);

  TEDMDataModule = class(System.Classes.TDataModule)
   private
     fModuleID          : NativeInt;
     fLanguage          : TLanguageTL;
     procedure SetModuleID     (const Value : NativeInt);
     procedure SetLanguage     (const Value : TLanguageTL);
   public
     constructor Create(AOwner : TComponent); override;
     destructor Destroy;                    override;
   published
     property ModuleID          : NativeInt      read fModuleID      write SetModuleID;
     property Language          : TLanguageTL    read fLanguage      write SetLanguage;
  end;

  TEDMForm = class(TForm)
   private
     fModuleID          : NativeInt;
     fLanguage          : TLanguageTL;
     procedure SetModuleID     (const Value : NativeInt);
     procedure SetLanguage     (const Value : TLanguageTL);
   public
     constructor Create(AOwner : TComponent); override;
     destructor Destroy;                    override;
   published
     property ModuleID          : NativeInt      read fModuleID      write SetModuleID;
     property Language          : TLanguageTL    read fLanguage      write SetLanguage;
  end;

implementation

{ TEDMForm }

constructor TEDMForm.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fModuleID := -1;
  fLanguage := ZXX;
end;

destructor TEDMForm.Destroy;
begin
  inherited;
end;

procedure TEDMForm.SetLanguage(const Value: TLanguageTL);
begin
  if (Value <> fLanguage) then begin
     fLanguage := Value;
  end;
end;

procedure TEDMForm.SetModuleID(const Value: NativeInt);
begin
  if (Value <> fModuleID) then fModuleID := Value;
end;

{ TEDMDataModule }

constructor TEDMDataModule.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fModuleID := -1;
  fLanguage := ZXX;
end;

destructor TEDMDataModule.Destroy;
begin
  inherited;
end;

procedure TEDMDataModule.SetLanguage(const Value: TLanguageTL);
begin
  if (Value <> fLanguage) then begin
     fLanguage := Value;
  end;
end;

procedure TEDMDataModule.SetModuleID(const Value: NativeInt);
begin
  if (Value <> fModuleID) then fModuleID := Value;
end;


end.
Der Code (hier im Beispiel nur zwei Properties) wird anstandslos übersetzt. Flugs zum Testen noch das Hauptformular und ein Datenmodul "umbenannt" (einfach im Editor) und gestartet. Es funktioniert einwandfrei ... so lange ich nicht die IDE neustarte, denn dann zeigt sich das DataModule im Gewande eines Formulares (???) und beim nächsten Start des Programmes schmeißt der TReader eine "PropertyNotFound"-Exception, da er "ClientWidth" des Datamodules nicht findet. Wie sollte er auch ?
Aber in der DFM-Datei des Datamodules stehen nun so schöne Sachen, wie Font etc.

Wenn jemand einen Rat hat bin sehr dankbar, denn das verwirrt mich etwas ...

Gruß Thomas

himitsu 27. Mai 2014 21:28

AW: TDataModule und eine Ableitung
 
Hust, ich würde einfach mal die Forensuche empfehlen.
(z.B. mit "TDataModule" und meinem Namen als Suchkriterien :stupid:)
Da findet man dann auch die Erklärung, warum das so ist (oder auch nicht ist).

http://www.delphipraxis.net/180298-e...istrieren.html


Standardmäßig sind nur Ableitungen von TForm möglich und auch nur ohne eigene Ptoperty im OI.

Uwe Raabe 27. Mai 2014 21:56

AW: TDataModule und eine Ableitung
 
Zitat:

Zitat von himitsu (Beitrag 1260515)
Standardmäßig sind nur Ableitungen von TForm möglich und auch nur ohne eigene Ptoperty im OI.

Natürlich kann man auch von TDataModule und seinen Abkämmlingen ableiten (das benutze ich selber sehr oft), allerdings sollte man das in einer separaten Unit und mit einer separaten DFM tun. In keinem Fall sollte man zwei DFM-abhängige Klassen innerhalb einer Unit deklarieren - das funktioniert nämlich nicht.

himitsu 27. Mai 2014 22:06

AW: TDataModule und eine Ableitung
 
Für den Compiler ist es egal. Da kann sogar die DFM in einer anderen Unit/DPR eingebunden sein, wie die Klassendefinition.

Nur der Formdesigner braucht das natürlich in einer Unit und auch nur eine (Form)Klasse.


Bei Forms gibt es halt weniger Probleme, da der Formdesigner auf TForm umschaltet, wenn er es nicht mehr hinbekommt,
welches dann halt das mehrfach vererbte Datenmodul zerschottet.


PS: Der FormDesigner nimmt nicht die Vorfahrklasse auf der PAS, sondern maximal den Eintrag aus der DPR DPROJ. Und in der DFM steht vom Vorfahren auch nichts.


Bei Forms funktionieren "abgeleitete" Forms (siehe inherited in der DFM) besser, aber abgeleitete Forms machen auch Probleme.

TRomano 28. Mai 2014 06:18

AW: TDataModule und eine Ableitung
 
Hallo zusammen,

ich werde es mit zwei separaten Units testen und berichten, ob es da besser klappt.
@himitsu: natürlich besuche ich als Erstes die Forensuche, aber offensichtlich war meine Anfrage zu komplex gestellt. Das nächste Mal ist es ja ganz einfach: "... himitsu":?

Danke Euch !

TRomano 28. Mai 2014 09:46

AW: TDataModule und eine Ableitung
 
Hallo zusammen,

ich habe nun, wie empfohlen, die beiden Klassen in getrennten Units untergebracht. Leider hat sich bei dem abgeleiteten TDatamodule nichts zum Besseren gewendet.
Aber da ich es mittlerweile sportlich sehe werde ich ab Freitag mich der Sache weiter annehmen und eine Lösung suchen.

Danke noch einmal ...

Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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