Einzelnen Beitrag anzeigen

Delbor

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

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