Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi VarPtr in Delphi ? (https://www.delphipraxis.net/53462-varptr-delphi.html)

goose33 17. Sep 2005 02:30


VarPtr in Delphi ?
 
Hallo,

eine Frage:
Ich hab wiedermal ein Stück c++ die ich nicht nach Delphi
übersetzen kann. Vielleicht kann jemand helfen ?

Hier der Code :

Delphi-Quellcode:
Here is the modified code that will do the job

Dim dwResult as Long
Dim dwString as string
Dim b(23) as byte 'defined a byte array (24 values)
Dim result as string 'will contain the final string
Dim i as integer

FSUIPC_Initialization

If FSUIPC_Open(SIM_ANY, dwResult) Then
If FSUIPC_Read (&H3160,24,VarPtr (b(0)), dwResult) Then 'read all bytes at offset &H3160 in byte array
If FSUIPC_Process(dwResult) Then
For i=0 to 255 
If b(i)=0 then exit for 'leave at 0 terminator
result=result+Chr(b(i)) 'otherwise adds to result (don't forget the Chr)
Next
End If
End If
FSUIPC_Close
EndIf
Das müsste ich irgendwie in Delphi zustande bekommen

Wie mach ich das ? Die frage ist dieses "VarPtr (b(0))" hauptsächlich und wie ich die Variable b definieren muss ?

Dank Euch
Matthias

Christian Seehase 17. Sep 2005 02:39

Re: VarPtr in Delphi ?
 
Moin Matthias,

also zuerst mal: Das ist Visual Basic nicht C++ ;-)

b müsste meiner Ansicht nach so aussehen:

Delphi-Quellcode:
var
  b : array [0..23] of byte;
und übergeben müsstest Du wohl

@b[0]

TKC 17. Sep 2005 02:40

Re: VarPtr in Delphi ?
 
hi,

eventuell hättest du ja mal google benutzen können :wink:

Zitat:

------------- schnipp -------------
procedure TTMainform.BBetankClick(Sender: TObject);
var dwResult : DWORD; a: real;
begin
FSUIPC_open(SIM_ANY, dwResult);
FSUIPC_Read($0B80,4, @a ,dwResult);
FSUIPC_Process(DWResult);
MaxTanklinks.Caption := FloatToStrF(a, ffFixed, 15, 2);
end;
------------- schnapp -------------

1) Du hast "a" als Real definiert. Ein Real ist 8 Byte (64 Bit) groß. Im FSUIPC_Read gibst Du als zweiten Parameter aber "4" an, d.h. Du liest nur 4 Bytes in eine 8 Byte große Variable ein. Das hat zum Ergebnis, dass die anderen 4 Byte so bleiben wie sie sind -> Datenmüll.

2) Laut dem FSUIPC-SDK ist 0B80 4 Byte groß. Du kannst also nicht einfach die 4 Byte in eine 8-Byte Variable lesen. Also musst Du was Passendes dafür nehmen: DWORD.
1 Byte: BYTE
2 Byte: WORD
4 Byte: DWORD
8 Byte: REAL
Abgesehen davon liefert 0B80 die Tankkapazität in US Gallonen zurück. Du musst die also noch in Pfund, Liter, Kilogramm, oder was immer Du haben willst, umrechnen.

Hier die Auflösung des Ganzen:

procedure TTMainform.BBetankClick(Sender: TObject);
var
dwResult, capacity : DWORD;
value : double;
begin
FSUIPC_open(SIM_ANY, dwResult);
FSUIPC_Read($0B80, 4, @capacity ,dwResult);
FSUIPC_Process(DWResult);
value := double(capacity);
// Hier Umrechnung einfügen
MaxTanklinks.Caption := FloatToStrF(value, ffFixed, 15, 2);
end;

Bis dann,
Hans
Dreamfleet / Team Eurowings Professional

goose33 17. Sep 2005 02:45

Re: VarPtr in Delphi ?
 
Hallöchen,

( oh VB also :-) )

also so hab ich mir das ja auch gedacht und das war dabei rausgekommen :

Delphi-Quellcode:
var
   b : array[0..23] of byte;
   AcTyp : string;
begin

      FSUIPC_Read($3160, 24, @bAc[0], dwResult);
      FSUIPC_Process(dwResult);
      for a := 0 to 255 do
      begin
        if bAc[a] = 0 then
          break
        else AcTyp := AcTyp + PChar(bAc[a]);
      end;
      mPhase.Lines.Add('Aircraft2 '+AcTyp);
Leider geht das so irgendwie nicht
Weiss auch nicht warum ??

Du ?

Danke
Matthias

goose33 17. Sep 2005 03:03

Re: VarPtr in Delphi ?
 
Habs rausgefunden

nicht PChar sondern Char muss es sein :-)

Danke
matthias

goose33 17. Sep 2005 03:30

Re: VarPtr in Delphi ?
 
Zitat:

Zitat von ACE-ppc
hi,

eventuell hättest du ja mal google benutzen können :wink:

Zitat:

------------- schnipp -------------
procedure TTMainform.BBetankClick(Sender: TObject);
var dwResult : DWORD; a: real;
begin
FSUIPC_open(SIM_ANY, dwResult);
FSUIPC_Read($0B80,4, @a ,dwResult);
FSUIPC_Process(DWResult);
MaxTanklinks.Caption := FloatToStrF(a, ffFixed, 15, 2);
end;
------------- schnapp -------------

1) Du hast "a" als Real definiert. Ein Real ist 8 Byte (64 Bit) groß. Im FSUIPC_Read gibst Du als zweiten Parameter aber "4" an, d.h. Du liest nur 4 Bytes in eine 8 Byte große Variable ein. Das hat zum Ergebnis, dass die anderen 4 Byte so bleiben wie sie sind -> Datenmüll.

2) Laut dem FSUIPC-SDK ist 0B80 4 Byte groß. Du kannst also nicht einfach die 4 Byte in eine 8-Byte Variable lesen. Also musst Du was Passendes dafür nehmen: DWORD.
1 Byte: BYTE
2 Byte: WORD
4 Byte: DWORD
8 Byte: REAL
Abgesehen davon liefert 0B80 die Tankkapazität in US Gallonen zurück. Du musst die also noch in Pfund, Liter, Kilogramm, oder was immer Du haben willst, umrechnen.

Hier die Auflösung des Ganzen:

procedure TTMainform.BBetankClick(Sender: TObject);
var
dwResult, capacity : DWORD;
value : double;
begin
FSUIPC_open(SIM_ANY, dwResult);
FSUIPC_Read($0B80, 4, @capacity ,dwResult);
FSUIPC_Process(DWResult);
value := double(capacity);
// Hier Umrechnung einfügen
MaxTanklinks.Caption := FloatToStrF(value, ffFixed, 15, 2);
end;

Bis dann,
Hans
Dreamfleet / Team Eurowings Professional


Hallöchen,

hast Du da vielleicht irgendwas verwechselt ???
Ichhab doch nix mit Betanken und schon gar nicht mit einer definition von a und als real auch nicht zu tun ??

Matthias

Ps: Trotzdem ist bei mir noch irgendein Fehler drin ?? Weisst Du vielleicht nen rat ?

TKC 17. Sep 2005 13:45

Re: VarPtr in Delphi ?
 
Hi,

wenn du evtl. das Projekt mal Posten kannst .. könnte ich bestimmt weiterhelfen ... aber ohne ganaue infos worum es geht
wird es schwer :wink:

goose33 17. Sep 2005 14:29

Re: VarPtr in Delphi ?
 
Hallöchen,

ging doch blos um den komischen VarPtr. Das ganze Project :-)
das sind mittlerweile umer 10000 Zeilen...ich glaub das fänden die Leute hier nicht wirklich
lustig :-)

Dank Dir aber trotzdem....


es ging ja nur um das hier :
Delphi-Quellcode:
var
   b : array[0..23] of byte;
   AcTyp : string;
begin

      FSUIPC_Read($3160, 24, @bAc[0], dwResult);
      FSUIPC_Process(dwResult);
      for a := 0 to 255 do
      begin
        if bAc[a] = 0 then
          break
        else AcTyp := AcTyp + Char(bAc[a]); // hier stand PChar() das war falsch
      end;
      mPhase.Lines.Add('Aircraft2 '+AcTyp);
end;

Matthias

Christian Seehase 17. Sep 2005 16:46

Re: VarPtr in Delphi ?
 
Moin Matthias,

Zitat:

Zitat von goose33
das sind mittlerweile umer 10000 Zeilen...ich glaub das fänden die Leute hier nicht wirklich
lustig

Auch so ein Projekt wäre kein Problem, denn Du könntest es ja als Anhang posten, wenn es erforderlich ist.
Ob sich dass dann jemand ansehen würde ist dann natürlich wieder eine andere Frage ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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 by Thomas Breitkreuz