🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Abfrage auf Ist-Edit-Modus

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
MaddinR
Beiträge: 42
Registriert: Fr 17. Jun 2011, 12:19

[gelöst] Abfrage auf Ist-Edit-Modus

Beitrag von MaddinR » Mo 26. Jan 2015, 14:41

Moin @ all

Ich habe ein kleines Problem mit einer besonderen Event-Behandlung in einem Formular. Ich habe in ein Formular ein Tabellen-Steuerelement platziert. Bei Press Enter oder Doppelklick springt er via Event-Handler in meine Funktion rein, um irgendwas zu machen... z.B. die Satznr. des aktuellen Satzes auslesen, und Infos aus einem korrespondierenden Datensatz einer anderen Tabelle zu holen. Das funktioniert bestens. Das Problem besteht darin, wenn ich in diesem Tabellen-Steuerelement im Zellen-Edit-Modus bin, denn dann soll Enter einfach nur dazu führen, dass die Eingabe übernommen wird und der Edit-Modus beendet wird. Wie kann ich jetzt in meinem Event-Handler abfragen, dass Enter nicht in der Navigation durch die Tabelle gedrückt wurde, sondern um im Edit-Mode die Eingabe zu beenden?

Das sind die letzten Zeilen in meinem Eventhandler und auch gleich die Position des Makro-Absturzes wegen einens Fehlers. Ich unterscheide hier nur zwischen Mouse-Doppelklick und Enter... es kann bei Tastendruck auch nur Enter sein, weil keine andere Taste in diesen Handler reinspringt.

Code: Alles auswählen

    if CalledFrom = EH_KEYPRESS then
       oDocView.getControl(GridCtrl_Kostenarten).setFocus()	    
    endif
So wäres es eigentlich richtig, aber ich weiss nicht wie:

Code: Alles auswählen

    if CalledFrom = EH_KEYPRESS then
       if  not Ende_von_ZellEdit
           oDocView.getControl(GridCtrl_Kostenarten).setFocus()	    
       endif
    endif
Hat jemand einen Rat für mich?
Zuletzt geändert von MaddinR am So 15. Feb 2015, 15:43, insgesamt 2-mal geändert.
Gruß, Maddin

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Abfrage auf Ist-Edit-Modus

Beitrag von gogo » Sa 31. Jan 2015, 21:07

Schockschwerenot! Könntest Du bitte "Tabellensteuer-Element" in "Tabellensteuerelement" oder "Tabellen-Steuerelement" umwandeln??? :o

Den "Edit-Modus" kannst Du auf Formularebene (Form-Objekt innerhalb Deines Formulars) abfragen, der ist im Fall dass das Event von einer Spalte in einem Tabellensteuerelement ausgelöst wurde 2 Ebenen höher als die Spalte, also ".Parent.Parent"
Leider reicht die .IsModified-Eigenschaft des Formulars nicht aus (die steht bei allen neuen Datensätzen nämlich auf false) daher musst Du zunächst fragen ob der aktuelle Datensatz neu ist, und falls nicht ob er denn modifiziert wurde. Alles andere wäre dann ein Datensatz der sich "nicht im Edit-Modus" befindet.

Code: Alles auswählen

Sub KeyPress(oEvent)

	if oEvent.Source.Model.Parent.Parent.IsNew then
		' dieser Datensatz ist NEU – er sollte gespeichert werden …
	elseif oEvent.Source.Model.Parent.Parent.IsModified then
		' dieser Datensatz wurde GAENDERT – er sollte gespeichert werden …
	elseif true then
		' der Datensatz ist weder neu noch veraendert – hier kann was weiss ich gemacht werden ...
	end if

End Sub
Du kannst evtl. auch beide Fragen mit "OR" verbinden

Code: Alles auswählen

Sub KeyPress(oEvent)

	if oEvent.Source.Model.Parent.Parent.IsNew OR oEvent.Source.Model.Parent.Parent.IsModified then
		' dieser Datensatz ist NEU oder wurde GAENDERT – er sollte gespeichert werden …
	else
		' der Datensatz ist weder neu noch veraendert – hier kann was weiss ich gemacht werden ...
	end if

