Autor Beitrag
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mo 02.03.15 12:02 
Hallo Freunde,

ich hab hier nen Nervtöter. Ich habe ein TDatamodule namens TBaseDM erstellt, das eine Reihe abstrakter Methoden deklariert.
Davon abgeleitet sind 3 TDatamodules, die diese abstrakten Methoden implementieren.

Die Datamodules werden so deklariert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    TBaseDM = class(TDataModule)
    private
    protected
    public
      procedure SetupDBPath(const APath: string); virtualabstract;
    end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  TLocalDM = class(TBaseDM)
  //TLocalDM = class(TDataModule)
    LocalDB: TTdbDatabase;
  private
    { Private-Deklarationen }
    FDBPath: string;
  public
    { Public-Deklarationen }
    procedure SetupDBPath(const APath: string); override;


Lasse ich das so, werde ich beim Programmstart immer wieder angemeckert: Fehler beim Lesen von LocalDM.ClientHeight: Eigenschaft ClientHeight existiert nicht.
Ich muß dann tauschen:
ausblenden Delphi-Quelltext
1:
2:
  //TLocalDM = class(TBaseDM)    //Kommentare umgetauscht
  TLocalDM = class(TDataModule)

Anschließend das Projekt schließen und neu öffnen, worauf ich eine Fehlermeldung der IDE bekomme (Clientheight existiert nicht), die ich ignoriere. Anschließend tausche ich die Kommentare zurück und das Programm läuft wieder, bis ich das nächste mal an TLocalDM etwas ändern muß.
Der Grund ist: Wird TLocalDM von TBaseDM abgeleitet, so denkt die IDE, das TBaseDM ein Fenster ist (TForm). Im Designer sieht man auch eine Titelzeile und die drei Buttons, sowie eine Fensterhöhe von Null.

Wie bringe ich Delphi bei, das TBaseDM kein Formular ist, ich also nicht ständig das projekt öffnen/schließen muß ?

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Mo 02.03.15 12:21 
Ich habe die gleiche Konstellation, kenne aber solche Probleme nicht. Ich habe pro Datamodul eine eigene Unit.

Edit: Achso und im Projekt schaut das dann so aus:

ausblenden Delphi-Quelltext
1:
2:
  dmBase in 'dmBase.pas' {dmBase: TDataModule},
  dmLocal in 'dmLocal.pas' {dmLocal: TDataModule},
OlafSt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mo 02.03.15 14:52 
user profile iconbaumina hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe die gleiche Konstellation, kenne aber solche Probleme nicht. Ich habe pro Datamodul eine eigene Unit.

Edit: Achso und im Projekt schaut das dann so aus:

ausblenden Delphi-Quelltext
1:
2:
  dmBase in 'dmBase.pas' {dmBase: TDataModule},
  dmLocal in 'dmLocal.pas' {dmLocal: TDataModule},


Aha, da schau an. Bei mir ist es so:
ausblenden Delphi-Quelltext
1:
2:
3:
  FZW_BaseDM in 'FZW_BaseDM.pas',
  FZW_NoDBDM in 'FZW_NoDBDM.pas' {TNoDBDM: TDataModule},
  FZW_LocalDM in 'FZW_LocalDM.pas' {LocalDM: TDataModule},


Ich zieh das mal gerade und beobachte.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 02.03.15 20:43 
Ansonsten bleibt der alte Trick:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TDataModule = class(TdmBase);

  TLocalDM = class(TDataModule)
  ...
OlafSt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Di 03.03.15 15:15 
Beides hat nix geholfen. Hab aber selbst herausgefunden, was schiefgelaufen ist.

Als ich die Idee mit dem TBaseDM hatte, ging ich den üblichen Weg: Datei -> Neu -> Unit. Klassendefiniton schnell hingetippert und gut ist. Anschließend Datei -> Neu -> Weitere... -> Datenmodul. Wundert mich, das es überhaupt funktioniert hat :D

Jetzt habe ich ein leeres Datenmodul mit diversen abstrakten Methoden und drei weitere mit "Inhalt". Benutzt wird immer nur eines zur Zeit, keine Panik ;)

Problem solved.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
OlafSt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 08.10.15 10:25 
Problem leider nicht so ganz solved :evil: Das Problem bestand noch immer, auch in XE7.

Ich habe einen Thread in der DP eröffnet, wo dann auch eine endgültige Erklärung und Lösung für diesen Fehler zu finden ist.

Nun wirklich solved.

Moderiert von user profile iconMartok: DP-Link von Beitrag auf Thema geändert

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.