![]() |
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:
Meine Frage ist nun welche Rolle hier "(Ord(s) - 64" spielt? Kann man dies nicht anders lösen? Bsp: intostr oder ähnlichem?
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; 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" |
Re: Speichergröße von Datenträgern auslesen
Du musst den Laufwerksbuchstaben als Type Byte übergeben. Deshalb wird hier die Funktion Ord angewendet.
|
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')
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
|
Re: Speichergröße von Datenträgern auslesen
Hat jemand noch eine Idee wie ich das Problem mit meiner Formatierung beseitgen kann?
|
Re: Speichergröße von Datenträgern auslesen
DiskFree() erwartet 1 für Laufwerk a: und nicht 65
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
|
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?
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
Delphi-Quellcode:
label1.Caption := Format('%12.0n', [freeSpace]);
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
|
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:
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
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. |
Re: Speichergröße von Datenträgern auslesen
Schau doch, wie Rolf schon geschrieben hat in die Hilfe zu Format()
|
Re: Speichergröße von Datenträgern auslesen
Hi,
Die OH sagt:
Delphi-Quellcode:
Also nimm am besten Int64.
function DiskFree(Drive: Byte): Int64;
Und zur Ausgabe, wenn du eh kein "Disk Free" usw. davorstehen haben willst, nimm doch einfach IntToStr statt Format:
Delphi-Quellcode:
Ansonsten bei Ganzzahlen Format mit %d statt %n.
label1.Caption := IntToStr(FreeSpace);
Mfg FAlter |
Re: Speichergröße von Datenträgern auslesen
Zeig mal die beiden Funktionen DiskFree und DiskSpace, wenn es nicht die von Delphi sind.
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
|
Re: Speichergröße von Datenträgern auslesen
Dann müsste es schon bei der Variablenzuweisung einen Fehler geben.
|
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 |
Re: Speichergröße von Datenträgern auslesen
Zitat:
Zitat:
Delphi-Quellcode:
Format('%12.0n', [freeSpace / 1])
|
Re: Speichergröße von Datenträgern auslesen
Zitat:
@mind87: Wie sieht denn jetzt Dein Code aus und hast Du da noch Fehler drin ? Wenn ja, welche und was möchtest Du erreichen ? |
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:
[dqlphi]freeSpace := DiskFree(Ord(s) - 64); [/delphi] Bei Format ist es etwas anderes. Das meinte ich aber gar nicht. Mfg FAlter |
Re: Speichergröße von Datenträgern auslesen
Zitat:
Delphi-Quellcode:
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?
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; |
Re: Speichergröße von Datenträgern auslesen
Also dein Code ist sehr srtange, warum nicht
Delphi-Quellcode:
?
totalSpace:= DiskSize( combobox1.ItemIndex +3);
|
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. |
Re: Speichergröße von Datenträgern auslesen
Zitat:
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