Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu Typenlosen Parameter einer Funktion (https://www.delphipraxis.net/149365-frage-zu-typenlosen-parameter-einer-funktion.html)

schwa226 19. Mär 2010 16:15


Frage zu Typenlosen Parameter einer Funktion
 
Hi,

ich arbeite im Moment mit JVCL-TJvHidDevice.

Da gibt es ja die Funktionen der HID.dll:
function TJvHidDevice.GetFeature(var Report; const Size: Integer): Boolean;
function TJvHidDevice.SetFeature(var Report; const Size: Integer): Boolean;

Der "Report" ist ja nun Typenlos und ich jede beliebige Struktur übergeben.

Nun habe ich mehrere verschieden GetFeature & SetFeature Requests, alle mit einem unterschiedlichen Type definition.

Ich möchte aber eine Unterfunktion machen:
Delphi-Quellcode:
procedure DoGetData(var Report; const Size: Integer; Retry : Boolean);
var
  Data : Array of Byte;
begin

  //backup Report ID:
  SetLength(Data, Size);
  CopyMemory(@Data, @Report, Size);        //hier werden keine Daten kopiert, Report Type ist unbekannt!
  while not Device.GetFeature(Report, Size) do
  begin

  end;
end;
Ich muss den Report vorher sichern, denn wenn GetFeature False zurückgibt (Device Fehler) wird der Report gelöscht.
D.H. für jeden Versuch muss ich dann den Report neu setzen.

Wie kann ich ein "Backup" von Report machen?

Danke!

SirThornberry 19. Mär 2010 17:06

Re: Frage zu Typenlosen Parameter einer Funktion
 
in dem du dir die Adresse von Report nimmst und zum Beispiel mit CopyMemory die daten in eine andere Variable kopierst. oder du verwendest move. Und die neue Variable kann zum Beispiel ein Array of Byte sein welches du so groß machst wie Size es verlangt.

schwa226 20. Mär 2010 15:06

Re: Frage zu Typenlosen Parameter einer Funktion
 
Hi,

leider geht das nicht immer mit CopyMemory.
Wenn ich z.B. diesen Typ übergebe:
Delphi-Quellcode:
  THidVersion = packed record
    ReportID: Byte;
    Data: Array[0..10] of AnsiChar;
  end;
Geht es fast bei jedem 2. mal!?

Bei diesem Typ geht es gar nicht:
Delphi-Quellcode:
  THidReport = packed record
    ReportID: Byte;
    Data: Boolean;
  end;
??

SirThornberry 20. Mär 2010 15:08

Re: Frage zu Typenlosen Parameter einer Funktion
 
wie sieht dein dein Versucht mit CopyMemory aus? "Geht nicht" ist keine sonderlich gute Fehlerbeschreibung :glaskugel:

Neutral General 20. Mär 2010 15:17

Re: Frage zu Typenlosen Parameter einer Funktion
 
Versuche es mal so:

Delphi-Quellcode:
procedure DoGetData(var Report; const Size: Integer; Retry : Boolean);
var
  Data : Array of Byte;
begin
  SetLength(Data, Size);
  Move(Report, Data[0], Size)
  // Weiterer Code
end;

schwa226 20. Mär 2010 15:20

Re: Frage zu Typenlosen Parameter einer Funktion
 
Geht nicht bedeutet Data bleibt leer!?
GetlastError sagt mir immer 0, also kein Fehler.

Delphi-Quellcode:
var
  Data : Packed Array of Byte;
  i : integer;
begin
  //backup Report
  SetLength(Data, Size);
  while Data[0] = 0 do
  begin
    CopyMemory(@Data[0], @Report, Size);
    i := GetLastError;
  end;
Wenn ich diese Schleife mache, dann kann es beim Ersten mal funktionieren oder auch nie...

Schätze das es etwas mit dem "@Report" zu tun hat. Ein "@Report[0]" kann ich ja nicht machen, da Report ja Typenlos ist.

Das mit Move geht auch so wie mit CopyMemory. Also nicht immer...

Werde es einmal probieren nicht "var Report" zu übergeben, sondern einen Pointer auf Report.

Neutral General 20. Mär 2010 15:23

Re: Frage zu Typenlosen Parameter einer Funktion
 
Lass das @ vor dem Report weg (oder benutz meinen Code. Der funktioniert nämlich ganz sicher!)

SirThornberry 20. Mär 2010 15:36

Re: Frage zu Typenlosen Parameter einer Funktion
 
Der Code macht doch gar keinen Sinn. Wozu die Schleife? Die macht nichts anderes als die ganze Zeit immer wieder Report zu kopieren aber welchen Sinn macht das wenn die Daten innerhalb der Schleife nirgends hinn übergeben werden?

schwa226 20. Mär 2010 15:38

Re: Frage zu Typenlosen Parameter einer Funktion
 
Das Problem ist wenn GetFeature fehlschägt, dann wird mein "var Report" überschrieben.
Deswegen muss ich für jeden Versuch den Report neu beschreiben.

Jedoch habe ich bemerkt, dass wenn auch True von GetFeature zurückkommt es vorkommen kann, dass keine Daten in Report drinnen sind.

SirThornberry 20. Mär 2010 15:41

Re: Frage zu Typenlosen Parameter einer Funktion
 
Dann zeige uns doch auch mal den Code wo du GetFeature aufrufst im Zusammenhang mit der Sicherung. Es macht keinen Sinn das du uns eine Schleife zeigst wo all das gar nicht vor kommt. Wir können dir schließlich nicht bei deinem fehlerhaften Quelltext helfen wenn du uns ganz anderen zeigst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 Uhr.
Seite 1 von 2  1 2      

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