End Sub
Ich bin mir allerdings ziemlich sicher, dass es mit der [ENTER]-Taste NICHT funktioniert, denn die [ENTER]-Taste und die Pfeiltasten [PfeilOben] [PfeilUnten] sind so weit ich weiss die einzigen Tasten, die das Key-Press Event NICHT auslösen, da sie direkt zu einem Datensatz- bzw. Kontrollelementwechsel führen. [BildAuf], [BildAb], [Pos1] und [Ende] haben u.U. auch Probleme dieses Event auszulösen, kommt drauf an, wie der aktuelle Zustand des Formulars ist, und was gerade mit dem Fokus ausgewählt wurde. Tastenkombinationen verhalten sich da noch unberechenbarer, ein [Strg]+[ENTER] löst z.B. korrekt aus, [Strg]+[PfeilOben] oder [Strg]+[PfeilUnten] lösen kein Key-Press-Event aus ...
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

MaddinR
Beiträge: 42
Registriert: Fr 17. Jun 2011, 12:19

Re: Abfrage auf Ist-Edit-Modus

Beitrag von MaddinR » Sa 14. Feb 2015, 17:28

gogo hat geschrieben:Schockschwerenot! Könntest Du bitte "Tabellensteuer-Element" in "Tabellensteuerelement" oder "Tabellen-Steuerelement" umwandeln???
:D Sorry... beim nächsten Mal schalte ich die Autokorrektur aus. Und nochmal sorry, ich war einige Tage "offline". Erst mal Danke für Deine Antwort, aber ich glaube, Du hast mich missverstanden. Ich erkläre es noch mal - und ich hoffe, verständlicher.

Stell Dir auf einem Base-Formular 2 Tabellen-Steuerelemente (Grid-Controls) nebeneinander vor, jedes hat einen eigenen Formularnamen und greift auf einen eigenen Datenbestand zu. Das linke Grid-Ctrl ist Read-Only, das heisst, ich kann mich zwar rauf und runter (mit Zeilen-Cursor, analog eines List-Ctrls) bewegen, Enter drücken und Doppel-Clicken, aber ein Cell-Edit ist nicht möglich. Nach Enter oder Doppelclick wird in diesem linken Grid-Ctrl ein bestimmter Spaltenwert des aktuellen Datensatzes ermittelt. Und dieser besondere Wert wird druch die Makro-Nachbearbeitung im rechten Grid-Ctrl in dem dort selektierten aktuellen Satz eingetragen. Das funktioniert soweit bestens.

Ist eigentlich ganz einfach, links befindet sich ein Kontenrahmen (ro), rechts sind Buchungssätze (rw). Links wähle ich die passende Kontonummer zum rechten Datensatz mit Enter oder Doppelkick aus, die dann eben maschinell auf den rechten Datensatz übernommen wird.

Das Problem ist, das rechte Grid-Ctrl ist "editable". Das heisst, ich kann zu dem automatisch übernommenen Spaltenwert auch noch eine manuelle Ergänzung vornehmen. Und genau dann, wenn ich diesen Zell-Edit-Mode mit Enter verlasse, knallts... weil der Key-Press-Handler des linken Grids reagiert... genauer gesagt knallt es in meinem Eventhandler, der dann zur Weiterbehandlung springen möchte, was er aber nicht darf, denn Enter kam ja vom "rechten" Grid-Ctrl. Zur Lösung müsste ich jetzt in meinem Keypress-Handler abfragen "Ist Keypress = Enter vom rechten Grid? Dann Return und nichts machen".

Wie kann ich in meinem Event-Handler abfragen, ob die Enter-Taste aus dem rechten Grid-Ctrl kommend gedrückt wurde? Das würde das Problem lösen.
gogo hat geschrieben:Den "Edit-Modus" kannst Du auf Formularebene (Form-Objekt innerhalb Deines Formulars) abfragen, der ist im Fall dass das Event von einer Spalte in einem Tabellensteuerelement ausgelöst wurde 2 Ebenen höher als die Spalte, also ".Parent.Parent"
Ich brauche keine Infos darüber, ob sich ein Datensatz im rechten Grid-Ctrl geändert hat oder nicht, das ist mir nicht wichtig. Ich muss nur die Enter-Taste beim Beenden des Zelledits abfangen, weil eben unglücklicherweise auch ein anderer Eventhandler auf Keypress reagiert.
gogo hat geschrieben:Ich bin mir allerdings ziemlich sicher, dass es mit der [ENTER]-Taste NICHT funktioniert,
Doch, das was ich da mache, funktioniert bestens. Sie sieht mein Eventhandler aus. Mein Problem ist, dass die Funktion GetNormName(EH_KEYPRESS) nur dann aufgerufen werden darf, wenn Enter im linken Grid-Ctrl. gedrückt wurde, bei Enter im rechten Grid-Ctrl darf er dort NICHT hin.

