Combobox mit seriellen Schnittstellen "füttern" und auslesen



  • Hallo zusammen,
    hoffe bin nun im richtigen Forum.

    Möchte eine Combobox mit dem im Rechner vorhandenen seriellen Schnittstellen zur Auswahl haben.

    Habe es so probiert:

    void __fastcall TForm1::Button9Click(TObject *Sender)
    {
    AnsiString comm;

    ComboBox1->Items->Add(GetRegistryValue("\\hklm\hardware\devicemap\serialcomm"));
    }

    Dann kommt beim Compilieren die Fehlermeldung:
    [C++ Fehler] U_MainForm.cpp(1073): E2268 Aufruf der undefinierten Funktion 'GetRegistryValue'

    Habe die <Registry.hpp> includet.

    Was habe ich da falsch gemacht und wie kann ich dann die selektierte Schnittstelle an:
    #define COM_PORT "COMxxx" geben?

    Danke und Gruß im Voraus



  • Hallo

    GetRegistryValue() ist eine Funktion, die nicht in der VCL integriert ist, sondern als Umbau für TRegistry in der BCB-Hilfe zu finden ist.
    Die Funktion findet du in der Hilfe im Beispiel zu TRegistry::ReadString.
    Dort kopiert du die raus und fügst die in dein Projekt so ein, das diese dort erreichbar ist, wo du sie aufrufen willst.

    bis bald
    akari



  • schmiggy schrieb:

    ... und wie kann ich dann die selektierte Schnittstelle an:
    #define COM_PORT "COMxxx" geben?

    gar nicht, da ein define zur compilezeit ausgewertet wird (alle vorkommen von COM_PORT in deinem code werden mit "COMxxx" ersetzt), du aber deine com-schnittstelle erst zur laufzeit ermittelst!



  • @akari
    Hi akari, es ist echt zum verzweifeln. Ich glaube ich bin einfach zu ungeschickt das Problem zu lösen.
    Habe es gemacht wie du gesagt hast, klappt aber immer noch nicht. Folgendes:

    **AnsiString __fastcall GetRegistryValue(AnsiString KeyName)
    {
    AnsiString S;
    TRegistry *Registry = new TRegistry;
    try
    {
    Registry->RootKey = HKEY_LOCAL_MACHINE;
    // False, weil der Eintrag nicht erstellt werden soll,
    // wenn er nicht vorhanden ist
    Registry->OpenKey("\\hardware\devicemap\serialcomm", false);
    S = Registry->ReadString("VALUE1");

    }
    __finally
    {
    delete Registry;
    }

    return S;
    }**

    Gibt doch als Rückgabewert S an den Ansistring Keyname oder? Dann habe ich

    **void __fastcall TForm1::Button9Click(TObject *Sender)
    {
    AnsiString KeyName;
    GetRegistryValue(KeyName);

    ComboBox2->Items->Add(KeyName);
    }**

    um durch Aufruf von GetRegistryValue(KeyName) den Wert zu lesen und in die Combobox zu schreiben.

    Compiler meckert nicht.Klappt trotzdem nicht.Was mache ich denn falsch? Vermute, dass der AnsiString als Funktion wie ich sie benutze nicht zu handeln ist oder?

    Gruß

    Michael



  • Hallo

    - bentutz bitte C++ Code-Tags, um hier im Forum deinen Quellcode einzufassen. Das Symbol findest du beim Post-Erstellen gleich ganz links unter den Smilies.

    - Du must auf die Backslashes in Strings achten. Stichwort Escape-Sequencen

    Registry->OpenKey("\\hardware\\devicemap\\serialcomm", false);
    

    bis bald
    akari



  • Bin die Sache jetzt mal mit dem Debugger angegangen.

    Hier:

    Registry->OpenKey("\\HARDWARE\\DEVICEMAP\\SERIALCOMM", false);
     S = Registry->ReadString("VALUE1");
    

    habe ich in der Variablen S den Wert Null, also wird nichts übergeben, oder? Was ist das VALUE1?



  • Hiho,
    habe es selber hinbekommen. Problem war dass ich keine Adminrechte auf dem betreffenden Rechner hatte... Habe es dann durch

    Registry->Access = KEY_READ;
    

    dann doch noch hinbekommen. Nun kann es weiter gehen...

    Gruß


Anmelden zum Antworten