![]() |
AW: Mehrere Klassen von einer Klasse ableiten
Hallo Bummi,
danke für die Antwort, leider kann ich Dein Beispiel nicht auf mein Problem abbilden. Könntest Du bitte TBaseClassClass=Class of TBaseClass; in meinem Beispiel einfügen, damit ich damit klarkomme Danke im Vorraus. Gruß Gargano |
AW: Mehrere Klassen von einer Klasse ableiten
Delphi-Quellcode:
unit Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, BaseUnit; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } MyDevice : TBaseClass; end; var Form1: TForm1; implementation uses Unit1; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin MyDevice:=TBaseClassClass(FindClass('TDeviceModule1')).Create(Self); end; end. BaseUnit: unit BaseUnit; interface uses SysUtils, Classes; type TBaseClassClass=Class Of TBaseClass; TBaseClass = class (TDataModule) protected procedure DoSomethingImportant; virtual; abstract; procedure DoSomethingMoreImportant; virtual; abstract; procedure DoSomethingEvenMoreImportant; virtual; abstract; end; implementation end. Unit1: unit Unit1; interface uses SysUtils, Classes,Forms,BaseUnit; type TDeviceModule1 = class(TBaseClass) procedure ShowMsg (Msg:String); procedure DataModuleCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var DeviceModule1: TDeviceModule1; implementation {$R *.dfm} procedure TDeviceModule1.DataModuleCreate(Sender: TObject); begin ShowMsg('Create'); end; procedure TDeviceModule1.ShowMsg (Msg:String); begin Application.MessageBox(PChar(Msg),'Module1'); end; initialization RegisterClasses([TDeviceModule1]); end. |
AW: Mehrere Klassen von einer Klasse ableiten
Hallo Bummi,
super, das haut erstmal hin. Eins ist noch sehr merkwürdig und führt zum Nichtfunktionieren: TDeviceModule1 ist ja class(TBaseClass) abgeleitet von TDataModule. In Design Tab wird auch ein TDataModule gezeigt. Nur wenn ich das Projekt schließe und wieder öffne ist jetzt im Design Tab ein TForm abgebildet ? Was kann das sein ? Gruß Gargano |
AW: Mehrere Klassen von einer Klasse ableiten
Mach mal die DFM auf und schau was in der ersten Zeile drinsteht.
DFM mit einem Texteditor öffnen (die darf natürlich nicht im Binär-Format gespeichert sein ... Rechtsklick im Formeditor und Text-DFM auswählen, falls falsches Format) oder im Form-Editor Alt+F12 drücken |
AW: Mehrere Klassen von einer Klasse ableiten
Hallo Bummi,
das steht da drin
Delphi-Quellcode:
Gruß
object DeviceModule1: TDeviceModule1
Left = 0 Top = 0 ClientHeight = 116 ClientWidth = 207 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = DataModuleCreate PixelsPerInch = 96 TextHeight = 13 end Gargano |
AW: Mehrere Klassen von einer Klasse ableiten
Gut, das sieht OK aus.
Delphi-Quellcode:
Und nun diese Unit in ein Package rein, welches du im Delphi registrierst.
interface
.... type TBaseClass = class(... ... end; ... procedure Register; implementation procedure Register; begin RegisterClass(TBaseClass); end; ... (irgend wo her muß Delphi, bzw. der Formdesigner, diese Klasse auch kennen) Ach ja, FindClass geht über eine Liste, welche mit RegisterClass befüllt wurde. Ist die Klasse dort nicht drinn, dann kann sie nicht gefunden werden, weder von dir (FindClass), noch von dem VCL-Form-Editor.
Delphi-Quellcode:
Genauso wie TBaseClass für den Form-Editor registriert sein muß, muß auch TDeviceModule1 dort registriert sein, wenn du es über FindClass finden/erstellen willst.
procedure TForm1.Button1Click(Sender: TObject);
begin MyDevice := FindClass('TDeviceModule1') as TBaseClass; if not Assigned(MyDevice) then raise Exception.Create('TDeviceModule1 wurde nicht gefunden'); TBaseClass(MyDevice).Create(Self); end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var MyClass: TBaseClassClass; MyDevice: TBaseClass; begin MyClass := TDeviceModule1; MyDevice := MyClass.Create(Self); MyDevice.DoSomethingImportant; MyDevice.Free; end; |
AW: Mehrere Klassen von einer Klasse ableiten
Hallo Himitsu,
wie kann es aber sein daß in einem Nachfahren von TDatamodule Eigenschaften wie Clientwidth und Font enthalten sind ? (TDeviceModule2 ist eine Klasse von TBaseClass, die wiederum eine Klasse von TDatamodule ist) Gruß Gargano |
AW: Mehrere Klassen von einer Klasse ableiten
Meinst du im OI oder im Quellcode (Codeverfollständigung) ?
Im OI ... wenn die VCL die falsche Klasse erwischt, bzw. es als TForm läd, obwohl es was Anderes ist. |
AW: Mehrere Klassen von einer Klasse ableiten
Ich meine im OI.
Was dann dazu führt, daß bei der Ausführung ein Fehler auftritt. Wie kann ich denn das hinbringen daß es richtig ist ? Ich bin so vorgegangen : Ein TDatamodule erzeugt aus Datei/Neu/Weitere ->Delphi-Projekte/Delphi-Dateien/Datenmodule. Dies erzeugt dann ein Datenmodule von TDatamodule. Darin habe ich diese Zeile im Interface geändert
Delphi-Quellcode:
im OI ist auch dann TDataModule vorhanden.
TDeviceModule1 = class(TDataModule)
in TDeviceModule1 = class(TBaseClass) Soweit so gut. Wenn ich jetzt das Projekt schließe und wieder öffne erscheint dann unter TDeviceModule1 im OI ein TForm, was ja nicht richtig ist. Was wiederum Deine Annahme bestätigt, daß die VCL die falsche Klasse ewischt. Evtl. ist es auch der falsche Ansatz einfach die Klasse im Code zu ändern. Wie kann ich das richtig machen ? Gruß Gargano |
AW: Mehrere Klassen von einer Klasse ableiten
Ich habe leider gerade keine Zugriff auf ein Delphi, vielleicht hilft Dir das weiter
![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 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