![]() |
Buchstabenpfade nicht doppelt auflisten
Sers Delphi-Programmierer,
nämlich erstell ich ein Programm um Systeminformationen auszulesen. Zurzeit steh ich auf dem Schlauch, nämlich les ich aus der Registry einzeln die Netzlaufwerke (da ich die einzelnen Namen der Netzlaufwerke brauch) und mit der function getlocaldrives die einzelnen Laufwerke aus dabei werden die Netzlaufwerke doppelt aufgelistet bzw. nur die Laufwerksbuchstaben. Dabei liste ich beides in einer TListbox auf. Dabei würde ich gern dass der Laufwerksbuchstabe nur 1 mal erscheint, da schon die Netzlaufwerke mit den jeweiligen Buchstaben vergeben sind.
Delphi-Quellcode:
procedure TfrmSystemInfo.GetDrives(const AItems: TStrings); //lokale Laufwerke
const DriveTypeTexts: array[DRIVE_UNKNOWN..DRIVE_RAMDISK] of string = ('Unbekannt', 'Kein Wurzelverzeichnis', 'Diskettenlaufwerk', 'Festplatte','', 'DVD-Laufwerk', 'RAMDisk'); var Drive: Char; DriveType: Integer; DriveMask: Integer; Flag: Integer; begin DriveMask := GetLogicalDrives; flag := 1; for Drive := 'A' to 'Z' do //Jeden Buchstaben gegenprüfen begin if (flag and DriveMask) <> 0 then begin DriveType := GetDriveType(PChar(Format('%S:\',[Drive]) ) ) ; AItems.Add(Format('%s: %s', [Drive, DriveTypeTexts[DriveType]])); end; flag := flag shl 1; end; end; Vielen Dank im voraus Mit freundlichen Grüßen kumar89 |
Re: Buchstabenpfade nicht doppelt auflisten
Lege doch einfach eine stringliste an und füttere diese mit den laufwerksbuchstaben die du bereits in die listbox eingefügt hast. bevor du aber einen eintrag in die listbox einfügst, prüfst du mit indexof ob der laufwerksbuchstabe bereits existiert. Falls nicht dann einfügen in die listbox und in die stringliste, ansonsten nix machen.
|
Re: Buchstabenpfade nicht doppelt auflisten
Wenn schon eine temporäre TStringlist, dann kann man die auch auf Sorted stellen und Duplicates auf dupIgnore.
|
Re: Buchstabenpfade nicht doppelt auflisten
Zitat:
Sorted hab ich gefunden und auf true gesetzt, Duplicates finde ich blos nicht, wo finde ich duplicates? Danke schon mal für Sorted ;) |
Re: Buchstabenpfade nicht doppelt auflisten
Das ist eine Property von TStringlist.
|
Re: Buchstabenpfade nicht doppelt auflisten
Zitat:
Nimm WNetGetConnection dann kannst du sämliche Infos in einer Schleife von 'A' .. 'Z' zusammensetzen.
Delphi-Quellcode:
// kopiert aus Unit filectrl und etwas vereinfacht
function VolumeID(DriveChar: Char): string; var OldErrorMode: Integer; NotUsed, VolFlags: DWORD; Buf: array [0..MAX_PATH] of Char; begin OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); try Buf[0] := #$00; if GetVolumeInformation(PChar(DriveChar + ':\'), Buf, DWORD(sizeof(Buf)), nil, NotUsed, VolFlags, nil, 0) then SetString(Result, Buf, StrLen(Buf)) else Result := ''; Result := Format('[%s]',[Result]); finally SetErrorMode(OldErrorMode); end; end; function NetworkVolume(DriveChar: Char): string; var Buf: Array [0..MAX_PATH] of Char; DriveStr: array [0..3] of Char; BufferSize: DWORD; begin BufferSize := sizeof(Buf); DriveStr[0] := UpCase(DriveChar); DriveStr[1] := ':'; DriveStr[2] := #0; if WNetGetConnection(DriveStr, Buf, BufferSize) = WN_SUCCESS then begin SetString(Result, Buf, BufferSize); end else Result := VolumeID(DriveChar); end; |
Re: Buchstabenpfade nicht doppelt auflisten
dank dir ich möchte gern dazu die function in der listbox auslesen wie mach ich des am besten?
Dank dir schon mal im voraus ;) |
Re: Buchstabenpfade nicht doppelt auflisten
Meinst Du nun so etwas?
Delphi-Quellcode:
// kopiert aus Unit filectrl und etwas vereinfacht
function VolumeID(DriveChar: Char): string; var OldErrorMode: Integer; NotUsed, VolFlags: DWORD; Buf: array [0..MAX_PATH] of Char; begin OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); try Buf[0] := #$00; if GetVolumeInformation(PChar(DriveChar + ':\'), Buf, DWORD(sizeof(Buf)), nil, NotUsed, VolFlags, nil, 0) then SetString(Result, Buf, StrLen(Buf)) else Result := ''; Result := Format('[%s]',[Result]); finally SetErrorMode(OldErrorMode); end; end; function NetworkVolume(DriveChar: Char): string; var Buf: Array [0..MAX_PATH] of Char; DriveStr: array [0..3] of Char; BufferSize: DWORD; begin BufferSize := sizeof(Buf); DriveStr[0] := UpCase(DriveChar); DriveStr[1] := ':'; DriveStr[2] := #0; if WNetGetConnection(DriveStr, Buf, BufferSize) = WN_SUCCESS then begin //Stringlänge angepasst SetString(Result, Buf, StrLen(Buf)); end else Result := VolumeID(DriveChar); end; procedure TForm1.FormCreate(Sender: TObject); var DriveChar: AnsiChar; DriveName: AnsiString; begin ListBox1.Items.BeginUpdate; try ListBox1.Items.Clear; for DriveChar := 'A' to 'Z' do begin DriveName := NetworkVolume(DriveChar); if DriveName <> '[]' then ListBox1.Items.Add(Format('%s: (%s)',[DriveChar,DriveName])); end; finally ListBox1.Items.EndUpdate; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 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