Re: [de-users] Makro Datensatzspeicherung abbrechen

2018-08-15 Diskussionsfäden Gerhard Weydt

Hallo Robert,

Am 15.08.2018 um 20:43 schrieb Robert Großkopf:

Hallo Gerhard,

ich gehe davon aus, dass dein oField das Modell des Steuerelements ist.
(Zur Sicherheit: in meinem Testformular habe ich das über
oField=
ThisComponent.Drawpage.Forms.getByName("MainForm").getByName("Mark")
erreicht.)
Dann kannst du mit
if oField.getPropertySetInfo.hasPropertyByName("BorderColor")
abfragen, ob die Eigenschaft vorhanden ist oder nicht.

Passt genau! Ich lasse allerdings das Event beim Laden des Formulars
abfragen.
oForm = oEvent.Source
FOR i = 0 TO oForm.Count - 1
oField = oForm.getByIndex(i)
...

Na klar, da bist du direkter bei der Form. Das war nur zur Verdeutlichung.

Wo hast Du alle diese Befehle her? Ich habe mir da einen Wolf gesucht
und schließlich die Geschichte mit dem Aufrufen von BorderColor und
gleichzeitigem Errorsprung sowie dem Abspeichern aller Felder, die das
überleben, in ein Array zur weiteren Verwendung ausgetüftelt.
Grundsätzlich habe ich die Bücher zu Makros von Bernard Marcelly und 
Laurent Godard und von Thomas Krumbein, die decken ja schon sehr viel ab.
Dass es die PropertySetInfo gibt, hatte ich früher schon festgestellt 
und auch schon mal durch Doppelklick einen "Drill-down" gemacht und die 
Liste der Eigenschaften angeschaut, deshalb habe ich diesmal aber gar 
nicht dort geschaut, ob ich da was finde, sondern gleich Xray von 
Bernard Marcelly (da gibt es auf seiner Seite auch eine deutsche 
Übersetzung von mir) eingesetzt, was eine Riesenhilfe bei der 
Makro-Entwicklung ist.
In diesem Fall hatte ich im Makro, nachdem ich zu oField gelangt war, 
die Zeile "Xray oField" eingegeben. Dann sehe ich alle Eigenschaften des 
Objekts und in weiteren Ansichten alle Methoden, Listener usw.Der erste 
Gedanke war, eine Schleife über die Eigenschaften laufen zu lassen, aber 
die PropertySetInfo hat eine Struktur, mit der ich zunächst mal nichts 
anfangen kann. Dann habe ich bei den Methoden geschaut. Dann war das vom 
Namen her sofort klar, dass das genau der gewünschte Befehl war.
Das ist das Prinzip: ich schaue bei dem fraglichen Objekt die 
Eigenschaften und Methoden durch, was vom Namen her in Frage kommen 
könnte, schaue ich näher an, erst mal in der API-Referenz von 
LibreOffice. Auch wenn da meist nur ein Satz steht, reicht das in den 
meisten Fällen, um die Spreu vom Weizen zu trennen. Ansonsten dann 
Internetsuche nach diesen Eigenschaften und Methoden oder Ausprobieren, 
was sie liefern.

Gruß

Robert

Gruß

Gerhard

--
Liste abmelden mit E-Mail an: users+unsubscr...@de.libreoffice.org
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy


Re: [de-users] Makro Datensatzspeicherung abbrechen

2018-08-15 Diskussionsfäden Robert Großkopf
Hallo Gerhard,
> 
> ich gehe davon aus, dass dein oField das Modell des Steuerelements ist.
> (Zur Sicherheit: in meinem Testformular habe ich das über
> oField=
> ThisComponent.Drawpage.Forms.getByName("MainForm").getByName("Mark")
> erreicht.)
> Dann kannst du mit
> if oField.getPropertySetInfo.hasPropertyByName("BorderColor")
> abfragen, ob die Eigenschaft vorhanden ist oder nicht.

Passt genau! Ich lasse allerdings das Event beim Laden des Formulars
abfragen.
oForm = oEvent.Source
FOR i = 0 TO oForm.Count - 1
oField = oForm.getByIndex(i)
...

Wo hast Du alle diese Befehle her? Ich habe mir da einen Wolf gesucht
und schließlich die Geschichte mit dem Aufrufen von BorderColor und
gleichzeitigem Errorsprung sowie dem Abspeichern aller Felder, die das
überleben, in ein Array zur weiteren Verwendung ausgetüftelt.

Gruß

Robert
-- 
Homepage: http://robert.familiegrosskopf.de
LibreOffice Community: http://robert.familiegrosskopf.de/map_3


-- 
Liste abmelden mit E-Mail an: users+unsubscr...@de.libreoffice.org
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy


Re: [de-users] Makro Datensatzspeicherung abbrechen

2018-08-15 Diskussionsfäden Gerhard Weydt

