Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   for ..in auf Interface (https://www.delphipraxis.net/176872-auf-interface.html)

hsg 1. Okt 2013 13:37

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:
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
Ich versuche gerade dieses Auslesen in Delphi nachzubauen (letztendlich muss es in Delphi5 laufen)
Für die ersten Versuche wollte ich die ForEach-Schleife in der BDS2006 nachbauen, weiß aber schon dort nicht mehr weiter :(

Delphi-Quellcode:
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;
Dabei ist TtcusbSerials wie folgt definiert:
Delphi-Quellcode:
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;
Der Compiler meldet in der for-in-Zeile den Fehler Inkompatible Typen 'IInterface' und 'TComponent'
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:
  for n in oUsb.DefaultInterface do begin

  end;
Fehlermeldung des Compilers: for-in-Anweisung arbeitet nicht mit Kollektionstyp 'Itcusbserials', weil 'Itcusbserials' kein Element für 'GetEnumeratur' enthält ...
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

jaenicke 1. Okt 2013 13:46

AW: for ..in auf Interface
 
Vielleicht so?
Delphi-Quellcode:
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;
Mehr dazu:
http://theroadtodelphi.wordpress.com...ariant-arrays/

hsg 1. Okt 2013 14:24

AW: for ..in auf Interface
 
Tausend Dank! Funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz