Handle auf ListBox bekommen



  • Hi leute,

    Kenne mich nicht OOP aus, wollte das eientlich auch nicht lernen - komme ich jetzt wohl nicht drum herum 🙂

    ich möchte das handle auf eine ListBox bekommen, und über das Handle dann den Markierten eintrag der liste herrausfinden, dann den Text des Indexes.

    Hier mein momentaner code, der einen Fehler bei der zweiten IF Abfrage giebt.
    Ist aber bestimmt eh alles verwurschtelt, weil ich ja keine ahnung von Objekten und Klassen habe.

    void __fastcall TForm1::ListBox_INClick(TObject *Sender)
    {
    char t[99];
    int  index;
    char klassenname[] = "TListBox";
    char windowname[] = "ListBox_IN";
    char * ptr1;
    char * ptr2;
    
    ptr1 = klassenname;
    ptr2 = windowname;
    HANDLE hwnd;
    HANDLE hwnd2;
    
    hwnd = GetActiveWindow();
    
    if (hwnd == NULL){
        MessageBox(0, "Error bei FindWindowEx", "ERROR1", 0);
        }else{
          hwnd2 = FindWindowEx(hwnd, 0, ptr1, 0);
          if (hwnd2 == NULL){
             MessageBox(0, "Error bei FindWindowEx", "ERROR2", 0);
             }else{
               index = SendMessage(hwnd2, LB_GETCURSEL, 0, 0);
               SendMessage(hwnd2, LB_GETTEXT, index, (long)t);
               MessageBox(0, t, "Es wurde ausgewählt:", 0);
    }
    }
    }
    

    tjoa, wie bekomme ich nun also das Handle auf die Listbox ? (das ist mein Hauptanliegen, alles weitere krieg ich dann wohl so hin, vor allem werde ich das ja auch noch für andere Elemente Brauchen.)

    gruß und danke im voraus.

    Ole



  • Meinst du eine ListBox deines eigenen Programmes?

    HWND hwnd = ListBox1->Handle;
    

    Aber wozu, benutz doch einfach den ItemIndex der ListBox, um den selektierten Eintrag zu ermitteln.



  • Hey, dankeschön.

    Ich dachte halt, man müßte eine Message an die listbox senden:
    index = SendMessage(hwnd2, LB_GETCURSEL, 0, 0);
    um den Selektierten EIntrag zu erhalten.

    Aber um den Index in einen String umzuwandeln, braucht man dann ja eh das Handle, weil wieder SendMessage aufgerufen wird, das braucht ja immer ein Handle.

    Ok, nochmal danke für die Hilfe. Werde mich mal nach ItemIndex umschauen.

    Gruß,
    Ole



  • Du solltest versuchen, dich aus deiner WinAPI-Fixierung zu lösen. 😉
    SendMessage und ähnlichen Pipifax brauchst du (zu 99%) beim BCB nicht.

    void __fastcall TForm1::ListBox_INClick(TObject *Sender)
    {
      MessageBox(0, ListBox_IN->Items->Strings[ListBox_IN->ItemIndex].c_str(), 0, 0);
    }
    


  • Soll das bedeuten, Der BCB benutzt nicht Die Klassen der WinAPI für die einzelnen Objekte wie ListBox, Memo, Eingabe Feld, und etc. ? Man kann seine eigenen Klassen anmelden, so für die Grafik Control Oder wie das da heißt ? Kool.



  • Original erstellt von <Backtick>:
    Die Klassen der WinAPI

    WinAPI besitzt grundsätzlich keine Klassen, da es einfach eine Sammlung an Funktionen ist (C-Funktionen!)

    Sowohl MFC als auch VCL ist dann ein sogenanntes Framework bestehend aus sog. "Wrapper-Klassen" die extra so konzipiert sind, dass du die WinAPI getrost vergessen kannst (-;

    Leider ist dieser Gedanke bei der MFC völlig untergegangen.

    -junix

    [ Dieser Beitrag wurde am 10.01.2003 um 20:14 Uhr von junix editiert. ]



  • Also das Die WinApi Klassen keine Wirkliche Klassen sind wußte ich schon, aber
    Du sagst WinApi besteht nur aus Funktionen, aber die Fenster sind doch Klassen. Wrapper Klassen ? Hm, w*****einlich ist WinMain kein Teil von der WinAPI...

    Ich dachte das wäre halt eine Datei, die eine Klasse darstellt, diese Wrapper Klassen. und das die zur WinApi gehören.

    ok, ich hör scho nauf 😉



  • ähm, ist das eigentlich Ressourcensparender wenn ich MFC und das ganze Zeux 😉 benutze, oder WinAPI ?

    Das ist mir sehr Wichtig, das es schnell und ressourcen sparend ist.

    Wie siehts mit der Kompatiblität aus ?



  • Ich denke du verwechselst da was. WinAPI kennt keine Klassen!

    WinMain ist auch nur ne Funktion.

    WinAPI ist bestimmt Resourcensparender, du musst dafür alles zu Fuss machen.

    Was meinst du mit Kompatibilität?

    Vielleicht solltest du dich nochmal etwas mehr belesen was WinAPI, Klassen, API allgemein, C, C++, Assembler etc. ist.

    -junix



  • Durch das Benutzen von Zwischenschichten (Wrappern) hast du automatisch einen höheren Ressourcenbedarf und Overhead. Das gilt es dann abzuwiegen gegen die Erleichterungen und Einsparungen, die du beim Programmieren selbst erzielst. Ausserdem bist du ja nicht gezwungen, auschliesslich die Wrapper zu benutzen, für wirklich kritische Abschnitte kannst du immernoch API-Funktionen (oder Assembler ;)) einbinden.

    Auf der anderen Seite gehört natürlich überhaupt erstmal eine Menge "Skill" und Aufwand dazu, reine API-Programme zu schreiben, die soviel schneller oder ressourcensparender sind, dass es (auf heutigen Rechnern) einen relevanten Unterschied zu mit einem Framework erstellten Programmen gibt.

    Bei der Kompatibilität muss man natürlich auch Einbussen hinnehmen, aber das ist doch bei allen Entscheidungen für ein bestimmtes System so. Du erwartest von deinen WinAPI-Anwendungen ja auch nicht, dass sie unter Linux funktionieren, oder? 😉

    Auf der anderen Seite kann dir ein Klassenframework genau hier wieder helfen. Den VCL-Abkömmling CLX zB. gibt es nämlich auch für Linux, so dass du damit erstellte Programme auf beiden Systemen kompilieren kannst.

    Aber lass uns das bitte nicht ausdehnen, das hat ja nichts mehr mit dem Thema des Threads und auch nicht recht mit dem des Forums zu tun. Bei Bedarf starte einfach eine entsprechende Diskussion in "Rund um".



  • Das muß ich ganz bestimmt machen 🙂 Ich mache das halt gerne Parallel, Programmieren und Lernen, sonst ist das oftmals irgendwie ernüchternd, wenn man liest, Praktisch nicht wirklich was gelernt hat.

    mit Kompatiblität meine ich die Windows Versionen. Also ob es von 95 - XP läuft. oder halt weniger.



  • Was die Windowskompatiblität anbelangt sind VCL-Programme genauso kompatibel wie die WinAPI, die dahinter steckt.



  • In WinAPI gibt es wohl Klassen. Aber nicht Klassen im OOP-Sinne, sondern ich meine die Fensterklassen. Die heißen nunmal so.


Anmelden zum Antworten