Tabelle anspringen aus Dialog funktioniert nicht

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Tabelle anspringen aus Dialog funktioniert nicht

Re: Tabelle anspringen aus Dialog funktioniert nicht

von DPunch » Do, 27.01.2011 09:34

Aloha
insertfunnyname hat geschrieben:
Was genau schlägt fehl?
Dort funktioniert der Sprung in Sheet1 nicht. Es kommt zu keinem Fehler, der Sprung wird einfach nicht ausgeführt.
Lässt sich nicht reproduzieren, bei mir (Win XP OOo 3.2.1) funktioniert das Anspringen einer Tabelle über das Ereignis "Dokument öffnen" absolut reibungslos.
Habe das auch grad mal bei Deiner Beispieldatei ausprobiert, keinerlei Probleme.

Re: Tabelle anspringen aus Dialog funktioniert nicht

von insertfunnyname » Mi, 26.01.2011 11:01

Hallo und danke erstmal für die Antworten.

Sorry für die etwas verkorkste Erklärung des Problems. Ich versuchs nochmal anhand eines einfachen Beispiels zu erklären:

Ich habe ein calc-Dokument mit 4 Tabellen: Sheet1, Sheet2, Sheet3 und Sheet4. Speichert man das Dokument nun mit aktivem Sheet4 wird bei jedem öffnen Sheet4 aktiviert (Standardverhalten OO-Calc).
Auf jedem Sheet befindet sich eine Schaltfläche, klickt man darauf wird die Sub jmp2tbl1 ausgeführt.
Das funktioniert, es wird immer Sheet1 angesprungen! Verwendet man statt ThisComponent CurrentComponent gehts übrigens nicht. NoSuchElement-Fehler

Die sub initDoc wird bei Ereignis Ansicht wurde erzeugt / OnViewCreated ausgeführt.
Was genau schlägt fehl?
Dort funktioniert der Sprung in Sheet1 nicht. Es kommt zu keinem Fehler, der Sprung wird einfach nicht ausgeführt.
Wenn Du nun beim OnViewCreated-Event ein Makro laufen lässt, wird dadurch offensichtlich für diese Zeit die Kommunikation zwischen View und Model unterbrochen.
Änderungen, die Du in dieser Zeit über den Controller machst, sind dahingehend wirkungslos, dass der Controller sich aus dem Model direkt danach die .ViewData holt und die dortigen Einstellungen anwendet.
Scheint so. Das Laden des Dokuments und Erzeugen der Anzeige ist also doch noch nicht fertig.

Interessant ist übrigens wenn man xray aktiviert. In diesem Falle wird dort ja die Makroausführung angehalten. Das calc-Dokument steht dann in Sheet1 mit Fokus auf Zelle A1 (ThisComponent.CurrentController..ActiveSheet.Name="Sheet1"). Nach Beenden von xray wird dann wieder Sheet4 angesprungen.

Code: Alles auswählen

public sub initDoc
'DEBUG mit xray
 'GlobalScope.BasicLibraries.loadLibrary("XrayTool")

 'xray ThisComponent
 'xray ThisComponent.CurrentController

 jmp2tbl1
 
end sub

public sub jmp2tbl1
 msgbox("Tabelle 1 wird angesprungen.")
 ThisComponent.CurrentController.SetActiveSheet(ThisComponent.Sheets.getByName("Sheet1"))
end sub
Jetzt bräuchte ich also entweder einen Event der erst generiert wird wenn wirklich alles fertig geladen und dargestellt ist oder müsste im .ViewData manipulieren.

Laut xray gibts da aber nichts zu manipulieren:
xray thiscomponent.currentcontroller.model.viewdata
Count long 1 pseudo-prop, read-only
Dbg_Methods string <...> basic prop, read-only
Dbg_Properties string <...> basic prop, read-only
Dbg_SupportedInterfaces string <...> basic prop, read-only
ElementType type pseudo-prop, read-only
ImplementationId []byte pseudo-prop, read-only
ImplementationName string <...> pseudo-prop, read-only
SupportedServiceNames []string pseudo-prop, read-only
Types []type pseudo-prop, read-only

Ich hoffe jetzt ists sinnvoller erklärt.

Im Anhang übrigens mal ein Beispiel.

MfG
Neu OpenDocument Tabellendokument.ods
Beispiel
(9.5 KiB) 38-mal heruntergeladen

Re: Tabelle anspringen aus Dialog funktioniert nicht

von DPunch » Di, 25.01.2011 21:33

Aloha

Soweit ich das verstehe, wird die Ansicht des Dokuments erzeugt, bevor die Verbindung Ansicht <-> Controller <-> Model aufgebaut ist.
Im Model sind unter .ViewData einige grundlegende Dinge (wie z.B. auch die anzuzeigende Tabelle) hinterlegt, die jedes Mal beim Speichern akualisiert werden - der Controller holt sich diese Informationen und wendet sie auf den View an.

Wenn Du nun beim OnViewCreated-Event ein Makro laufen lässt, wird dadurch offensichtlich für diese Zeit die Kommunikation zwischen View und Model unterbrochen.
Änderungen, die Du in dieser Zeit über den Controller machst, sind dahingehend wirkungslos, dass der Controller sich aus dem Model direkt danach die .ViewData holt und die dortigen Einstellungen anwendet.

insertfunnyname hat geschrieben:Bei Dokument öffnen schlägts fehl.
Was genau schlägt fehl?
Unter Win XP / OOo 3.2.1 funktioniert ein solches Makro über das Event "Dokument öffnen" absolut fehlerfrei.

Re: Tabelle anspringen aus Dialog funktioniert nicht

von Stephan » Di, 25.01.2011 19:49

Mir ist die ganze Erklärung viel zu verworren, mal gehts um EReignissde, mal, augenscheinliuch darum ob man das richtige Objekt hat, dann wieder um das Abfangen von Ereignissen ... ich rate dann einfach mal, indem ich mir denke wenn es nicht das ThisComponent-Objekt ist:

Code: Alles auswählen

ThisComponent.CurrentController.SetActiveSheet(ThisComponent.Sheets.getByName(_tblname))
passt vielleicht, warum nun auch immer CurrentComponent:

Code: Alles auswählen

CurrentComponent.CurrentController.SetActiveSheet(CurrentComponent.Sheets.getByName(_tblname))
ist aber nur geraten, wobei ich natürlich den Unterschied zwischen ThisComponent und CurrentComponent kenne:
http://www.dannenhoefer.de/faqstarbasic ... hisCo.html

was mir nur wenig nutzt weil ich anhand der verworrenen Beschreibung nicht weiß was nun Sache ist.

Die grundsätzlich richtige Antwort ist natürlich einfach das RICHTIGE Dokumentenobjekt zu referenzieren. Falls alle beteiligten Dokumente bereits einen Namen haben kann man z.B. mit ThisComponent.URL prüfen ob man überhaupt das Richtige referenziert.



Gruß
Stephan

Tabelle anspringen aus Dialog funktioniert nicht

von insertfunnyname » Di, 25.01.2011 18:07

Hallo zusammen,

Folgendes Szenario:

Habe ein calc-Dokument mit 4 Tabellen (Sheets). Nach dem Öffnen des Dokuments soll ein Dialog aufgeblendet werden, in dem der Anwender durch Klick auf einen Button je nach Auswahl in eine der 4 Tabellen geleitet wird.

Dialog-Start über

Code: Alles auswählen

public sub DialogBox_Start()
 DialogLibraries.loadLibrary("Standard")
 oDialogDesc = DialogLibraries.getByName("Standard").getByName("AUSWAHL_DIALOG")
 oDialog = CreateUnoDialog(oDialogDesc)
 oDialog.execute()
 oDialog.dispose() 
end sub
klappt wunderbar. Habe DialogBox_Start() an das Ereignis Ansicht wurde erzeugt geknüpft.

Im Dialog selbst wird dann beim Klick auf den Button der Dialog mittels

Code: Alles auswählen

 oDialog.endexecute()
beendet. Klappt bis hier. Was gar nicht geht ist der anschliessende Tabelleneinsprung. Dieser wird mittels

Code: Alles auswählen

ThisComponent.CurrentController.SetActiveSheet(ThisComponent.Sheets.getByName(_tblname))
realisiert. _tblname ist dabei der jeweilige Name der anzuspringenden Tabelle.

Es wird aber nicht die gewünschte, sondern die zuletzt aktive Tabelle angesprungen. Die zuletzt aktive ist die, welche beim letzten Speichern aufgeblendet war.

Generell funktioniert diese Methode des Tabellenaufrufs aber. Ist getestet.

Das Problem scheint am Aufrufzeitpunkt Ansicht wurde erzeugt des Dialogs zu liegen. Irgendwie ist das Dokument dabei noch nicht vollständig geladen. Nutzt man das Ereignis Dokument aktivieren wird der Dialog bei jedem Fokus-Erhalt des calc-Fensters neu gestartet. Dann funktionierts, allerdings erst beim zweiten Aufruf (erneuter Fokus-erhalt). Bei Dokument öffnen schlägts fehl. Rumexperimentieren mit anderen Ereignissen brachte auch keinen Erfolg.

Bin etwas ratlos. Vielleicht hat ja einer von euch noch ne Idee. Evtl. mit listener auf wirklich passendes Ereignis. Bin auf eure Vorschläge gespannt.

MfG

Nach oben