Jörg Sellmeyer, 10.03.2007 21:08: Hallo Frank,
In Deinem Beispiel Alle_Maustasten_abfangen.prf benutzt Du SetTimer 10 um die Listviewvariablen zu füllen. Ist das die einzige Möglichkeit die Mausklicks auf die Spaltenbuttons sicher zu erwischen?
Ohne geht es nämlich nicht
Ich hab selber auch viel rumprobiert aber meistens wird der zweite gleiche Klick auf einen Spaltenbutton im gleichen Control nicht mehr registriert.
Wenn zwischendurch in das Listview geklickt wird geht's wieder.
Ich hoffe, ich konnte mich einigermassen verständlich machen
Ach ja - es geht um die linke Maustaste!
Der Einfachheit halber gleich mal Code dazu.
Gruss
Jörg;createCode() $I Listview_Funktionen.incDeclare LVDllHdl&Declare bereich#,status&Declare text$,x&,y&Dim bereich#,320LVDllHdl&=UseDll("Listview.dll")Declare ListView1&Proc SetListView1 InitMessages(%hwnd) Declare tmptxt$ tmptxt$="Spalte 1";"Spalte 2";"Spalte 3" IColumn(ListView1&,Addr(tmptxt$),60,0) tmptxt$="Spalte 2" IColumn(ListView1&,Addr(tmptxt$),60,0) tmptxt$="Spalte 3" IColumn(ListView1&,Addr(tmptxt$),60,0) WhileLoop 0,6 AddString(ListView1&,MkStr$("Test " + Format$("00",&Loop) + "|",3)) Wend ShowListView(ListView1&,1,1,Width(%hwnd) - 2,Height(%hwnd) - 200)EndProcProc ExitLV CloseMessages(%hwnd) FreeDll LVDllHdl&EndProcUserMessages 16WindowStyle $218'Window 100,100 - 620,520ListView1&=CreateListView(%hwnd,%hinstance,0,14417146,-1,$21)SetListView1status&=Create("TEXT",%HWND,text$,8,364,600,72)While 1 WaitInput Case %umessage = 16:Break y&=GetControlParas(bereich#) If y&=2 text$="Der rechte Mausknopf wurde in Spalte "+Str$(Long(bereich#,4))+" / "+Str$(Long(bereich#,8))+" gedrückt.\n" ElseIf y&=1 text$="Der linke Mausknopf wurde in Spalte "+Str$(Long(bereich#,4))+" / "+Str$(Long(bereich#,8))+" als Doppelklick gedrückt.\n" ElseIf y&=3 text$="Der linke Mausknopf wurde in Spalte "+Str$(Long(bereich#,4))+" / "+Str$(Long(bereich#,8))+" gedrückt.\n" EndIf If y&<>0 text$=text$+"Dieses ereignete sich im Listview mit dem Handle "+Str$(Long(bereich#,0))+"." SetText status&,text$ Endif x&=GetVar(2) If x&<>-1 y&=GetVar(3) text$="Der rechte Mausknopf wurde über dem Spaltenbutton in Spalte "+Str$(x&)+" gedrückt.\n" text$=text$+"Dieses ereignete sich im Listview mit dem Handle "+Str$(y&)+"." SetText status&,text$ EndIf x&=GetVar(4) If x&<>-1 y&=GetVar(5) text$="Der linke Mausknopf wurde über dem Spaltenbutton in Spalte "+Str$(x&)+" gedrückt.\n" text$=text$+"Dieses ereignete sich im Listview mit dem Handle "+Str$(y&)+"." SetText status&,text$ EndIfWendExitLV
Frank Abbing, 10.03.2007 21:57: Du meinst, dass Profans WaitInput ohne Timer nicht durchbrochen wird bei einem Linksklick auf einen Headerbutton...
Dann probier einfach mal ein: Usermessages $1401
Und schon wird Waitinput bei einem Linksklick des Headers durchbrochen.
Nachzulesen in der Anleitung (ganz rechts oben).
Damit ersparst du sogar GetControlParas(), jedenfalls, wenn dich nur Linksklicke interessieren. Ich versuche immer, mehrere Möglichkeiten einzubauen...
David Strutz, 10.03.2007 22:21: Wofür steht $1401? Ist das ein Listview.Dll internal?
Frank Abbing, 10.03.2007 22:23: Also gut... Auszug aus der Listview.dll-Hilfe:
Listview.dll und Usermessages:
Seit Version 1.9 verschickt die Listview.dll verschiedene Usermessages an das Hauptprogramm, wenn bestimmte Ereignisse passieren. An dieser Stelle werden diese Messages genannt und erklärt:
$1400: Ermittelt jeden Tastendruck in einem beliebigen Listview.
uwParam = Listview-Handle
ulParam = Tastencode
$1401: Linke Maustaste wurde auf einem Spaltenbutton gedrückt.
uwParam = Listview-Handle
ulParam = Spaltenindex (nullbasierend)
$1402: Anwender will gerade Spaltenbreite verändern.
uwParam = Listview-Handle
ulParam = Spaltenindex (nullbasierend)
$1403: Anwender hat Spaltenbreite verändert.
uwParam = Listview-Handle
ulParam = Spaltenindex (nullbasierend)
Beitrag, 10.03.2007 22:34: Ah, die UserMessages habe ich noch gar nicht registriert. Hab tatsächlich seit Version 1.8 nicht mehr mit der dll programmiert.
Heute habe ich erstmal die ganzen alten "Leichen" aus dem System geschmissen.
Danke, das hilft kollossal. Vielleicht solltest Du für die anderen Klicks auch UserMessages nutzen. Diese unterschiedlichen Abfragen für die Klicks (GetControlParas/GetVar) führen schon mal zur Verwirrung.
Jörg Sellmeyer, 10.03.2007 22:36: Verdammt! Jetzt passiert sowas!! Da wird man beim Schreiben rausgeschmissen - nur weil ich kurz was nachgesehen habe.('')Ah, die UserMessages habe ich noch gar nicht registriert. Hab tatsächlich seit Version 1.8 nicht mehr mit der dll programmiert.
Heute habe ich erstmal die ganzen alten "Leichen" aus dem System geschmissen.
Danke, das hilft kollossal. Vielleicht solltest Du für die anderen Klicks auch UserMessages nutzen. Diese unterschiedlichen Abfragen für die Klicks (GetControlParas/GetVar) führen schon mal zur Verwirrung.
Frank Abbing, 10.03.2007 23:06: ('')Diese unterschiedlichen Abfragen für die Klicks (GetControlParas/GetVar) führen schon mal zur Verwirrung.Ich halte es für sinnvoll, mehrere Arten für eine Lösung zur Verfügung gestellt zu bekommen. Jede Technik hat eben seine Vor- und Nachteile.
Es ist auch passiert, dass ich hinterher eine besser Methode gefunden habe, ein Problem zu lösen. Deswegen lasse ich aber die alte Möglichkeit bestehen, schon aus Kompatibilitätsgründen. 
Jörg Sellmeyer, 10.03.2007 23:13: Das ist schon klar aber jetzt hast Du für die normalen Klicks im Listview GetControlParas und für Headerklicks GetVar und (nur für links) UserMessages.
Wenn Du die UserMessages auch noch für die anderen Klicks einbaust ist die Abfrage einfacher. Also z. B.:
$1401 = Header Link
$1402 = Header Rechts
$1403 = normaler Linksklick
$1404 = normaler Rechtsklick
$1405= Doppelklick











































































