Seite 1 von 1

Wie Doppelclick in Listbox feststellen

Verfasst: Mo, 25.02.2013 09:22
von MaddinR
Hallo liebe Leute

Ich habe innerhalb eines Base-Formulares eine einfache Listbox. Bei Single-Click wird ein Element markiert, bei Doppel-Click wird das Element ausgewählt. Und speziell beim Doppel-Click soll aber jetzt eine Folge-Verarbeitung stattfinden. Bei Doppelclick wird in der Listbox des ausgewählten Satzes ein bestimmter Wert gelesen und auf den aktuellen Satz eines Tabellen-Controls geschrieben, das direkt neben der Listbox steht. Man kann sich das einfach vorstellen, die Listbox links ist ein Kostenstellen-Plan, die Tabelle rechts davon sind Buchungssätze, die eben eine Kostenstelle erhalten sollen. Nachdem der Buchungssatz aktualisiert wurde, skipt der Satzzeiger automatisch +1 und man kann die nächste passende Kostenstelle in der Listbox suchen.

Also, vorab.... das funktioniert erst mal alles schon. Nur ich habe ein kleines Problem mit der Listbox. Wenn ich nach dem ersten Doppelclick in der Listbox einmal mit Click in der Buchungstabelle den Satzzeiger manuell verändere, spinnt danach die Listbox. Das heisst, die fängt dann allein durch Mausbewegung an zu scrollen... irgendwie unkontrolliert und merkwürdig. Ich vermute, es liegt an meinen beiden Ereignissen.

Ich habe in der Listbox zwei Ereignisse deklariert. Einmal will ich auf Enter reagieren und einmal auf Doppelclick. Allerdings weiss ich nicht, ob das wirklich der richtige Weg ist.... deshalb bitte ich um Eure Hilfe. Das Tabellencontrol für die Buchungssätze selber enthält keine definierten Ereignisse, hier nutze ich für Navigation bzw. Änderungen einfach den OO-Standard. Also von der Seite gibts da keine Interessenkonflikte oder Ereignis-Kollisionen.

Ereignis "Taste gedrückt": Standard.UpdateUmsatzSetFehlendeKArt.OnKeyPress (document, Basic)
Ereignis "Maustaste gedrückt": Standard.UpdateUmsatzSetFehlendeKArt.OnDoppelClick (document, Basic)

Und das passiert im Programm:
'=======================================================================================================================

Sub OnKeyPress(oEvt)
If (oEvt.KeyCode = com.sun.star.awt.Key.RETURN) Then
GetRecIDFromListbox(EH_KEYPRESS)
EndIf
End Sub

'=======================================================================================================================

Sub OnDoppelClick(oEvt)
if (oEvt.ClickCount = 2) then
GetRecIDFromListbox(EH_DBLCLICK)
endif
End Sub

'=======================================================================================================================

Gibt es vielleicht eine bessere Lösung?

Danke für Eure Hilfe

vg, Maddin

Re: Wie Doppelclick in Listbox feststellen

Verfasst: Mo, 25.02.2013 09:50
von MaddinR
Nachtrag.... ich habe jetzt gerade was festgestellt.

Wenn die Listbox den Focus hat, reagiert sie völlig normal und nicht auf Nur-Mausbewegungen. Wenn aber die Umatztabelle den Focus hat, reagiert dann die Listbox, wenn der Mauszeiger sich in das Fenster der Listbox bewegt - auch ohne Click, nur der Mauszeiger. Es wird dann immer der selektierte Satz auf relative Pos 1 des Fensters hochgescrollt. Das soll sie aber nicht machen, die soll einfach nur so stehen bleiben, wie sie "verlassen" wurde, als der Focus auf die Umsatztabelle gewechselt wurde. Und sie macht bei jedem Wiedereintritt des Mauszeigers in den Fensterbereich der Listbox einen Redraw-Window.... also, kein Click, sondern nur durch die Bewegung des Mauszeigers, der ins Listbox-Fenster reinkommt.

Ich hoffe, irgend jemand hat dafür eine Idee.

vg, Maddin

Re: Wie Doppelclick in Listbox feststellen

Verfasst: Mo, 25.02.2013 17:24
von F3K Total
Hallo Maddin,
in Deiner Datei OOo-Forum2.odb aus diesem Beitrag ging es noch ohne Listboxhüpfer, was hast Du verändert?
Gruß R

Re: Wie Doppelclick in Listbox feststellen

Verfasst: Mi, 27.02.2013 07:52
von MaddinR
Hallo R.

*Wow*... Du hast ein Gedächntnis... :D .... und Du hast Recht, es ist immer noch das gleiche Programm, nur ist es jetzt ein anderes Problem. Damals skipte er unerwünscht im hier genannten (rechts stehenden) Grid-Control unter bestimmten Bedingungen zwei Datensätze, anstatt einem. Das Problem war mit DPunch's Tip zur Tab-Order behoben. Aber der jetzige Fehler ist eigentlich kein Fehler, der erst jetzt aufgetaucht ist, sondern der war eigentlich schon immer vorhanden.... eine Macke, die zwar nervig war, aber nicht wirklich als Fehler zu bezeichnen ist. Und erst jetzt hatte ich irgendwie die Lust, auch dieses Problem zu lösen. Allerdings glaube ich im Moment nicht mehr daran, dass das mit meinen Ereignissen zu tun hat, sondern eher auf OOo-internes Windows-Handling zurückzuführen ist.

