AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Laufwerkgrössen ermitteln

Ein Thema von Delbor · begonnen am 21. Okt 2021 · letzter Beitrag vom 29. Okt 2021
Antwort Antwort
Seite 2 von 2     12   
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Laufwerkgrössen ermitteln

  Alt 29. Okt 2021, 20:32
Hi zusammen

Ich habe hier ein Beispiel für GetDiskFreeSpaceEx gefunden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var freeCaller, total: Int64;
begin
  GetDiskFreeSpaceEx('C:', freeCaller, total, nil);
  label1.caption:='Freier Speicher: '+IntToStr(freeCaller)+' Bytes';
  label2.caption:='Gesamter Speicher: '+IntToStr(total)+' Bytes';
end;
Das funktioniert einwandfei, wenn ich es so wie gesehen in einen Buttonklick-Event packe. Die Probleme beginnen erst später.

Meine derzeitiger Umsetzungsversuch:


Delphi-Quellcode:
function TPopUpWindow.DedectBiggestFreeSpace: Char;
  var i :integer; PopupWindow: TPopupWindow;
begin
  PopupWindow := TPopupWindow.Create(Self);
  PopupWindow.PopupMode := pmExplicit;
  PopupWindow.PopupParent := HomeOfficerFeMain;
  PopupWindow.RzPageControl1.ActivePage := PopupWindow.RzPageControl1.Pages[0];
  PopUpWindow.Position := poMainFormCenter;
  PopUpWindow.GetAllDrives;
end;

function TPopUpWindow.GetAllDrives: TStringDynArray;
  var total, freeCaller: int64; i: Integer;
      UsedSpace, TotalSpace, DriveLetter,
      FreeSpace, Space: String; DrivesArray : TStringDynArray;
begin
  DrivesArray := TDirectory.GetLogicalDrives; //Result enthält all Laufwerke, auch die Partitionen
  for i:=Low(DrivesArray) to High(DrivesArray) do
  begin
    DriveLetter := GetOneDrive(DrivesArray[i]);
    GetDiskNumbers(DriveLetter);
  end;
end;

function TPopUpWindow.GetOneDrive(const Drive: string): string;
  {Returns the display name for the drive with the given root path.}
  var FI: TSHFileInfo; // info about drive
begin
  if ShellAPI.SHGetFileInfo(PChar(Drive), 0, FI, SizeOf(FI),
     ShellAPI.SHGFI_DISPLAYNAME ) = 0 then
     RaiseLastOSError;
     Result := FI.szDisplayName;
end;
Und schliesslich GetDiskNumbers:

Delphi-Quellcode:
procedure TPopUpWindow.GetDiskNumbers(DriveLetter: String);
  var freeCaller, total : Int64; Freespace, Totalspace, UsedSpace :String;
begin
  GetDiskFreeSpaceEx(PChar(DriveLetter), freeCaller, total, nil);
  LbxVolumen.Items.Add('Disk: '+ DriveLetter);
  LbxVolumen.Items.Add('Freier Speicher: '+IntToStr(freeCaller)+' Bytes');
  LbxVolumen.Items.Add('Gesamter Speicher: '+IntToStr(total)+' Bytes');
  LbxVolumen.Items.Add('----');
  LbxVolumen.Items.Add('Freier Speicher: ' + FormatFloat('000.00', (freeCaller)/(1024*1024*1024)) + ' GB');
  LbxVolumen.Items.Add('Gesamter Speicher: ' + FormatFloat('0.00', (total)/(1024*1024*1024)) + ' GB');
  LbxVolumen.Items.Add('--------------------');
end;

Im gegenzug nach dem Beispiel von Delphitreff:

Delphi-Quellcode:
procedure TPopUpWindow.Button1Click(Sender: TObject);
var freeCaller, total: Int64;
begin
  GetDiskFreeSpaceEx('C:', freeCaller, total, nil);
  label1.caption:='Freier Speicher: '+IntToStr(freeCaller)+' Bytes';
  label2.caption:='Gesamter Speicher: '+IntToStr(total)+' Bytes';
end;
Hier ist nichts anders mit Ausnahme der Variablen DriveLetter und der Format-Anweisung. Trotzdem funktioniert mein Code nicht:
Drivepopup3.jpg

Was mache ich falsch? Die Formatumrechnung in Gigabyte ist ziemlich der des Explorers und sogar noch genauer.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#2

AW: Laufwerkgrössen ermitteln

  Alt 29. Okt 2021, 20:48
@Delbor:
Du solltest dir mal genauer anschauen, was die Funktionen jeweils zurückgeben und was sie an Eingaben (Parameter) erwarten. TDirectory.GetLogicalDrives gibt - laut Doku - ein Array von Laufwerksbuchstaben zurück. Deine Funktion GetOneDrive ist daher IMO überflüssig. GetDiskFreeSpaceEx erwartet bestimmt keine Angabe ala "Lokaler Datenträger (C:)" als ersten Parameter lpDirectoryName, vor allem, wenn man das mit dem von dir zitierten Beispielcode vergleicht, in dem "C:" reingegeben wird.

Empfehlung: schrittweise durchsteppen und Rückgabewerte der Funktionen auswerten. Das gilt auch für GetDiskFreeSpaceEx. Ein nachfolgendes GetLastError bei Misserfolg hätte sicherlich verraten, woran es genau klemmt.

Grüße
Dalai
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:02 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