Hallo liebe Delphi- Programmierer,
ich habe ein
ActiveX-Form erstellt (nach diesem Tutorial:
https://www.youtube.com/watch?v=G6cT7mdsFyQ ), habe auf der Form ein Label, einen Button und ein Edit-Feld (nach dieser Anleitung:
https://docwiki.embarcadero.com/RADS...eX_Active_Form ) eingefügt und die entsprechenden Änderungen und Code- Einfügungen vorgenommen. Ich kann das Projekt erzeugen, es entsteht ein .ocx
Ich kann dieses in mein LabVIEW- Programm einbinden, die programmierte Funktion ShowMessage über ButtonClick funktioniert, und über die mitgelieferten Standard- Properties auch steuern (z.B. Color, Autosize).
So weit, so gut. Ich möchte nun gerne selbst Properties und Methoden erzeugen, über welche ich das Control steuern kann. Leider gelingt mir schon der erste Schritt nicht vollständig.
Meine KLasse heißt IMyAX_Class, von dieser leiten sich die entspr. Interface- Namen ab. Das Projekt heißt MyActiveX_2, entspechend die Dateinamen.
In der .RIDL - Datei habe ich im Designer eine neue Property "X" erzeugt (Typ Long), diese bekam die ID 235. Die entsprechenden Getter und Setter sollten die private Variable FX setzen oder lesen. Delphi hat mir da nicht viel geholfen, deswegen musste ich in "MyActiveX_2_TLB.pas" in der Interface- Deklaration folgendes einfügen:
IMyAX_ClassDisp = dispinterface
...
property X: Integer dispid 235;
...
end;
IMyAX_Class = interface(IDispatch)
...
procedure Set_X(Value: Integer); safecall;
function Get_X: Integer; safecall;
...
property X: Integer read Get_X write Set_X;
...
end;
Das habe ich mir zusammengereimt, weil die vorhandenen, vom Wizard generierten Properties genauso deklariert wurden. Dann in der
Unit "MyActiveX_2U.pas" habe ich im protected- Bereich meine Member definiert:
TMyAX_Class = class(TActiveForm, IMyAX_Class)
...
protected
FX : Integer;
procedure Set_X(Value: Integer); safecall;
function Get_X: Integer; safecall;
...
und deklariert:
...
function TMyAX_Class.Get_X: Integer;
begin
Label1.Caption := FX.ToString;
Result := FX;
end;
procedure TMyAX_Class.Set_X(Value: Integer);
begin
FX := Value;
Label1.Caption := Value.ToString;
end;
FX habe ich in der Initialize- Methode auf 33 gesetzt.
In meinem aufrufenden LabVIEW-Code habe ich dann zuerst die Property X mit einer 22 gesetzt, danach ausgelesen. Der Rückgaewert ist 33, das Label wird auch zu 33 gesetzt.
Das heißt, der Setter wird nicht aufgerufen, denn die Variable FX enthält nicht den gesetzten Wert 22 und Label1.Caption wird nicht verändert. Der Getter hingegen funktioniert, hier wird das Label verändert und ich bekomme den Wert 33 zurück.
Ich habe mein Projekt in die ZIP im Anhang verpackt, es währe schön, wenn Ihr mal reinsehen würdet.
Hat einer von Euch erfahrenen Delphianern eine Idee?
Gruß, David