![]() |
for ..in auf Interface
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich habe hier einen Sensor, der mittels USB an den Rechner angeschlossen wird. Die API dieses Sensors bietet die Möglichkeit die Seriennummer des Gerätes auszulesen. Das ganze sieht unter VBA wie folgt aus:
Code:
Ich versuche gerade dieses Auslesen in Delphi nachzubauen (letztendlich muss es in Delphi5 laufen)
Sub Test()
Dim usbserials As tcusbserials Set usbserials = New tcusbserials usbserials.Init ("testo435-635-735") Dim serial As Variant For Each serial In usbserials Debug.Print serial Next End Sub Für die ersten Versuche wollte ich die ForEach-Schleife in der BDS2006 nachbauen, weiß aber schon dort nicht mehr weiter :(
Delphi-Quellcode:
Dabei ist TtcusbSerials wie folgt definiert:
procedure TForm1.pshInitClick(Sender: TObject);
var oUsb : Ttcusbserials; n : IUnknown; nSer : Integer; begin oUsb := Ttcusbserials.Create(Self); oUsb.AutoConnect := True; oUsb.Init('testo435-635-735'); for n in oUsb do begin end; // for n := 0 to end;
Delphi-Quellcode:
Der Compiler meldet in der for-in-Zeile den Fehler Inkompatible Typen 'IInterface' und 'TComponent'
Ttcusbserials = class(TOleServer)
private FIntf: Itcusbserials; function GetDefaultInterface: Itcusbserials; protected procedure InitServerData; override; function Get_Count: Integer; procedure Set_Count(Value: Integer); function Get__NewEnum: IUnknown; procedure Set__NewEnum(const Value: IUnknown); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Connect; override; procedure ConnectTo(svrIntf: Itcusbserials); procedure Disconnect; override; function Init(const szFilter: WideString): WordBool; property DefaultInterface: Itcusbserials read GetDefaultInterface; property _NewEnum: IUnknown read Get__NewEnum write Set__NewEnum; property Count: Integer read Get_Count write Set_Count; end; Itcusbserials = dispinterface ['{0164C373-41F1-4601-92A9-3595EA07A0FD}'] function Init(const szFilter: WideString): WordBool; dispid 2; property Count: Integer dispid 1; property _NewEnum: IUnknown dispid -4; end; Was ich an dieser Stelle zwar verstehe, aber leider nicht weiß, wie ich es besser mache :( Mir ist schon klar, dass ich nicht direkt das oUSB-Objekt verwenden kann, also habe ich es mit dem DefaultInterface versucht:
Delphi-Quellcode:
Fehlermeldung des Compilers: for-in-Anweisung arbeitet nicht mit Kollektionstyp 'Itcusbserials', weil 'Itcusbserials' kein Element für 'GetEnumeratur' enthält ...
for n in oUsb.DefaultInterface do begin
end; Wie kann ich nun den (einfachen) VBA-Code aus Excel nach Delphi portieren? Irgendwie stehe ich auf dem Schlauch ... Im Anhang befindet sich die gesamte Typlibrary der API. Gruß hsg |
AW: for ..in auf Interface
Vielleicht so?
Delphi-Quellcode:
Mehr dazu:
procedure TForm1.pshInitClick(Sender: TObject);
var oUsb: Ttcusbserials; oUsbEnum: IEnumVariant; n: OLEVariant; nSer: Integer; iValue: LongWord; begin oUsb := Ttcusbserials.Create(Self); oUsb.AutoConnect := True; oUsb.Init('testo435-635-735'); oUsbEnum := IUnknown(oUsb._NewEnum) as IEnumVariant; while oUsbEnum.Next(1, n, iValue) = S_OK do begin end; end; ![]() |
AW: for ..in auf Interface
Tausend Dank! Funktioniert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 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-2025 by Thomas Breitkreuz