Seite 1 von 1

gelöst[Base] mysteriös: Beschriftungsfeld wird nicht geleert

Verfasst: Fr, 12.10.2012 13:57
von juetho
Ich habe ein seltsames Verhalten festgestellt, kann es leider nicht reproduzieren. Ich hatte gedacht, dass ich es mit einem Testformular zeigen könnte; dabei ist der Fehler aber auch nur die ersten beiden Male aufgetreten und danach nicht wieder. Vielleicht hat jemand etwas Ähnliches auch schon erlebt und kann etwas dazu sagen.

Aufbau des Formulars: Beschriftungsfeld lbl, Button btn, Tabellenkontrollfeld grid
Funktion: Per Button wird ein Datensatz weitergeblättert; der Inhalt eines Feldes wird im Beschriftungsfeld angezeigt.
Problem: Der vorherige Text des Beschriftungsfelds wird nicht entfernt. Effekt: Es stehen 2, 3, 4, 5... Texte übereinander.
Der Code des Makros zum Weiterblättern und zur Anzeige:

Code: Alles auswählen

Sub TestAdd
oForm = thisComponent.drawpage.forms.MainForm
thisComponent.lockControllers()
oForm.next
oForm.getByName("lbl").Label = oForm.grid.getByIndex(1).Text
rem oForm.getByName("lbl").Label = oForm.getString(7)
thisComponent.unlockControllers()
End Sub
Wenn der Text nicht aus dem Grid geholt wird, sondern direkt aus dem aktuellen Datensatz (d.h. das rem in die andere Zeile gesetzt wird), wird immer nur der aktuelle Text angezeigt. Alle Versuche mit und ohne lockControllers oder Verschieben in ein Unterformular hatten ursprünglich das gleiche Problem, aber es wird jetzt nicht mehr reproduziert. (Deshalb kann ich es auch nicht mit einem Screenshot verdeutlichen.)

Ein Ausweg besteht im Wechsel auf Textfelder, die direkt an das Formular gebunden werden. (Da habe ich aber andere Probleme, die hier nur ablenken würden.) Für zweckdienliche Hinweise wäre ich trotz der vagen Fehlerbeschreibung dankbar. Jürgen

Re: [Base] mysteriös: Beschriftungsfeld wird nicht geleert

Verfasst: Fr, 12.10.2012 16:57
von F3K Total
Hallo juetho,
mit OOo 3.3.0 kann ich das Problem nicht nachstellen, sehe immer nur einen Text, keine überlagerten.
juetho hat geschrieben:... wird immer nur der aktuelle Text angezeigt
Was ist anders, wenn Du den Text aus dem Grid holst?
Bei mir springt der Datensatzzeiger eine Zeile weiter und das Beschriftungsfeld zeigt den Text aus der entsprechenden Spalte des Kontrollfeldes?
Hast Du eventuell Unterformulare in deinem Formular, deren Nachladen das Grid beeinflusst?
Gruß R

PS:
Ich habe auch Formulare, in denen ich Tabellenspalten mit einem Labelfeld darstelle. Dort verwende ich das Formularereignis "nach dem Datensatzwechsel" zur Ausführung des Befüllmakros.

Re: [Base] mysteriös: Beschriftungsfeld wird nicht geleert

Verfasst: Sa, 13.10.2012 12:37
von juetho
Hallo R, danke für den Versuch einer Antwort. Die betreffende Tabelle und das Grid befinden sich eigentlich in einem Unterformular (nur im Testformular in MainForm). Die Beschriftungsfelder für die Anzeige habe ich mal ins Hauptformular, mal ins Unterformular gesetzt. Kein Unterschied.

Wenn oForm.next aufgerufen wird (bzw. eine andere move-Methode oder wenn der aktuelle Datensatz durch Maus-Klick festgesetzt wird), ist "nach dem Datensatzwechsel" natürlich der richtige Ansatzpunkt. In diesem Zusammenhang habe ich allerdings ein ganz anderes Problem (dazu folgt eine neue Diskussion); das Anzeigeproblem mit dem Beschriftungsfeld ist nur "nebenbei" aufgetreten.

Da ich das Problem nicht mehr reproduzieren kann (weder im Testformular noch im eigentlichen Formular), soll es hiermit zu den Akten gelegt werden. RIP. Jürgen

Re: [Base] mysteriös: Beschriftungsfeld wird nicht geleert

Verfasst: Do, 18.10.2012 19:26
von DPunch
Servus

Mal als Schuss ins Blaue:
Vom Gefühl her hört sich das Verhalten an wie ein nicht rückgängig gemachtes "lockControllers".
Kannst Du das Verhalten reproduzieren, wenn Du einfach mal

Code: Alles auswählen

thisComponent.lockControllers()
aufrufst (z.B. als einzigen Befehl in einer eigenen Prozedur, die Du nur einmal am Anfang durchlaufen lässt) und dann wie gewohnt die anderen Makros anschiebst?

Re: [Base] mysteriös: Beschriftungsfeld wird nicht geleert

Verfasst: Do, 18.10.2012 20:28
von juetho
Wow, das werde ich morgen mal testen. Bewusst ist mir dieser Fehler wohl nicht unterlaufen; aber durch das Zusammenspiel mehrerer Makros und vielleicht auch von Laufzeitfehlern ist das nicht auszuschließen. Ich werde berichten. Gruß Jürgen

Re: [Base] mysteriös: Beschriftungsfeld wird nicht geleert

Verfasst: Fr, 19.10.2012 10:29
von juetho
Bestätigt.
DPunch hat geschrieben:

Code: Alles auswählen

thisComponent.lockControllers()
Wenn einmalig ein unlockControllers nicht ausgeführt wird (wegen einer falschen Makro-Definition oder wegen eines Ablauffehlers), bleibt der vorherige Inhalt erhalten. Ob sich das auch auf andere Controls auswirkt oder andere Ursachen haben kann, habe ich nicht geprüft. Wichtig ist, dass eine Ursache gefunden wurde. Eigentlich ist ja klar, dass zu einem lockControllers ein unlockControllers gehören muss; aber manchmal wird es übersehen.

Danke für den Hinweis! Jürgen

Re: gelöst[Base] mysteriös: Beschriftungsfeld wird nicht gel

Verfasst: So, 21.10.2012 20:15
von DPunch
Servus
juetho hat geschrieben:Ob sich das auch auf andere Controls auswirkt
Das tut es definitiv in verschiedensten Formen, daher kam mir das "mysteriöse" Verhalten auch irgendwie entfernt bekannt vor.

Es lohnt sich daher immer, statt eines einfachen

Code: Alles auswählen

thisComponent.unlockControllers
ein

Code: Alles auswählen

Do While thisComponent.hasControllersLocked
	thisComponent.unlockControllers
Loop
zu verwenden.
Somit ist die Benachrichtigung der Controller wenigstens nach dem nächsten erfolgreichen Makro-Durchlauf wieder freigegeben, nicht erst nach Neuladen des Dokuments.