[gelöst] Base: Fokusverlust verhindern nicht mit setFocus

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

[gelöst] Base: Fokusverlust verhindern nicht mit setFocus

Beitrag von juetho »

Bei einem Datumsfeld (nicht an Daten gebunden) möchte ich bei Fokusverlust prüfen, ob das Datum gewissen Bedingungen entspricht. Wenn nicht, sollte der Fokus in diesem Feld bleiben. Mit dem "üblichen" Verfahren für setFocus geht das nicht:

Code: Alles auswählen

Sub main_dateModified(oEvent as Object)
  oCtrl = oEvent.Source
  if Len(oCtrl.Text) <> 10 then   ' als Beispiel für eine Fehleingabe
    oDocView = thisComponent.getCurrentController()
    oDocView.getControl(oCtrl).setFocus
    exit Sub
rem usw.
Basic-Laufzeitfehler hat geschrieben:Type: com.sun.star.lang.IllegalArgumentException
Message: cannot coerce argument type during corereflection call!.
Die Meldung übersteigt zwar meine Englisch-Kenntnisse, aber ich kann mir die Ursache erklären: Fokusverlust beißt sich mit dem Setzen des Fokus. Wie kann ich trotzdem den Fokusverlust verhindern bzw. rückgängig machen? Das Ereignis "Text modifiziert" ist sehr ungünstig, weil dann nach jeder einzelnen Taste geprüft würde; das Ereignis "Modifiziert" steht leider nicht zur Verfügung. Danke für Tipps! Jürgen



Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören
Zuletzt geändert von juetho am So, 04.11.2012 11:27, insgesamt 1-mal geändert.
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
RobertG
********
Beiträge: 2070
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Base: Fokusverlust verhindern nicht möglich mit setFocus

Beitrag von RobertG »

Hallo Jürgen,

ich habe da mal ein bisschen rumprobiert. Das Problem ist nicht, dass Du das an den Focusverlust gebunden hast, sondern dass Du Dich in dem Makro auf oEvent.Source zurückbeziehen und dort Änderungen vollziehen willst. So ist es z.B. möglich, von dem Makro aus direkt das Feld per Namen anzusprechen und darauf anschließend den Fokus zurückzusetzen:

Code: Alles auswählen

Sub Modified(oEvent as Object)
  oCtrl = oEvent.Source
  if Len(oCtrl.Text) <> 10 then   ' als Beispiel für eine Fehleingabe	
  	oDoc=thisComponent
	oDrawpage=oDoc.Drawpage
	oForm=oDrawpage.Forms.getByName("Formular")
	oFeld=oForm.getByName("test")
    oDocView = thisComponent.getCurrentController()
    oDocView.getControl(oFeld).setFocus
   END IF
END Sub
Prinzipiell klappt es also, nur wie Du das eleganter hin bekommst - dazu fehlt mir jetzt einfach die Muße.

Gruß

Robert
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Base: Fokusverlust verhindern nicht möglich mit setFocus

Beitrag von juetho »

Hallo Robert,
RobertG hat geschrieben:So ist es z.B. möglich, von dem Makro aus direkt das Feld per Namen anzusprechen und darauf anschließend den Fokus zurückzusetzen:
Wenn das das ganze Problem war, dann lässt sich das ja leicht umgehen: entweder direkt mit dem mir bekannten Namen oder mit getByName(oEvent.Source.[Model.]Name). (Ich benutze gerne oEvent für den Fall, dass ich denselben EventHandler an mehr als ein Feld binden möchte.) Ich werde es morgen umsetzen und dann hier das fertige Verfahren einstellen (das sich vermutlich kaum von deinem Vorschlag unterscheiden wird).

Schönen Sonntag! Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Base: Fokusverlust verhindern nicht möglich mit setFocus

Beitrag von juetho »

Hallo Robert,
RobertG hat geschrieben:Prinzipiell klappt es also, nur wie Du das eleganter hin bekommst...
Zusammen mit meinem Zugriff auf oEvent ist mir das elegant genug:

Code: Alles auswählen

Sub main_dateModified(oEvent as Object)
  oCtrl = oEvent.Source.Model        ' das Model liefert sowohl Name als auch Text (Feldinhalt)
  oForm = oCtrl.Parent
  if Len(oCtrl.Text) <> 10 then
    oDateField = oForm.getByName(oCtrl.Name)    ' also das benötigte eigenständige Objekt
    oDocView = thisComponent.getCurrentController()
    oDocView.getControl(oDateField).setFocus
    exit Sub
rem usw. alles andere
Die Längenprüfung führt zu einem anderen Problem; aber das hat nichts mit "Fokusverlust" zu tun. Wenn ich danach frage, muss das ein eigenes Thema werden. Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: [gelöst] Base: Fokusverlust verhindern nicht mit setFocu

Beitrag von DPunch »

Servus

Warum nicht einfach

Code: Alles auswählen

oEvent.Source.setFocus
?
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: [gelöst] Base: Fokusverlust verhindern nicht mit setFocu

Beitrag von juetho »

DPunch hat geschrieben:Warum nicht einfach oEvent.Source.setFocus() ?
Ganz einfach: Weil ich setFocus nicht in diesem Zusammenhang gefunden habe und Roberts Vorschlag funktionierte. Dein Vorschlag ist natürlich einfacher; wieder etwas gelernt. :D Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Antworten