Also, immer dann, wenn die Liste länger als der Listbox-Windows-Bereich ist, und immer dann wenn raufgescrollt wurde, also List-Elemente oben (!) ausserhalb des Fensters liegen, scrollt er ein weiter unten liegendes selektiertes List-Item beim Redraw so weit wie möglich nach oben. Ist hinsichtlich der Anzahl der vorhandenen Items Platz genug, so steht nach dem Redraw das selektierte Element auf relativer Fenster-Pos Eins. Er macht das aber nur dann, wenn vorher das Grid-Control den Fokus hatte und dann der Mauszeiger in das Listbox-Fenster gezogen wird. Das heisst, solange das List-Control den Focus hat, kann ich stundenlang arbeiten, ohne dass ein Redraw die List-Elemente eigenständig scrollt, aber nach jedem Focus-Wechsel geschieht genau dieses Verhalten. Das ist beim Arbeiten insofern blöde, weil man dann immer mit den Augen neu in der Liste suchen muss, um das letzte Element zu finden, oder das, was (man am Rande bemerkt als Vorschau auf die nächste Aktion schon wahrgenommen hat und) gerade noch in der Mitte gesehen hat und das jetzt ganz woanders steht.

Nun ja,ich habe das Problem gelöst. Allerdings anders, als zuerst gedacht. Ich habe die Listbox entfernt und verwende jetzt stattdessen ein Grid-Control. Damit passiert das nicht mehr. Und ich habe dabei ein paar nebensächliche Vorteile "gewonnen".

BTW, gibts eiegentlich eine Möglichkeit, innerhalb dieses (links stehenden) Grid-Controls (welches Read-Only) ist, bei Click auf eine Zelle die ganze Zeile zu markieren, anstatt nur diese Zelle... also vom Effekt so ähnlich, als würde man den Satzmarkierer (Column 0) anclicken. Das würde das Arbeiten ein wenig optisch unterstützen und den selektieren Satz deutlicher hervorheben. Also, dass das dann so ein bisschen so aussehen würde, wie beim List-Control. Gibts da einen Trick, um das zu erreichen?

vg, Maddin

Re: Wie Doppelclick in Listbox feststellen

Verfasst: Mi, 27.02.2013 10:05
von MaddinR
Nachtrag:

In dem von Dir verlinktem Link sind 2 Anhänge enthalten, mit denen man das Problem prima nachstellen kann. Je nachdem, wie man in der Item-Liste positioniert, passiert dieses merkwürdige Verhalten... aber nur dann, wenn in dem Moment das rechte Grid-Control den Focus hat. Ich habe darüberhinaus gerade noch was interessantes bemerkt. Wenn ich im List-Ctrl eines der letzten Items am Ende der Liste auswähle, dann dem Grid-Control den Focus gebe, um beispielsweise dort den Satzzeiger zu korrigieren und möchte dann über den Scroll-Bar des List-Controls ganz nach oben scrollen, so ist das gar nicht möglich, weil direkt nach dem Scrollen erst wieder das weit untenstehende Item ins Fenster geholt wird. Also muss ich zuerst ein weiter obenstehendes Icon selektieren, um dann über den Scrollbar alles raufzuschieben.... na ja... ist merkwürdig, aber erledigt..... oder besser Klippe umschifft. BTW, der Redraw des List-Controls ist einfach zu beobachten, wenn man nur die Maus rein ins Fenster bewegt... aber wieder: das rechte Grid-Control muss dabei den Focus haben. Dann provoziert jeder Mause-Move ins List-Control ein Redraw.

Was mich jetzt allerdings noch reizen würde, wäre die Ganz-Zeilen-Markierung, wenn ich eine Kostenstelle auswähle....... zur optischen Unterstützung bei der Arbeit....

vg, Maddin

Re: Wie Doppelclick in Listbox feststellen

Verfasst: Mi, 27.02.2013 18:01
von F3K Total
Hi Maddin,
so etwa:

Code: Alles auswählen

Sub Select_Grid_row
    Dim aSel(1)
    oform = thiscomponent.drawpage.forms.MainForm
    ogridmodel = oform.MainForm_Grid
    ocontroller = thiscomponent.currentcontroller
    ogridcontrol = ocontroller.getcontrol(ogridmodel)
    aSel(0) = oForm.BookMark
    ogridcontrol.Select(aSel)
end sub
an das Formular Ereignis "nach dem Datensatzwechsel" gebunden, funzt!
Gruß R

Re: Wie Doppelclick in Listbox feststellen

Verfasst: Fr, 01.03.2013 07:31
von MaddinR
Hallo R

Perfekt.... :) .... es funktioniert perfekt.... allerdings haben mir Deine Var-Namen zu Anfang ein bisschen Kopfzerbrechen bereitet. Aber mit ein paar Minuten experimentieren war das Problem schnell gelöst. Und zwar richtig gut. So siehts jetzt aus:

Code: Alles auswählen

Sub On_Select_Grid_Row
      Dim oForm as Object
      Dim oGrid as Object
      Dim oGridControl as Object
      Dim aSel(1)

      oForm         = ThisComponent.drawpage.forms.getByName("Form_GridCtrl_Kostenarten") 	
      oGrid         = oForm.getByName("GridCtrl_Kostenarten") 				
      oGridControl  = ThisComponent.currentcontroller.getcontrol(oGrid)
      aSel(0)       = oForm.BookMark

      oGridControl.Select(aSel)
End sub
Danke!

vg, Maddin