Results 1 to 2 of 2

Thread: Een lijst van alle schijven opvragen

  1. #1
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269

    Een lijst van alle schijven opvragen

    Omschrijving

    Deze code geeft een lijst van schijven die in de computer aanwezig zijn. Met de schijven kunnen later andere truuks worden uitgehaald, zoals GetDriveType. Je kan als 'ADest' parameter simpelweg Memo.Lines bijvoorbeeld meegeven, maar uiteraard kan je ook zelf een TStringList aanmaken en die meegeven.


    Code


    Code:
    uses
      Windows,
      Classes;
    
    procedure GetDrives(const ADest: TStrings);
    var
      cDrives:      array[0..255] of Char;
      iLength:      Integer;
      iPos:         Integer;
      iDrive:       Integer;
    
    begin
      FillChar(cDrives, SizeOf(cDrives), #0);
    
      // Het formaat wat deze functie teruggeeft:
      //    a:\#0b:\#0z:\#0#0
      //    (drive, null, drive null, etc, null)
    iLength := GetLogicalDriveStrings(SizeOf(cDrives), @cDrives);
      iLength := (iLength - 1) div 4;
      iPos    := 0;
    
      for iDrive  := 0 to iLength do begin
        if cDrives[iPos] = #0 then
          break;
    
        ADest.Add(cDrives[iPos]);
        Inc(iPos, 4);
      end;
    
      // ADest bevat nu "a", "b", "z" bijvoorbeeld...
    end;
    Qui custodiet ipsos custodes

  2. #2
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    SVG vroeg mij waarom ik GetLogicalDriveStrings gebruikte in plaats van GetLogicalDrives. Het antwoord daarop wist ik eerlijk gezegd niet, dus hij gaf mij een aangepaste functie:



    Code:
    Procedure GetDrivesSVG( Const aList: TStrings );
    Var
      DrvInt,
      I: Integer;
    Const
      DrvLetters: Array [0..25] of char =
          ( 'A', 'B', 'C', 'D', 'E', 'F', 'G',
            'H', 'I', 'J', 'K', 'L', 'M', 'N',
            'O', 'P', 'Q', 'R', 'S', 'T', 'U',
            'V', 'W', 'X', 'Y', 'Z' );
    Begin
      DrvInt := GetLogicalDrives();
      If DrvInt = 0 then
        Raise Exception.Create( SysErrorMessage( GetLastError ) );
      For I := 0 to 25 do
        Begin
          If DrvInt And 1 > 0 then
            aList.Add( DrvLetters[ I ] );
          DrvInt := DrvInt shr 1;
        End;
    End;
    


    De werking hiervan is exact hetzelfde, behalve dat er gebruik wordt gemaakt van bit-testjes, wat over het algemeen de voorkeur heeft boven string-manipulatie. Ook vermeldde SVG dat ie iets sneller is...

    Eigenwijs als ik ben ging ik dit natuurlijk testen, en op 100.000x aanroepen bleek dit 0.1 seconde sneller te zijn. Dit kan sneller dacht ik, en jawel, met wat creatief coderen lukte dit. De originele code deed er 1.1582 seconden over, SVG's code 1.0652 en onderstaande code 0.2939... de moeite waard . Niet dat je ooit 100.000 keer zo'n lijst op wilt vragen, maar optimalisatie is per definitie goed .



    De code:


    Code:
    procedure GetDrives2(const ADest: TStrings);
    var
      iDrives:        Integer;
      iDrive:         Integer;
      iBit:           Integer;
    
    begin
      // GetLogicalDrives geeft een integer terug waarvan de 1e bit aangeeft of
      // drive A beschikbaar is (0/1), het 2e bit drive B, enz...
    iDrives := GetLogicalDrives();
      if iDrives = 0 then
        RaiseLastOSError();   // RaiseLastWin32Error met Delphi 5 en lager..
    
      iBit  := 1;
    
      for iDrive  := 0 to 25 do begin
        if (iDrives and iBit) = iBit then
          // 65 = ASCII code voor 'A'
    ADest.Add(Chr(iDrive + 65));
    
        iBit := iBit shl 1;
      end;
    end;
    


    De laatste functie raadt ik dus aan, maar elk van deze functies doet z'n werk prima. Het is in ieder geval weer leuk geweest om aan te sleutelen .



    [Edit]

    De optimalisatie-drift is iets te ver gegaan denk ik, de code werktte niet eens meer . In ieder geval is dat nu opgelost... *schaam schaam*
    Last edited by PsychoMark; 21-Jan-04 at 19:29.
    Qui custodiet ipsos custodes

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •