Hi CBOB,
schau mal in deinen Project-Code. Offensichtlich hast du dein Formular aus Unit2 deinem Projekt hinzugefügt. Somit wird automatisch schon eine Instanz beim Prog-Start erzeugt. Nun kann ich natürlich nicht sagen, was du an dem vorliegenden Code alles geändert hast.
Die übliche Vorgehensweise ist aber so:
1. Du fügst ein neues Formular in dein Projekt ein, und Delphi erzeugt automatisch den Aufruf
Application.CreateForm(TForm1, Device1);
Somit besteht eine Instanze die genutzt werden kann. Üblicheweise erzeugt Delphi auch automatisch die Instanz-Variable im implementation-Teil deiner Formular-
Unit (hier Unit2)
2. Du machst das lieber alles alleine:
hier wähle ich folgende Verfahrensweise. Zum Bsp. im Main-Form creiere ich das Formular im OnCreate Ereignes meines MainForm. Das dann, wenn es für die ganze Laufzeit erhalten bleiben soll. Dann muß aber beachtet werden, dass bei Aufrufen aus anderen Units die Instanz global verfügbar sein muß. Das hat oben Delphi aber automatisch für mich gemacht. Sinn bringt das eigentlich nur, für spezielle Nutzungen, bei denen Du das entsprechende Formular oder Objekt in einer Instanz unbedingt privat kapseln möchtest.
Nun gut, was machst du im eigentlichen Object:
Hier solltest du eigentlich nie globale Bezüge verwenden, da damit dein Object unflexibel wird. Es ist immer an speziell erstellte instanzen gebunden etc.
In deinem eigenen Object kannst du der Einfachheit halber immer direkt auf eigene Eigenschaften und Methoden ohne Instanzangabe zugreifen. Der Parameter self wird sozusagen implizit unterstellt.
Bsp.:
Delphi-Quellcode:
procedure TDevice1.SetPSheet(var tst: TTabSheet);
begin
FPSheet:=tst;
end;
// entspricht:
procedure TDevice1.SetPSheet(var tst: TTabSheet);
begin
self.FPSheet:=tst;
end;
Deine
Unit 2 sollte in der eigenen Erstellung eigentlich so aussehen:
Delphi-Quellcode:
unit devices;
interface
uses kl2700,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ComCtrls, StdCtrls, ExtCtrls;
type
TDevice1 =
class(TForm)
private
FPSheet: TTabSheet;
procedure SetPSheet(
var tst: TTabSheet);
public
property PSheet: TTabSheet
read FPSheet
write SetPSheet;
end;
var Dev1 : TDevice1;
implementation
procedure TDevice1.SetPSheet(
var tst: TTabSheet);
begin
FPSheet:=tst;
//hier ist dann vorbei - er wirft ne Fehlermeldung (Exception)
end;
Passiert das alles nicht per Drag and Drop im Fomular kümmerst Du dich selber um das Creieren Deiner Objekte.
Machst du es per Drag and Drop, sind diese Public und ein Property tut wirklich nicht not.
Gut, ich hoffe es war verständlich,
Gruß oki