Laufwerke - CD-Wechsel erkennen (TDriveComboBox refresh)



  • Hallodri !!

    Ich hab mal wieder ein kleines Problem.
    Ich tippe gerade an einem Programm, das den Inhalt einer CD erfasst und in eine Datei speichert. Soweit so gut, es funzt.
    Die DriveComboBox, ich verwende sie zum erzeugen des Dateinamens, lässt sich nicht updaten. Das heisst ich habe immer die gleichen Dateinamen, bis ich das programm neu starte.

    Vielleicht könnt ihr mir sagen, wie ich die DriveComboBox immer nach Wechseln einer CD updaten kann?!?

    mfg

    AgentOrange images/smiles/icon_confused.gif

    [ Dieser Beitrag wurde am 10.03.2002 um 00:46 Uhr von Jansen editiert. ]



  • Eine Möglichkeit wäre es, die Windows-Message WM_DEVICECHANGE abzufangen und dann die DriveComboBox per TextCase zu einem Update zu veranlassen.

    // in Unit1.h
    
    // unter private:
    void __fastcall WMDeviceChange(TMessage &Message);
    
    // unter public:
    BEGIN_MESSAGE_MAP
      VCL_MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, WMDeviceChange)
    END_MESSAGE_MAP(TForm)
    
    // in Unit1.cpp
    void __fastcall TForm1::WMDeviceChange(TMessage &Message)
    {  
      DriveComboBox1->TextCase = DriveComboBox1->TextCase;
    
      if (Message.WParam == 32768)
        ShowMessage("CD geladen");
      else if (Message.WParam == 32772)
        ShowMessage("CD ausgeworfen");
    }
    


  • Hallo nochmal!

    Danke für den Tipp. wusste nicht das man 2 mal TextCase braucht um die Box upzudaten.

    Schönen Abend noch

    mfg

    agentO.



  • Noch ein kleines Update zur Auswertung der Message (inspiriert von diesem Newsgroup-Beitrag):

    #include <dbt.h>
    
    void __fastcall TForm1::WMDeviceChange(TMessage &Message)
    {
      PDEV_BROADCAST_HDR pDummy = (PDEV_BROADCAST_HDR)(Message.LParam);
      if ((Message.WParam == DBT_DEVICEREMOVECOMPLETE ||  // Medium entfernt oder
           Message.WParam == DBT_DEVICEARRIVAL) &&        // Medium geladen, und
          pDummy->dbch_devicetype == DBT_DEVTYP_VOLUME)   // ist log. Laufwerk
      {
        DriveComboBox1->TextCase = DriveComboBox1->TextCase;
      }
    }
    

    Damit wird sichergestellt, dass der Refresh nur dann auftritt, wenn es sich um ein Laufwerk handelt. Denn die Message wird auch dann verschickt, wenn andere Devices wie zB. serielle Ports etc. verändert werden.

    [ Dieser Beitrag wurde am 09.03.2002 um 11:12 Uhr von Jansen editiert. ]


Anmelden zum Antworten