[/offtopic]Frank Abbing, 10.03.2007 23:20: Ich habe ja nichts degegen. Das nächte Update kommt bestimmt
.
Jörg Sellmeyer, 10.03.2007 23:23: ('Frank Abbing')Ich habe ja nichts degegen. Das nächte Update kommt bestimmt
.Das wollte ich hören!
Frank Abbing, 10.03.2007 23:24: ('')Du hast Deinen Gewinn ausprobiert, stimmt's? Ich hör's mir gerade an - ist echt zum piepen!Halt! Die Sprachausgabe entstammt nicht meinem Gewinn. Damit erzeugte Sprache hört sich nämlich fürchterlich an (nur SAPI) und das Tool ist längst wieder deinstalliert.
Hab mir Voice Reader von linguatec bestellt, das hört sich um Längen besser an...
Das jedenfalls ist meine Meinung.
Horst Horn, 11.03.2007 07:55: @Hi Frank('')Das jedenfalls ist meine Meinung....meine auch ! 
Frank Abbing, 11.03.2007 13:19: ('')$1403 = normaler Linksklick
$1404 = normaler Rechtsklick
$1405= DoppelklickProblem: Drei Infos werden hier benötigt: listviewhandle, spaltenindex, zeilenindex.
Per Message kann ich aber nur zwei versenden (lparam und wparam)...
Jörg Sellmeyer, 11.03.2007 13:32: Den Zeilenindex kann man dann ja wieder mit normalen Profanmitteln oder Listview.dll-Mitteln abfragen.;createCode()If %umessage = $1403 Zeile& = GetCurSel(&uwparam) 'oder GetControlParas(...) Zeile& = Long(b#,8)ElseIf %umessage = $1404 ...ElseIf %umessage = $1405 ...EndIfund für die Headerklicks das Gleiche mit anderen Messages. Dann könnte man alle auftretenden Klicks mit einer einheitlichen Methode erwischen und braucht nicht mit verschiedenen zu jonglieren.
Gruss
Jörg
Frank Abbing, 11.03.2007 15:47: Hab es so gelöst, dass Spalte und Zeile übergeben wird. Mittels GetVar(7) kann der Listview-Handle ermittelt werden, falls erforderlich.
Jörg Sellmeyer, 11.03.2007 20:57: Poste doch mal ein Beispiel.
Ich fände es besser, wenn das Handle übergeben wird. Dann kann man eine GetFocus ähnliche Funktion definieren, um die Events abfragen.;createCode()Proc LVLeftClick Parameters LV& Return (%umessage = $1403) And &uwparam = LV&)EndProcProc LVLeftDblClick Parameters LV& Return (%umessage = $1404) And &uwparam = LV&)EndProcSo kann man bei mehreren Listviews eleganter abfragen (finde ich zumindest);createCode()If LVLeftClick(LV1&) AktionLV1ElseIf LVLeftDblClick(LV1&) AktionDblClkLV1ElseIf LVLeftClick(LV2&) AktionLV2ElseIf LVLeftDblClick(LV2&) AktionDblClkLV1ElseIf ... ...EndIfWie würdest Du es bei Deiner Methode lösen?
Gruss
Jörg
Frank Abbing, 11.03.2007 21:43: ;createCode()aklick&=0If %umessage>=1405 or %umessage<=1408 sp&=&uwparam zl&=&ulparam lv&=GetVar(7) aklick&=%umessageEndIfIf aklick& text$="Linksklick" Case aklick&=$1406:text$="Rechtsklick" Case aklick&=$1407:text$="Doppellinksklick" Case aklick&=$1408:text$="Doppelrechtsklick" Print text$+" Listview: ",Str$(lv&)+" ("+Str$(sp&)+", "+Str$(zl&)+")"EndIf
Jörg Sellmeyer, 11.03.2007 22:57: Ok, mit dem zusätzlichen Flag bei GetVar() geht es auch so.
Ich würd's dann so machen:;createCode()Proc LVLeftClick Parameters LV& Return (%umessage = $1405) And (GetVar(7) = LV&)EndProcMit meiner oben beschriebenen Methode benötigt man aber das Flag 7 gar nicht. Dafür braucht man mit Deiner Methode GetControlParas nicht mehr unbedingt...
Frank Abbing, 12.03.2007 07:44: ('')Dafür braucht man mit Deiner Methode GetControlParas nicht mehr unbedingt...Gar nicht, würd' ich sagen...
Wie man's dreht und wendet ist ja egal.
Dies ist die Offlinevariante vom Thread [Klick auf Headerbuttons wird nicht zuverlässig abgefangen].
©2006 XProfan.Com