Code: Alles auswählen

Sub OnKeyPress(oEvt)
    If (oEvt.KeyCode = com.sun.star.awt.Key.RETURN) Then
	    GetNormName(EH_KEYPRESS)
    EndIf 
End Sub
Gruß, Maddin

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Abfrage auf Ist-Edit-Modus

Beitrag von F3K Total » Sa 14. Feb 2015, 18:17

Moin,
vielleicht kommst Du mit

Code: Alles auswählen

thiscomponent.currentcontroller.selection
und xray/mri weiter.
Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Abfrage auf Ist-Edit-Modus

Beitrag von gogo » Sa 14. Feb 2015, 18:36

Ich orakle mal: das Key-Press-Ereignis hängt bei Dir derzeit am Window-Element (also am Fenster des Formulars) und nicht am Grid-Control? Wie wär's dann das Key-Press-Ereignis einfach dem gewünschten Grid-Control zuzuordnen?

Das auslösende Element bekommst Du vermutlich auch über die .Source-Eigenschaft des "oEvt", da sich logischerweise die auslösenden Events unterschieden, haben sie auch unterschiedliche Properties und man kann keine eindeutige Syntax angeben. Falls z.B. ein Klick auf einen Button ein Event auslöst, dann bekommt man den Namen des Buttons über oEvent.Source.Model.Name ...
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

MaddinR
Beiträge: 42
Registriert: Fr 17. Jun 2011, 12:19

Re: Abfrage auf Ist-Edit-Modus

Beitrag von MaddinR » So 15. Feb 2015, 15:39

Hallo

Das war jetzt eine völlig verrückte Situation, für die ich noch nicht alles "geklärt" habe .... aber es funktioniert jetzt.... allerdings über einen kleinen Umweg. :roll:

1. Ich habe 2 fast identische Formulare, die sich nur geringfügig in der Verarbeitung unterscheiden. Beide Formulare "beherbergen" jeweils 2 nebeneinandergestellte Grid-Controls. Das linke Grid enthält Kostenarten-Nr, quasi als Defaultwerte. Das rechte Grid-Control enthält Umsatz-Datensätze, die mit der Kostenart aus dem linken Grid ergänzt werden.

2. Dieses Crash-Problem durch die Enter-Taste besteht NUR in dem einen Formular! (Nicht nachvollziehbar)
3. Die Eventhandler in beiden Formularen sind immer am jeweiligen Control gebunden, nicht am Formular

4. Die Taborder hat sich zudem auch noch "verwirrend auswirkend" eingebracht, was ich dann eher zufällig beim Debuggen entdeckt habe. In dem einen Formular im "rechten" Grid-Control hat bei Enter-Taste im letzten (Bottom-Right) Feld ein Tab-Sprung stattgefunden, im anderen Formular passierte nichts. Beim Ersten Auftreten guckt man erst mal blöd und versteht nicht, warum das unterschiedlich ist. ... aber das lag am Customizing der Tab-Order.

Dieser Versuch im Key-Eventhandler hat leider nicht hingehauen.... keine Ahnung warum nicht.

Code: Alles auswählen

	Dim oForm as Object
	Dim oGrid as Object
	Dim hF  as integer
	oForm = ThisComponent.drawpage.forms.getByName("Form_GridCtrl_Umsaetze") 			
	oGrid = oForm.getByName("GridCtrl_Umsaetze") 								

'     ThisComponent.getCurrentController().getControl(oGrid).setFocus()                    SetFocus() funktioniert
      hF = ThisComponent.getCurrentController().getControl( oGrid ).hasFocus()             hasFocus() ergibt immer 0

Erfolgreich war dann das (jeweils einen Eventhandler für SetFocus):

Code: Alles auswählen

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

Sub OnKeyPress(oEvt)
        If (IsFocus = 1) then
    	    If (oEvt.KeyCode = com.sun.star.awt.Key.RETURN) Then
                 GetNormName(EH_KEYPRESS)
	    EndIf 
    EndIf 
End Sub

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

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

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

Sub OnSetFocus_GridCtrl_DefaultValues()
	IsFocus = 1
End Sub

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

Sub OnSetFocus_GridCtrl_Umsaetze()
	IsFocus = 2
End Sub

'=======================================================================================================================
Danke für Eure Unterstützung, die mich dann letztendlich auf den richtigen Weg gebracht hat.
Gruß, Maddin


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten