Tabellenereignis automatische Uhrzeitabfrage

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

Moderator: Moderatoren

Benutzeravatar
Faol
***
Beiträge: 74
Registriert: Di, 26.01.2016 21:18

Tabellenereignis automatische Uhrzeitabfrage

Beitrag von Faol » Fr, 04.05.2018 14:58

Hallo,

ich nutze aus diesem Thread (vielen Dank an Uli2222) das Makro für eine automatische Uhr in einem Tabellenblatt.
Nun brauch ich eine Erweiterung, in Form eines Tabellenereignisses, dass auf diese Uhr reagiert.
Siehe Beispieldokument:
ZeitEvent.ods
(21.67 KiB) 29-mal heruntergeladen
In diesem Doku, sind 2 Makros, das eine ist das Makro für die Uhrzeit, das andere
das Event-Makro welches in diesem Beispiel schlicht einen Zähler im Tabellenblatt auslösen soll,
sobald die Uhrzeit erneuert wird.

Leider erfolgt eine Reaktion nur bei manueller Änderung der angegebenen Zelle.
Dieser Uhren-Automatismus funktioniert nicht.

Gibt es eine Möglichkeit, dass das Tabellen-Event auch auf die Uhr reagiert?


Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.5
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

ChristianAC_

Re: Tabellenereignis automatische Uhrzeitabfrage

Beitrag von ChristianAC_ » Fr, 04.05.2018 16:53

Guten Tag Faol,
schreibe in F14 =EACH_SECOND_ONE_PULSE(C10)
und ein Makromodul für diese Function:

Code: Alles auswählen

Option Explicit
global i_will_be_incremented as Long
Function each_second_one_pulse(Param_loest_nur_Event_aus_und_wird_nicht_weiterverwendet) as Long
	i_will_be_incremented = i_will_be_incremented + 1
	each_second_one_pulse = i_will_be_incremented
End Function
Ich hoffe, das geht in die Richtung,wie Du es schreiben willst.
Gruß, ChristianAC

Benutzeravatar
Faol
***
Beiträge: 74
Registriert: Di, 26.01.2016 21:18

Re: Tabellenereignis automatische Uhrzeitabfrage

Beitrag von Faol » Sa, 05.05.2018 12:46

Hallo Christian,

ein sehr interessanten Code.
Mein Problem besteht allerdings immer noch. Deshalb werde ich meine Anfrage ein wenig erweitern.

Es geht um mehrere Datenlogger. Einer auf jedem PC.
Die Logdaten können nicht zum Triggern verwendet werden, da die Impulszeiten des Loggens
sehr unterschiedlich sind. Deshalb dachte ich an ein zeitgesteuertes Makro, welches in festgelegten Zeitabständen das Makro auslöst.

Da sonst „nichts“ auf diesen PCs passiert, kann das Makro ruhig jede Sekunde einmal angestoßen werden.
WENN Zeit „X“ erreicht ist, DANN „Aktion“, SONST „End Sub“

Es wäre allerdings besser wenn das Makro nur jede Minute oder alle X- Minuten einmal anspringt.
Nun hatte ich erwartet, dass durch die Uhr meiner Beispieldatei und über das von mir gesetzte Tabellenereignis
das dazugehörige Makro automatisch anspringt wenn die Uhr den Zellinhalt ändert. Das Makro wird allerdings nur bei
manueller Änderung der angegebenen Zelle ausgelöst.
Eine automatische Auslösung per Triggerzeitpunkt wird vom Tabellenereignis ignoriert.

Nun habe ich es zuvor auch mit einem Listener versucht. Dieser sollte auf die Zelle C10 reagieren.
Problem:
Die Uhr läuft nicht im Sekundentakt, sondern im Millisekundentakt oder noch schneller,
jedenfalls war das Makro nicht mehr zu beenden, ich musste OO mit dem Taskmanager abschießen.

Jetzt muss ich mir etwa anderes einfallen lassen.
Als nächstes werde ich versuchen Deine Funktion in Verbindung mit einem Listener zu nutzen,
die Long-Zahlen erfassen und in festgelegten Zeitabständen das Hauptmakro über den Listener starten.

Die Auslösung per Tabellenereignis ist damit hinfällig.

Viele Dank für Deine Idee.

Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.5
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

F3K Total
********
Beiträge: 3212
Registriert: Mo, 28.02.2011 17:49

Re: Tabellenereignis automatische Uhrzeitabfrage

Beitrag von F3K Total » So, 06.05.2018 19:54

Hi,
kurze Frage, du kennst Einfügen/Verknüpfung zu externen Daten?
Da kannst du das Aktualisierungsintervall frei einstellen. Und es gibt einen RefreshListener, der auf eben diese Aktualisierung reagiert.

Code: Alles auswählen

global oAreaLinkRefreshListener

Sub S_Register_AreaLinkRefreshListener
    oAreaLink = thiscomponent.AreaLinks(0)
    oAreaLinkRefreshListener = CreateunoListener("AreaLinkRefreshListener_","com.sun.star.util.XRefreshListener")
    oAreaLink.addRefreshListener(oAreaLinkRefreshListener) 
end sub

Sub S_Remove_AreaLinkRefreshListener
    oAreaLink = thiscomponent.AreaLinks(0)
    oAreaLink.RemoveRefreshListener(oAreaLinkRefreshListener) 
end sub

Sub AreaLinkRefreshListener_refreshed
    msgbox "hier kann jetzt ein Makro gestartet werden"
end sub

Sub AreaLinkRefreshListener_disposing
end sub
Beispieldateien anbei. Das Ganze geht auch mit DDE-Links.
  • Öffne Source.ods
  • Öffne Target.ods, Verküpfungen aktualisieren->ja, Makros erlauben -> ja, Verküpfungen aktualisieren->ja
  • ändere Source.ods, speichere die Datei
  • schau in Target.ods, was passiert.
HTH Gruß R
Dateianhänge
Source.ods
(7.84 KiB) 25-mal heruntergeladen
Target.ods
(10 KiB) 25-mal heruntergeladen

Benutzeravatar
Faol
***
Beiträge: 74
Registriert: Di, 26.01.2016 21:18

Re: Tabellenereignis automatische Uhrzeitabfrage

Beitrag von Faol » Fr, 11.05.2018 19:28

Hallo R,

vielen Dank für Deine ausführliche Beschreibung.
R hat geschrieben:kurze Frage, du kennst Einfügen/Verknüpfung zu externen Daten?
Ja, dieses kenne ich, aber nicht in der Kombination mit Deinem Makro.
Und wieder etwas dazu gelernt. :-D

Ich habe hin und her überlegt wie ich dieses in meinem Fall anwenden kann.
Zumal das Programm, welches ich geschrieben habe nicht für mich ist,
sondern für jemanden der einen möglichst intuitiven Ablauf benötigt, da
es nicht nur von ihm selbst bedient werden soll.

Da meine ersten Versuche das Makro über das Tabellenevent "Inhalte geändert" nicht funktionierte,
triggere ich es z.Z. mit dem Event "Auswahl geändert". Hier wird über einen Timer zunächst
der Cursor im Tabellenblatt von Zelle B1 auf C1 gesetzt und wieder zurück.
Nun läuft das Makro, wie gewünscht.
Im Augenblick warte ich noch auf eine Rückmeldung des zuküntigen Users.
Sollte das Programm bei ihm realen Testmodus nicht funktionieren,
bleibt erfreulicherweise Deine Listener Methode.

Zuvor hatte ich mit dem xModify-Listener und dem Event-LIstener Versuche gestartet
Beide waren aber nicht brauchbar.

Nun habe ich noch eine Frage zum Listener allgemein.
Ich benötige ein Methode, um den Listener anzuhalten.
Dazu habe ich ersteinmal eine Schaltfläche auf das Blatt gezeichnet und
habe dieser die "Sub S_Remove_AreaLinkRefreshListener" Routine zu gewiesen.
Der Listener läßt allerdings nicht stoppen.

Gibt es dafür eine spezielle Routine, sodaß der Listener nach Belieben
gestartet und gestoppt werden kann?

Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.5
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Antworten