Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Speichergröße von Datenträgern auslesen (https://www.delphipraxis.net/113984-speichergroesse-von-datentraegern-auslesen.html)

mind87 17. Mai 2008 20:01


Speichergröße von Datenträgern auslesen
 
Hallo,

habe eine Frage zum auslesen der Speichergröße von Datenträgern. Habe bereits eine Bespiel Code gefunden.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  freeSpace, totalSpace: Double;
  s: Char;
begin
  // Drive letter
  // Laufwerksbuchstabe
  s := 'D';

  freeSpace := DiskFree(Ord(s) - 64);
  totalSpace := DiskSize(Ord(s) - 64);

  label1.Caption := Format('Free Space: %12.0n', [freeSpace]);
  Label2.Caption := Format('Total Space: %12.0n', [totalSpace]);
  Label3.Caption := IntToStr(Round((totalSpace - freeSpace) / totalSpace * 100)) +
    ' Percent used.';
end;
Meine Frage ist nun welche Rolle hier "(Ord(s) - 64" spielt? Kann man dies nicht anders lösen? Bsp: intostr oder ähnlichem?

Gruß

Edit: Würde gerne die Werte ohne z.B 'Free Space: 159.165.487.457' im Label Feld ausgegeben.

Nehme ich das
Format('Free Space: %12.0n', [freeSpace])
raus und ersetze dies durch
label1.Caption :=freeSpace;
erhalte ich vom Compiler die Meldung: "Inkompatible Typen: 'String and Double"

RWarnecke 17. Mai 2008 20:06

Re: Speichergröße von Datenträgern auslesen
 
Du musst den Laufwerksbuchstaben als Type Byte übergeben. Deshalb wird hier die Funktion Ord angewendet.

mkinzler 17. Mai 2008 20:07

Re: Speichergröße von Datenträgern auslesen
 
Ord() ermittelt den ASCII-Code eines Zeichens, 65 ist der Code für 'a'. Ord(s) - 64 ergibt also die Nummer des Buchstabens (1 für 'a')

mind87 17. Mai 2008 20:19

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von mkinzler
Ord() ermittelt den ASCII-Code eines Zeichens, 65 ist der Code für 'a'. Ord(s) - 64 ergibt also die Nummer des Buchstabens (1 für 'a')

Welche Rolle spielt nun das die Nummer des Buchstabens a = 1 und nicht bei 65 belassen wird? Sorry wenn ich solche Fragen stelle, bin noch ein Neuling.

mind87 17. Mai 2008 20:27

Re: Speichergröße von Datenträgern auslesen
 
Hat jemand noch eine Idee wie ich das Problem mit meiner Formatierung beseitgen kann?

mkinzler 17. Mai 2008 20:27

Re: Speichergröße von Datenträgern auslesen
 
DiskFree() erwartet 1 für Laufwerk a: und nicht 65

mind87 17. Mai 2008 20:29

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von mkinzler
DiskFree() erwartet 1 für Laufwerk a: und nicht 65

Ah jetzt ok Danke dir.

Luckie 17. Mai 2008 20:30

Re: Speichergröße von Datenträgern auslesen
 
Warum liefern deine Funktionen eigentlich keine Ganzzahl zurück, sondern einen Wert vom Typ Double? Gibt es auch halbe und viertel Bytes?

mkinzler 17. Mai 2008 20:32

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Edit: Würde gerne die Werte ohne z.B 'Free Space: 159.165.487.457' im Label Feld ausgegeben.
Delphi-Quellcode:
label1.Caption := Format('%12.0n', [freeSpace]);

mind87 17. Mai 2008 20:32

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von Luckie
Warum liefern deine Funktionen eigentlich keine Ganzzahl zurück, sondern einen Wert vom Typ Double? Gibt es auch halbe und viertel Bytes?

Wollte die genaue Speichergröße haben, nichts gerundetes.

mkinzler 17. Mai 2008 20:33

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Wollte die genaue Speichergröße haben, nichts gerundetes.
Es wird aber nichts gerundet, da die Größe ja in Bytes ist

mind87 17. Mai 2008 20:36

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von mkinzler
Zitat:

Edit: Würde gerne die Werte ohne z.B 'Free Space: 159.165.487.457' im Label Feld ausgegeben.
Delphi-Quellcode:
label1.Caption := Format('%12.0n', [freeSpace]);

Was bedeutet %12.=0n? Dachte dies hätte ewtwas mit einer Leerstelle zwischen Text und der Ausgabevaribale zu tun.

RWarnecke 17. Mai 2008 20:38

Re: Speichergröße von Datenträgern auslesen
 
Schaue Dir mal den Befehl Format in der Delphi-Hilfe an. Dort ist auch die Formatierung der Zahlen erklärt.

Edit:
Zitat:

Zahl. Das Argument muss ein Gleitkommawert sein. Der Wert wird in einen String der folgenden Form umgewandelt: "-d,ddd,ddd.ddd...". Das Format "n" entspricht dem Format "f", allerdings enthält der resultierende String Tausendertrennzeichen.
Das bedeutet das n. Die 12 davor heist nur, das es als 12-stellige Zahl ausgegeben wird mit den tausender Punkten.

mind87 17. Mai 2008 20:43

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von mkinzler
Zitat:

Wollte die genaue Speichergröße haben, nichts gerundetes.
Es wird aber nichts gerundet, da die Größe ja in Bytes ist

Da ist wohl was dran. Habe gerade versucht in integer zu deklarieren. Beim compilieren kommt nun diese Meldung:

Im Projekte xxxx.exe ist eine Execption der Klasse EconvertError aufgetreten. Meldung: 'Format'%12.On' ungültig oder nicht kompatibel mit Argument'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzten.

mkinzler 17. Mai 2008 20:48

Re: Speichergröße von Datenträgern auslesen
 
Schau doch, wie Rolf schon geschrieben hat in die Hilfe zu Format()

FAlter 17. Mai 2008 20:49

Re: Speichergröße von Datenträgern auslesen
 
Hi,

Die OH sagt:

Delphi-Quellcode:
function DiskFree(Drive: Byte): Int64;
Also nimm am besten Int64.

Und zur Ausgabe, wenn du eh kein "Disk Free" usw. davorstehen haben willst, nimm doch einfach IntToStr statt Format:

Delphi-Quellcode:
label1.Caption := IntToStr(FreeSpace);
Ansonsten bei Ganzzahlen Format mit %d statt %n.

Mfg
FAlter

Luckie 17. Mai 2008 20:50

Re: Speichergröße von Datenträgern auslesen
 
Zeig mal die beiden Funktionen DiskFree und DiskSpace, wenn es nicht die von Delphi sind.

RWarnecke 17. Mai 2008 20:52

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von Luckie
Zeig mal die beiden Funktionen DiskFree und DiskSpace, wenn es nicht die von Delphi sind.

Ich glaube er nutzt die beiden Funktionen aus der SysUtils-Unit.

Luckie 17. Mai 2008 20:54

Re: Speichergröße von Datenträgern auslesen
 
Dann müsste es schon bei der Variablenzuweisung einen Fehler geben.

FAlter 17. Mai 2008 20:56

Re: Speichergröße von Datenträgern auslesen
 
Hi,

werden Int-Typen nicht implizit in Float-Typen umgewandelt? Das heißt, Int64 lässt sich problemlos Double verwenden.

Mfg
FAlter

himitsu 17. Mai 2008 21:03

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Meldung: 'Format'%12.On' ungültig oder nicht kompatibel mit Argument'. ...
12.0 ... Null (Zahl) und nicht O (Buchstabe)

Zitat:

werden Int-Typen nicht implizit in Float-Typen umgewandelt? Das heißt, Int64 lässt sich problemlos Double verwenden.
Nein, "n" erwartet explizit einen Real-Typ.
Delphi-Quellcode:
Format('%12.0n', [freeSpace / 1])

RWarnecke 17. Mai 2008 21:07

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von Luckie
Dann müsste es schon bei der Variablenzuweisung einen Fehler geben.

Das glaube ich nicht ganz. Ich bin der Meinung, dass Ihn das Format ein wenig aus der Bahn schmeißt und er einige Typen durcheinander schmeisst.

@mind87:
Wie sieht denn jetzt Dein Code aus und hast Du da noch Fehler drin ? Wenn ja, welche und was möchtest Du erreichen ?

FAlter 17. Mai 2008 21:11

Re: Speichergröße von Datenträgern auslesen
 
Hi,

das bezog sich nicht auf Format mit %f oder %n oder so, sondern auf Luckies Aussage

Zitat:

Dann müsste es schon bei der Variablenzuweisung einen Fehler geben.
Wegen Zuweisung Int64 --> Double bei

[dqlphi]freeSpace := DiskFree(Ord(s) - 64); [/delphi]

Bei Format ist es etwas anderes. Das meinte ich aber gar nicht.

Mfg
FAlter

mind87 17. Mai 2008 21:13

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von RWarnecke
Zitat:

Zitat von Luckie
Dann müsste es schon bei der Variablenzuweisung einen Fehler geben.

Das glaube ich nicht ganz. Ich bin der Meinung, dass Ihn das Format ein wenig aus der Bahn schmeißt und er einige Typen durcheinander schmeisst.

@mind87:
Wie sieht denn jetzt Dein Code aus und hast Du da noch Fehler drin ? Wenn ja, welche und was möchtest Du erreichen ?

Delphi-Quellcode:
procedure TForm1.ComboBox1Change(Sender: TObject);
 var
  freeSpace, totalSpace: double;
  s,drive: Char;
  total:integer;
begin
case combobox1.ItemIndex of
0:
begin
drive:='C';
end;
1:
begin
drive:='D';
end;
2:
begin
drive:='E';
end;
3:
begin
drive:='F';
end;
4:
begin
drive:='G';
end;
5:
begin
drive:='H';
end;
end;
  s:=drive;

  totalSpace:= DiskSize(Ord(s) - 64);
  freeSpace:= DiskFree(Ord(s) - 64);

  Edit_gspeicher.text:= Format('%12.0n', [totalSpace]);
  Edit_fspeicher.text:= Format('%12.0n', [freeSpace]);
  Label6.Caption := IntToStr(Round((totalSpace - freeSpace) / totalSpace * 100)) +
    ' Percent used.';
  total:=round((totalspace-freespace)/totalspace*100);
  progressbar1.position:=total;
end;
Solange ich totalspace und freespace nicht integer setze, funktioniert die Ausgabe mit den Tausenderstellen (%12.0n). Macht doch keine Probleme das ich die in double verwende oder?

mkinzler 17. Mai 2008 21:16

Re: Speichergröße von Datenträgern auslesen
 
Also dein Code ist sehr srtange, warum nicht
Delphi-Quellcode:
totalSpace:= DiskSize( combobox1.ItemIndex +3);
?

RWarnecke 17. Mai 2008 21:19

Re: Speichergröße von Datenträgern auslesen
 
Das sieht doch gut aus, warum möchtest Du jetzt die Werte freespace und totalspace auf Integer setzen ? Zumal Integer ja der falsche Typ wäre. Denn die Funktionen DiskSize und DiskFree aus der Unit SysUtils den Type Int64 zurückgeben. Deshalb geht Integer nicht.

Der Integer geht nur von -2147483648 bis 2147483647. Alles was darüber hinausgeht, muss Du für ganze Zahlen mit Int64 deklarieren.

Ich lege es Dir Nahe, mal in der Online-Hilfe von Delphi nachzulesen, was es für Variablen-Typen gibt.

mind87 17. Mai 2008 21:32

Re: Speichergröße von Datenträgern auslesen
 
Zitat:

Zitat von RWarnecke
Das sieht doch gut aus, warum möchtest Du jetzt die Werte freespace und totalspace auf Integer setzen ? Zumal Integer ja der falsche Typ wäre. Denn die Funktionen DiskSize und DiskFree aus der Unit SysUtils den Type Int64 zurückgeben. Deshalb geht Integer nicht.

Der Integer geht nur von -2147483648 bis 2147483647. Alles was darüber hinausgeht, muss Du für ganze Zahlen mit Int64 deklarieren.

Ich lege es Dir Nahe, mal in der Online-Hilfe von Delphi nachzulesen, was es für Variablen-Typen gibt.

Luckie hatte das eben angedeutet. Von daher war ich mir nicht sicher ob integer oder double bzw. int64.

Danke an alle, für die erstklassige und schnelle Hilfe. Echt klasse :-)

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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