Hallo Robert,

ich gehe davon aus, dass dein oField das Modell des Steuerelements ist.
(Zur Sicherheit: in meinem Testformular habe ich das über
oField= ThisComponent.Drawpage.Forms.getByName("MainForm").getByName("Mark")
erreicht.)
Dann kannst du mit
if oField.getPropertySetInfo.hasPropertyByName("BorderColor")
abfragen, ob die Eigenschaft vorhanden ist oder nicht.

Gruß

Gerhard

Am 15.08.2018 um 15:54 schrieb Robert Großkopf:

Hallo Gerhard,

das mit dem Abbrechen der Speicherung klappt jetzt gut. Alle Felder, die
ausgefüllt werden müssen, sind rot umrandet, Fehlermeldung beim
Nichtausfüllen.

Einen Schönheitsfehler habe ich noch, den ich mit einem Würgarraound
gelöst habe:
Nicht alle Formularfelder, die
oField.supportsService("com.sun.star.form.DataAwareControlModel")
unterstützen, kennen auch
oField.BorderColor
(z.B. ein Markierfeld)
Ich möchte nicht lange suchen, welche Felder das sind. Ich habe einfach mit
ON LOCAL ERROR GOTO KeinRand
...
Kein Rand:
Einen Sprung eingebaut.

Gibt es irgendeine Möglichkeit, bei einem Objekt ohne solche Klimmzüge
abzufragen, ob eine Eigenschaft überhaupt vorhanden ist?

Gruß

Robert



--
Liste abmelden mit E-Mail an: users+unsubscr...@de.libreoffice.org
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy


Re: [de-users] Makro Datensatzspeicherung abbrechen

2018-08-15 Diskussionsfäden Robert Großkopf
Hallo Gerhard,

das mit dem Abbrechen der Speicherung klappt jetzt gut. Alle Felder, die
ausgefüllt werden müssen, sind rot umrandet, Fehlermeldung beim
Nichtausfüllen.

Einen Schönheitsfehler habe ich noch, den ich mit einem Würgarraound
gelöst habe:
Nicht alle Formularfelder, die
oField.supportsService("com.sun.star.form.DataAwareControlModel")
unterstützen, kennen auch
oField.BorderColor
(z.B. ein Markierfeld)
Ich möchte nicht lange suchen, welche Felder das sind. Ich habe einfach mit
ON LOCAL ERROR GOTO KeinRand
...
Kein Rand:
Einen Sprung eingebaut.

Gibt es irgendeine Möglichkeit, bei einem Objekt ohne solche Klimmzüge
abzufragen, ob eine Eigenschaft überhaupt vorhanden ist?

Gruß

Robert
-- 
Homepage: http://robert.familiegrosskopf.de
LibreOffice Community: http://robert.familiegrosskopf.de/map_3


-- 
Liste abmelden mit E-Mail an: users+unsubscr...@de.libreoffice.org
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy


Re: [de-users] Makro Datensatzspeicherung abbrechen

2018-08-13 Diskussionsfäden Gerhard Weydt

Hallo Robert,

 du hast natürlich recht, gerade bezüglich meiner Aussage, dass manches 
nicht zur Verfügung steht, wäre die Abfrage des 
"com.sun.star.form.runtime.FormController" besser. Vielleicht habe ich 
das auch an manchen Stellen so rum abgefragt. Aber offenbar ist es bei 
meinen Makros in der Regel nur wichtig, dass es nur einmal läuft, alle 
benötigten Objekte finde ich offenbar auf beiden Wegen. Und ich nehme 
an, dass die Abfrage auf ImplementationName genauso gut ist.


Gruß

Gerhard

Am 13.08.2018 um 15:46 schrieb Robert Großkopf:

Hallo Gerhard,


Noch was: dieses Ereignis wird zweimal ausgelöst, im einen Fall steht
manches nicht zur Verfügung, was im Makro benötigt wird. Ich verwende
daher für Makros für dieses Ereignis immer zu Beginn:
if evt.source.supportsService("com.sun.star.sdbc.RowSet") then exit
function
'  Ereignis wird zweimal angestoßen. Ein Aufruf wird ignoriert

Die obige Zeile verstehe ich so nicht richtig:
Gerade wenn der Service unterstützt wird sollte doch die Funktion
ablaufen, oder?

Jedenfalls läuft die Funktion bei mir jetzt prima mit
oForm = oEvent.Source
IF oForm.ImplementationName = "org.openoffice.comp.svx.FormController" THEN

Gruß

Robert



--
Liste abmelden mit E-Mail an: users+unsubscr...@de.libreoffice.org
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy


Re: [de-users] Makro Datensatzspeicherung abbrechen

2018-08-13 Diskussionsfäden Robert Großkopf
Hallo Gerhard,

>> Noch was: dieses Ereignis wird zweimal ausgelöst, im einen Fall steht
>> manches nicht zur Verfügung, was im Makro benötigt wird. Ich verwende
>> daher für Makros für dieses Ereignis immer zu Beginn:
>> if evt.source.supportsService("com.sun.star.sdbc.RowSet") then exit
>> function
>> '  Ereignis wird zweimal angestoßen. Ein Aufruf wird ignoriert

Die obige Zeile verstehe ich so nicht richtig:
Gerade wenn der Service unterstützt wird sollte doch die Funktion
ablaufen, oder?

Jedenfalls läuft die Funktion bei mir jetzt prima mit
oForm = oEvent.Source
IF oForm.ImplementationName = "org.openoffice.comp.svx.FormController" THEN

Gruß

Robert
-- 
Homepage: http://robert.familiegrosskopf.de
LibreOffice Community: http://robert.familiegrosskopf.de/map_3


-- 
Liste abmelden mit E-Mail an: users+unsubscr...@de.libreoffice.org
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy


Re: [de-users] Makro Datensatzspeicherung abbrechen

2018-08-13 Diskussionsfäden Robert Großkopf
Hallo gerhard,

> Noch was: dieses Ereignis wird zweimal ausgelöst, im einen Fall steht
> manches nicht zur Verfügung, was im Makro benötigt wird. Ich verwende
> daher für Makros für dieses Ereignis immer zu Beginn:
> if evt.source.supportsService("com.sun.star.sdbc.RowSet") then exit
> function
> '  Ereignis wird zweimal angestoßen. Ein Aufruf wird ignoriert

Prima, ich habe bisher immer die Implementationen genommen. Außerdem
bringt mich das auch an anderer Stelle weiter: Ich wusste nicht, wie ich
Fehlermeldungen unterbinden kann, wenn ein bestimmtes Ereignis nicht zur
Verfügung steht.

Das mit der Funktion werde ich gleich ausprobieren.

Gruß

Robert
-- 
Homepage: http://robert.familiegrosskopf.de
LibreOffice Community: http://robert.familiegrosskopf.de/map_3


-- 
Liste abmelden mit E-Mail an: users+unsubscr...@de.libreoffice.org
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy


Re: [de-users] Makro Datensatzspeicherung abbrechen

2018-08-13 Diskussionsfäden Gerhard Weydt

Hallo Robert,

Makros, die an einer solchen Stelle wie deiner aufgerufen werden, 
sollten als function mit einem Rückgabewert vom Typ boolean und nicht 
als sub implementiert werden. Die Speicherung in der Datenbank erfolgt 
nur, wenn TRUE zurückgegeben wird, bei Rückgabewert FALSE bleibt das 
Formular im Zustand "geändert", man kann aufgrund der Meldung die 
Fehleingabe verändern. Das ist ja doch wohl genau das, was du suchst.
Noch was: dieses Ereignis wird zweimal ausgelöst, im einen Fall steht 
manches nicht zur Verfügung, was im Makro benötigt wird. Ich verwende 
daher für Makros für dieses Ereignis immer zu Beginn:

if evt.source.supportsService("com.sun.star.sdbc.RowSet") then exit function
'  Ereignis wird zweimal angestoßen. Ein Aufruf wird ignoriert

Gruß

Gerhard

Am 13.08.2018 um 11:59 schrieb Robert Großkopf:

Hallo *,

ich rechne zwar weniger mit einer Antwort, aber vielleicht gibt es ja
doch ein kleines Wunder ...

Ich bin dabei eine Datenbank zu erstellen, die zeigen soll, wie der
Inhalt von Formularen auf Validität überprüft werden kann. Das dazu
notwendige Makro habe ich an "Vor der Datensatzaktion" des Formulars
gebunden.
Wenn ich die richtige Implementation auswähle kann ich dort über
-
oFormOperations = oForm.FormOperations  
oFormOperations.execute(oFormFeature.UndoRecordChanges)
-
die Eingabe stoppen (siehe auch Handbuch Base). Nur leider sind dann
sämtliche neuen Eingaben weg, das Formular also auf dem vorhergehenden
Stand und die Meldung "Keine Änderung vorhanden" erfolgt auch noch. Die
entsprechende Meldung, dass in bestimmten Feldern Inhalt fehlt kann ich
also getrost vergessen - jetzt fehlt er überall.

Gibt es irgendeine Möglichkeit, das Abspeichern zu unterbrechen ohne
dass gleich alle Neueingaben weg sind? Ich habe schon versucht, statt
UndoRecordChanges einfach wieder das aktuelle Formular über die
Zeilennummer aufzurufen. Dann lande ich aber leider in einer Schleife,
die mir immer wieder schön meine Meldung zu fehlenden Inhalten auf dem
Schirm bringt.

Gruß

Robert



--
Liste abmelden mit E-Mail an: users+unsubscr...@de.libreoffice.org
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy