OnMouseOut TListColumn



  • Wenn die Maus die ColumnHeader der ListView1 verlässt soll was passieren.

    Bei einer GroupBox löse ich das so... (Funktioniert auch bei der ListView)

    void __fastcall TForm1::OnMouseOut(TMessage &Message)
    {
      if( ((TGroupBox *)Message.LParam) == GroupBox1)
      {
       //Mach was, wenn die Maus die GroupBox1 verlässt
      }
    }
    

    Nur leider funktioniert es bei ColumnHeadern meiner ListView nicht.

    Nur wieso ???

    ==>Eisbeer<==



  • Hallo,

    Verrätst du uns auch was nicht funktioniert?



  • Eisbeer schrieb:

    Wenn die Maus die ColumnHeader der ListView1 verlässt soll was passieren.

    Müsste lauten:

    Wenn die Maus über den ColumnHeader der ListView1 ist soll was passieren.

    ==>Eisbeer<==



  • void __fastcall TForm1::OnMouseOver(TMessage &Message)
    {
      if( ((TListColumn *)Message.LParam) == XXXXXXX)
      {
       //Mach was, wenn die Maus über einem der ListViewColumns ist
      }
    }
    

    Ich habe 5 Colums angelegt.

    TListColumn *MeinLinkesColumn;
    MeinLinkesColumn = Form1->ListView1->Columns->Add();
    MeinLinkesColumn->Width = 73;
    MeinLinkesColumn->Caption = "Start Zeit";
    MeinLinkesColumn->Tag = 0;
    

    Wie kann ich feststellen ob die Maus nun über einer Zeilenüberschrift ist ?

    Wenn die Maus die ListView verlässt soll eine Aktion ausgelöst werden

    if( ((TListColumn *)Tag) == 0)
    {
          //Form1->Caption = "Raus";
          Form1->Timer2->Enabled = false;
          Form1->GroupBox3->Visible = false;
    }
    

    Wenn der Maus-Zeiger nun auf der Spalten-Überschrift mit 'Tag->0' ist, wird die Aktion ausgelöst.

    Wenn bei der If-Anweisung aus if( ((TListColumn *)Tag) == 0)
    if( ((TListColumn *)Tag) == 1) wird, bekomme ich Compiler-Fehler E2034: Konvertierung von 'int' nach 'TListColumn *' nicht möglich.

    ==>Eisbeer<==



  • Hallo

    Eisbeer schrieb:

    Wie kann man eine Aktion auslösen, wenn die Maus über einer TListColumn (Spaltenüberschrift) ist ?

    Das Ereignis OnMouseOver der TListView wird bei den Columns der ListView nicht ausgelöst.

    Da müßtest du wohl von TListView eine neue Komponente ableiten und dort direkt die Windows-Message abfangen und verarbeiten. Hier wird das Prinzip erklärt.

    Jede Column heit eine Nummer im Tag zugewiesen bekommen (1-5)

    Durch eine SWITCH-Anweisung

    switch ((TListColumn *)Tag)
    

    Meint der Compiler, dass der Auswahlausdruck einer Switch-Anweisung ganzzahlig sein muss.

    Die Tags 1-5 sind doch ganzzahlig.....

    Du kannst nicht einfach die Tags, in denen die Indexe der Spalten stehen, in TListColumn casten (wenn du nicht einen C-Cast sondern den eigentlich angebrachten static_cast genommen hättest hätte dir der Compiler das auch gesagt). Den Cast könntest du nur machen wenn in den Tags die Adressen der TListColumn-Objekte stehen würden.
    Aber das brauchst du auch nicht. Mit dem Index in den Tags kannst du doch bereits über die Eigenschaft TListView::Columns das Spaltenobjekt abfragen, wenn das korrekte TListView bereits feststeht.

    bis bald
    akari



  • Wenn man eine TListView ableiten, wie kommt man dann an die WindowMessages der Columns ??

    ==>Eisbeer<==



  • Hallo

    In dem von mir verlinktem Artikel steht wie man generell Windows-Messages abfängt und verarbeitet. Welche genau du in deinem Fall abfangen must kannst du sicher mit einer Recherche in der MSDN oder im WinAPI-Forum herausfinden.

    bis bald
    akari



  • Wenn ich von TListView eine neue Komponente ableite und dort die WindowsMessages verarbeite, verarbeite ich die der ListView und nicht die der Columns, da ich TListColumn nicht ableiten kann.

    Kann mir jemand sagen, wie ich eine neue TListColumn ableiten kann ?

    ==>Eisbeer<==



  • Hallo

    Es nützt dir nichts von TListColumn abzuleiten, du könntest Instanzen der neuen Klasse ja sowieso nicht einem TListView zuweisen.

    Das Ableiten von TListView ist schon korrekt, und du must auch die üblichen Mouse-Messages verarbeiten. Bei jeder Message must du eben berechnen ob die Position innerhalb der Titelleiste war und welche Spalte betroffen ist (alles andere gibst du an die verhandene Behandlung durch TListView weiter). Dann kannst du entsprechend deinen Vorhaben mit der Titelleiste agieren.

    Ja das ist nicht leicht und du solltest überlegen ob es den Aufwand wert ist.

    bis bald
    akari



  • Es nützt dir nichts von TListColumn abzuleiten, du könntest Instanzen der neuen Klasse ja sowieso nicht einem TListView zuweisen.

    MyTListColumn *MeinColumn;

    Wie sieht es mit THeaderControl aus? Kann man das nicht an Stelle von TListColumn zuweisen ?

    THeaderControl *MeinColumn;

    ==>**[C++ Fehler] Unit1.cpp(28): E2034 Konvertierung von 'TListColumn ' nach 'THeaderControl ' nicht möglich<==

    ==>Eisbeer<==



  • Hallo

    Der Compiler beantwortet deine Frage doch schon.
    Vielleicht solltest du aufhören rumzuraten und statt desen lieber auf das hören was wir schreiben.

    bis bald
    akari



  • Guten Morgen...

    Im WIN-API-Forum wurde ich darauf aufmerksam gemacht, die Nachrichten-Schleife des Header-Controls zu verarbeiten.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-207241-and-highlight-is-eisbeer.html

    Könntes mir jemand beim Einbinden in BcB helfen ?

    @akari: Ich höre doch meistens auf das, was ihr mir vorschlagt
    ...Mann kann durch verschiedene Wege ans Ziel kommen... TListView ableiten / Win-API benutzen...

    ==>Eisbeer<==


Anmelden zum Antworten