![]() |
Dymo USB Waage ansteuern
Hallo, ich bins mal wieder ;D
ich habe mir eine Waage mit USB Schnittstelle gekauft und darauf gehofft das Gewicht mittels eigenem Programm auszulesen. Tja falsch gedacht. Es gibt sogar ein fertiges Tool welches Open Source ist und sogar mit Delphi realisiert worden ist, allerdings läuft das ganze über eine Jedi Komponente die ich nicht installiert bekomme ohne 100000 Fehler beim Kompilieren. Schaut euch das ganze mal an, vielleicht kommt ihr darauf wie ich es doch realisieren kann. ![]() |
AW: Dymo USB Waage ansteuern
Zitat:
![]() ![]() Der Installer sollte dann die JCL und JVCL (in der Reihenfolge ausführen) einfach installieren können. |
AW: Dymo USB Waage ansteuern
Wie muss ich da genau vorgehen?
|
AW: Dymo USB Waage ansteuern
Die beiden Repositories z.B. mit Hilfe von TortoiseGit auschecken und dann darin jeweils jcl\install.bat und dann jvcl\install.bat ausführen und den Anweisungen folgen.
|
AW: Dymo USB Waage ansteuern
Läuft, vielen Dank
|
AW: Dymo USB Waage ansteuern
Hab soweit alles am laufen, sobald ich allerdings mein fertiges Programm auf den Zielrechner bringe, wird ein Fehler beim starten der Anwendung angezeigt "Device cannot be identified"
Während meiner Recherche bin ich auf einen Beitrag auf GitHub gestoßen ![]() Im verlauf der Diskussion kommt der Autor darauf das es an der Verwendung der JvHidControllerClass liegt.
Delphi-Quellcode:
Den entsprechenden Eintrag im Constructor habe ich gefunden und die werte wie beschrieben miteinander getauscht, allerdings weist er am ende des Beitrags auch daraufhin, dass er besagten Constructor in zwei schritten aufruft.
@Steadyspike thanks a lot! It was a bug in the JVCL library (JvHidControllerClass) for Delphi...
in the constructor constructor TJvHidDeviceController.Create(AOwner: TComponent; AOnHidCtlDeviceCreateError: JvHidDeviceCreateError; AOnDeviceChange: TNotifyEvent); the two lines SetOnDeviceChange(AOnDeviceChange); FOnDeviceCreateError := AOnHidCtlDeviceCreateError; are in the wrong order. FOnDeviceCreateError must be set first. I worked around by calling the constructor in two steps: FHidCntrl := TJvHidDeviceController.Create(Self, DoOnDeviceCreateError, Nill); FHidCntrl.OnDeviceChange := DoOnDeviceChange; Wie ist das gemeint und wie kann ich dies Bewerkstelligen. |
AW: Dymo USB Waage ansteuern
Das steht doch da, was er gemacht hat:
Delphi-Quellcode:
und vorher stand da (was aber eben nicht funktionierte):
// Workaround
FHidCntrl := TJvHidDeviceController.Create(Self, DoOnDeviceCreateError, Nil); FHidCntrl.OnDeviceChange := DoOnDeviceChange;
Delphi-Quellcode:
// alte Version
FHidCntrl := TJvHidDeviceController.Create(Self, DoOnDeviceCreateError, DoOnDeviceChange); |
AW: Dymo USB Waage ansteuern
wo finde ich diesen Aufruf den?
|
AW: Dymo USB Waage ansteuern
Zitat:
|
AW: Dymo USB Waage ansteuern
Ich habe die Komponente auf meiner Form, kannst du mir bitte ein Konkretes Beispiel machen?
Hier ist der gesamte Code meiner Anwendung:
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, Vcl.ExtCtrls, JvComponentBase, JvHidControllerClass, Vcl.StdCtrls; type TfrmMain = class(TForm) DC1: TJvHidDeviceController; wpan: TPanel; Button1: TButton; procedure DC1Arrival(HidDev: TJvHidDevice); procedure DC1DeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word); private { Private-Deklarationen } public { Public-Deklarationen } end; var frmMain: TfrmMain; ReceivedData : Array[0..5] of Byte; HIDDevice: TJvHidDevice; gram : boolean; division : boolean; const VendorID = $0922; ProductID = $8000; implementation {$R *.dfm} procedure TfrmMain.DC1Arrival(HidDev: TJvHidDevice); begin if ((HidDev.Attributes.VendorID = VendorID) AND (HidDev.Attributes.ProductID > ProductID)) then begin HIDDevice := HidDev; HIDDevice.CheckOut; end; end; procedure TfrmMain.DC1DeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word); var raw_weight : integer; var raw_weight_oz : real; begin CopyMemory(@ReceivedData, Data, Size); raw_weight := ReceivedData[3] + ReceivedData[4] * 256; if(raw_weight > 0) then begin if (ReceivedData[1] = 2) then //grams begin wpan.Caption := IntToStr(raw_weight)+' g'; gram := true; end; if (ReceivedData[1] = 11) then //oz begin raw_weight_oz := raw_weight*0.1; wpan.Caption := FloatToStr(raw_weight_oz)+' oz'; gram := false; end; end else begin wpan.Caption := '0 g'; end; end; end. |
AW: Dymo USB Waage ansteuern
Der Typ von github verwendet einen Konstruktor, den du NICHT verwendest.
In dem Konstruktor, den du NICHT verwendest, werden zwei Events in der falschen Reihenfolge mit einem Eventhandler bestückt. Du weist weder dem einen noch dem anderen Event einen Eventhandler zu, du verwendest also beide NICHT. |
AW: Dymo USB Waage ansteuern
das ist dann mal gut zu wissen, also stehe ich wieder bei 0
|
AW: Dymo USB Waage ansteuern
Zitat:
|
AW: Dymo USB Waage ansteuern
Leider bin ich noch nicht so weit zu verstehen wie ich das anstelle
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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