Base: hasFocus beim GridControl

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

Moderator: Moderatoren

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

Base: hasFocus beim GridControl

Beitrag von juetho »

Hallo, ich möchte wissen, ob ein GridControl in einem Formular aktuell den Fokus hat (also in Bearbeitung durch den Benutzer ist). Insbesondere möchte ich beim Ereignis <strike>"Nach dem Aktualisieren"</strike> "Nach dem Datensatzwechsel" des Formulars unterscheiden:
  • Wenn das Formular den Fokus hat, werden bestimmte Prüfungen benötigt. (Ob die in einer anderen Routine ausgeführt werden oder direkt im EventHandler, ist hier unwichtig.)
  • Wenn das Formular nicht den Fokus hat, soll das übergangen werden. Das gilt insbesondere dann, wenn andere Stellen im Formular oder in anderen Teilformularen eine Datenbank-Aktion auslösen.
So etwas klappt jedenfalls nicht:

Code: Alles auswählen

Sub details_changeDataRow(oEvent as Object)
  oGrid = thisComponent.drawpage.forms.frmDetails.grid
  'xray oGrid
  if not oGrid.hasFocus then
    exit Sub
  end if
  rem anderenfalls die eigentlich gewünschten Prüfungen
End Sub
Fehlermeldung: "Eigenschaft oder Methode nicht gefunden: hasFocus" Wie bekomme ich einen Wert für hasFocus? Mit xray finde ich keine geeignete Eigenschaft oder Methode. Die API-Referenz verweist nur auf das Interface XWindow2; ich kann nicht erkennen, wie ich von oGrid auf XWindow2-Elemente zugreifen könnte.

Danke für Hinweise! Jürgen

Korrektur: Nicht "Datensatzaktion", sondern "Datensatzwechsel" ist gemeint.
Zuletzt geändert von juetho am Di, 06.11.2012 13:03, insgesamt 2-mal geändert.
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: [erledigt] Base: hasFocus beim GridControl

Beitrag von juetho »

Selbst gefunden. Der "normale" Weg über ein View-Objekt, um den Fokus zu setzen, funktioniert auch bei dieser Aufgabe:

Code: Alles auswählen

Sub details_changeDataRow(oEvent as Object)
  oGrid = thisComponent.drawpage.forms.frmDetails.grid
  oDocView = thisComponent.getCurrentController
  oCtrl = oDocView.getControl(oGrid)
  if not oCtrl.hasFocus then
    exit Sub
  end if
End Sub
Nun kann ich über weitere Probleme nachdenken. 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: hasFocus beim GridControl

Beitrag von juetho »

Leider doch nicht gelöst. Wenn ich mit der Maus von einer Zelle zur anderen wandere, wird oCtrl.hasFocus als FALSE angesehen. Wenn ich bedenke, wie die Komponenten bei OO strukturiert sind, ist das auch erklärlich: Es ist nun mal eine einzelne Zelle aktiv; also muss oCtrl.hasFocus (bezogen auf das Grid) als false angesehen werden. Vermutlich muss ich die Abfrage, ob der Datensatzwechsel durch Benutzereingabe im Grid oder "von außen" über das Formular erfolgt, über irgendeinen Service steuern.

Ich verwende vorerst eine Notlösung mit einer (innerhalb des Moduls) globalen Variablen:

Code: Alles auswählen

Dim detailsGrid_hasFocus as Boolean 

rem das Ereignis "Fokuserhalt" beim Grid
Sub details_grid_focusOn(oEvent as Object)
  detailsGrid_hasFocus = true
End Sub

rem das Ereignis "Fokusverlust" beim Grid
Sub details_grid_focusOff(oEvent as Object)
  detailsGrid_hasFocus = false
End Sub

rem die Prüfung beim Ereignis "Nach dem Datensatzwechsel"
Sub details_changeDataRow(oEvent as Object)
  if not detailsGrid_hasFocus then
    exit Sub
  end if
rem usw. die Prüfungen während der Benutzereingaben
Für eine bessere Lösung (ohne globale Variable, am besten nur innerhalb des EventHandlers details_changeDataRow) bin ich weiterhin offen. Jürgen

Nachtrag (07.11.2012 um 8.50 Uhr): Die Notlösung genügt noch nicht. Damit wird das Ereignis "Fokusverlust" beim Grid auch dann ausgelöst, wenn eine bestimmte Zelle innerhalb des Grids aktiviert wird. Ich habe jetzt für jede einzelne Spalte beim Ereignis "Fokuserhalt" die Routine details_grid_focusOn festgelegt. Das scheint endlich zu klappen.
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Antworten