ComboBox mit Laufwerken



  • ich verwende die LMD-Tools und möchte alle aktuellen Laufwerke in einer LMD-ComboBox anzeigen lassen genauso wie die DriveComboBox.
    Ich habe mir dazu eine Methode geschrieben, die mit Hilfe der WinAPI-Funktion GetLogicalDriveStrings() die Laufwerke in ein char-Array speichert. Ich möchte nun, dass die Laufwerke in eine StringListe geschrieben werden und als Parameter der Methode zurückgegeben werden. Hier mal mein Anfang:

    void __fastcall TfrmImport::GetDrives(TStringList* value)
    {
       TStringList* stl = new TStringList();
       const int lenght = 100;
       char buffer[lenght] = {0};
    
       GetLogicalDriveStrings(lenght, buffer);
    
       for (int i=0; i<lenght; i++) {
         //hier müssten die Werte nach jeder /0 in die StringListe geschrieben werden
       }
       delete stl;
    }
    

    Aufruf der Funktion im Konstruktor der Form und im OnChange-Ereignis der ComboBox:

    GetDrives(drives); //drives ist eine definierte TStringList
    cmbDrives->Items->AddStrings(drives); //Combobox cmbDrive
    


  • Hallo

    Und deine Frage ist? 😕
    In deinem Kommentar bei der for-Schleife hast du doch schon selber beschrieben, was du machen must.
    Und wozu du in der Funktion GetDrives noch eine neue StringList brauchst, weiß ich auch nicht.

    bis bald
    akari



  • Und wozu du in der Funktion GetDrives noch eine neue StringList brauchst, weiß ich auch nicht.

    Das stimmt. Hab ich wohl vergessen zu löschen 🙂

    In deinem Kommentar bei der for-Schleife hast du doch schon selber beschrieben, was du machen must.

    Ich weiss nur nicht, wie ich das am besten umsetze. Hab es mal so versucht:

    void __fastcall TfrmImport::GetDrives(TStringList* str)
    {
       AnsiString s;
       const int lenght = 100;
       char buffer[lenght] = {0};
    
       GetLogicalDriveStrings(lenght, buffer);
    
       for (int i=0; i<lenght; i++) {
          s += buffer[i];
          if (buffer[i] == '\0') {
             str->Add(s);
             s = "";
          }
       }
    }
    

    Dies hat nur den Nachteil, dass die StringListe länger ist, da sie die Nullwerte mitnimmt. Das kann man ja bestimmt besser machen. Der buffer sieht so aus:

    buffer[0] = 'C'
    buffer[1] = ':'
    buffer[2] = '\'
    buffer[3] = '\0'
    buffer[4] = 'D'
    buffer[5] = ':'
    usw...

    Wenn, das dann funktioniert muss ich noch die Namen der Laufwerke auslesen, damit ich sie zusammen mit den Laufwerksbuchstaben in der Combobox darstellen kann. Gibt es eine Funktion um die Laufwerksbezeichnungen auszulesen?

    Oder gibt es vielleicht eine andere Möglichkeit, die Funktion der DriveComboBox für die LMDComboBox zu übernehmen? Da ich in meinem Programm fast ausschließlich die etwas besser aussehenden LMD-Komponenten verwende, möchte ich keine veralteten Komponenten wie die DriveComboBox einsetzen.



  • Hallo

    Dies hat nur den Nachteil, dass die StringListe länger ist, da sie die Nullwerte mitnimmt. Das kann man ja bestimmt besser machen

    Du must doch nur noch die Bedingung ein bißchen anpassen

    for (int i=0; i<lenght; i++) {
          if (buffer[i] == '\0') {
             str->Add(s);
             s = "";
          } 
          else
          {
          s += buffer[i];
          }
       }
    

    Wenn, das dann funktioniert muss ich noch die Namen der Laufwerke auslesen, damit ich sie zusammen mit den Laufwerksbuchstaben in der Combobox darstellen kann. Gibt es eine Funktion um die Laufwerksbezeichnungen auszulesen?

    Frag im WinAPI-Forum nach, oder such in der MSDN.

    bis bald
    Stefan


Anmelden zum Antworten