![]() |
Int64 und Delphi 3
Mahlzeit,
ich sitze gerade an einem Progamm, welches unter anderem die Festplattengröße auslesen soll. Nun gibt es ja die Funktion GetDiskFreeSpaceEx diese arbeitet aber mit INT64 welches es bei Delphi 3 nicht gibt. Ich hatte hier im Forum schon eine Unit von Briggs gefunden, mit der ich aber nichts anfangen kann. Dann gab es das Stichwort "TLargeInteger", nur scheint es hierfür keine Ausgabemöglichkeit zu geben. Dann gibt es noch den Datentyp "Comp", welcher laut Hilfe den gleichen Zahlenraum wie Int64 haben soll nur klappt es auch damit nicht. Hat einer von Euch eine Idee??? Ati |
Re: Int64 und Delphi 3
Hallo,
such mal auf der Seite: ![]() nach "D3DiskSpaceKludge.ZIP",da wird auch mit Comp gearbeitet. |
Re: Int64 und Delphi 3
Ja, mit Comp kann es nicht funktionieren, da Comp und Int64 den Zahlenwert intern anders abspeichern. (glaub ich jedenfalls ... hab mich noch nicht so mit Comp beschäftigt, da es eh selten verwendet wird)
Und wenn man jetzt versucht die Daten als Int64 zu schreiben, dann kommt natürlich als Comp ausgelesen etwas anderes raus :zwinker: Ansonsten ... mal sehn ob/womit in D3 ein 64-Bit-Wert verfügbar gemacht werden kann ^^ Zur auswahl stehen fürs Erste mal folgende Werte: signet 64 bit integer (LargeInt) = Int64 __int64 LargeInt NativeInt unsignet 64 bit integer (LargeWord) = UInt64 LargeWord NativeUInt Wobei für die beiden Native-Werte noch keine festen Werte vorliegen ... es kann sein, daß diese in verschiedenen Compiler-Versionen anders gehandhabt werden. Außerdem werden nicht immer alle Definitionen verfügbar sein. Wobei die LargeWord-Typen wohl erst nach D4 eingeführt wurden. |
Re: Int64 und Delphi 3
Die FPU kann immer schon mit 64-Bit-Ints umgehen. Probier mal den folgenden Code (ungetestet):
Delphi-Quellcode:
function LoadInt64(var Value {:int64}): extended;
asm db $DF,$28 // fild qword ptr [eax] end; |
Re: Int64 und Delphi 3
Hi,
Zitat:
Delphi-Quellcode:
Dann noch zur Info:
procedure ...(...);
var Gesamt: Double; begin Gesamt := DiskSize(3); Form1.Caption := Format('Gesamtgröße: %12.0n',[Gesamt]); end; DiskSize gibt die die Größe in Byte des angegebenen Laufwerks zurück; 0 ist dabei das aktuelle Laufwerk, 1 Laufwerk A, 2 Laufwerk B usw. DiskSize liefert –1, wenn die Laufwerksnummer ungültig ist. MfG Marc |
Re: Int64 und Delphi 3
OK, habs gerade mal getestet, Comp scheint intern doch genauso zu arbeiten, wie Int64, also sollte es keine Probleme geben, wenn du statt Int64 das Comp verwendest. (ich glaub die Delphi-OH hat mich etwas verwirrt, was das Comp angeht)
@Flocke: hier geht es nicht um die FPU, sondern darum, ob Delphi solch einen Wert verwalten kann. Und außerdem, was ist, wenn |
Re: Int64 und Delphi 3
Zitat:
Delphi-Quellcode:
Wenn die Sprache den Datentyp aber nicht nativ unterstützt, dann kann man halt nicht damit rechnen und mit Format oder IntToStr nicht formatieren. Darum habe ich die kleine Assembler-Routine hingeschrieben, die macht einfach ein "fild qword ..." und konvertiert einen INT64-Wert in einen Fließkommawert, so dass man damit rechnen und ihn ausgeben kann.
_LARGE_INTEGER = record
case Integer of 0: ( LowPart: DWORD; HighPart: Longint); 1: ( QuadPart: LONGLONG); end; Mit comp (was übrigens wirklich einem int64 entspricht) kann man auch nicht rechnen. Dann kann man sich aber die Umwandlungsroutine in Assembler sparen und direkt einem extended zuweisen. |
Re: Int64 und Delphi 3
@Chegga
Das funktioniert nicht mit Festplatten >2GB @Flocke Hört sich interessant an. Nur wie arbeite ich jetzt mit Deiner Funktion?? Ein kleines Beispiel wäre nett!! |
Re: Int64 und Delphi 3
Zitat:
Und das von Flocke ist keine Funktion, dieses ist nur eine Typendefinition. also:
Delphi-Quellcode:
Meine eigene Version davon sieht z.B. so aus ^^
type
_LARGE_INTEGER = record case Integer of 0: ( LowPart: DWORD; HighPart: Longint); 1: ( QuadPart: LONGLONG); end;
Delphi-Quellcode:
Aber das hat mich auf die Idee gebracht ... schau mal nach, ob LONGLONG bei dir definiert ist ... wenn ja, dann hast du ja dein LargeInt/Int64 :angel2:
Type
TLargeIntRec = packed Record Case Byte of 0: (Org: LargeInt); 4: (Bin: LargeWord); 5: (Lo: LongWord; Hi: LongInt); 6: (Bits: TLargeWordSet); 7: (Bytes: TByteArray8); 8: (Words: TWordArray4); 9: (LongWords: TLongWordArray2); End; |
Re: Int64 und Delphi 3
Ich weiß jetzt nicht, wie GetDiskFreeSpaceEx bei dir deklariert ist, aber du solltest in Windows.pas den Typen LARGE_INTEGER haben.
Delphi-Quellcode:
// Nachtrag:
var
iFreeBytesAvailable, iTotalNumberOfBytes, iTotalNumberOfFreeBytes: LARGE_INTEGER; xFreeBytesAvailable, xTotalNumberOfBytes, xTotalNumberOfFreeBytes: Extended; begin GetDiskFreeSpaceEx('C:', @iFreeBytesAvailable, @iTotalNumberOfBytes, @iTotalNumberOfFreeBytes); xFreeBytesAvailable := LoadInt64(iFreeBytesAvailable); ... end; Konvertierung ohne Assembler:
Delphi-Quellcode:
function LoadInt64Soft(var Value: LARGE_INTEGER): Extended;
begin Result := 4294967296.0 * Value.HighPart + Value.LowPart; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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