Buttons in mehreren Calc-Sheets generieren
Verfasst: Mi, 05.04.2006 15:58
Hallo,
ich schreibe gerade ein Programm, das mir meine DB abfragt und die Ergebnisse in eine Tabelle (auf mehreren Blättern) schreibt.
Um Detailinfo abrufen zu können, will ich vor jeder Datenzeile einen Button generieren, über den ich eine SQl-Abfrage generiere.
Da ich erst seit kurzem mit OO-Basic arbeite, geht mir das ganze noch nicht so flüssig von der Hand.
Also, ich habe Danny's Basic Library in meine Haupt-Library kopiert, da sie ungemein nützliche Funktionen enthält (u.a. zur Erzeugung von Buttons in Formularen).
Mein Test-Code sieht folgendermaßen aus:
Diese Routine erzeugt auf den 3 Standardtabellenblättern jeweils 2 Buttons, die alle denselben ActionEvent aufrufen. Ich habe Dannys FormCreateControl_Button() Routine um eine Eintragungsmöglichkeit für Zusatztext im jeweiligen Button ergänzt (sText), da man dort wunderbar z.B. SQL statements o.ä. ablegen könnte und dann nur einen Event-Handler für alle Button bräuchte.
Aber zurück zum Thema. Ich habe herausgefunden, daß oDocCtrl.getControl( oControlModel ) nur dann funktioniert, wenn ich vorher dem betreffenden sheet den Focus gebe, es also nach vorne hole. Ansonsten greift die getControl()-Routine ins Leere und gibt eine <com.sun.star.container.NoSuchElementExeption> aus. Sobald ich aber mittels setActiveSheet() einem anderen Sheet den Focus gebe, wird immer die disposing-Routine für alle Buttons der letzten Seite getriggert und die Buttons sind funktionslos. Ich habe leider keine Ahnung warum das passiert und wie ich das verhindern kann.
Wer kennt sich da aus ?
Danke, Rado
ich schreibe gerade ein Programm, das mir meine DB abfragt und die Ergebnisse in eine Tabelle (auf mehreren Blättern) schreibt.
Um Detailinfo abrufen zu können, will ich vor jeder Datenzeile einen Button generieren, über den ich eine SQl-Abfrage generiere.
Da ich erst seit kurzem mit OO-Basic arbeite, geht mir das ganze noch nicht so flüssig von der Hand.
Also, ich habe Danny's Basic Library in meine Haupt-Library kopiert, da sie ungemein nützliche Funktionen enthält (u.a. zur Erzeugung von Buttons in Formularen).
Mein Test-Code sieht folgendermaßen aus:
Code: Alles auswählen
Sub Test
oDoc = ThisComponent
oDocCtrl = GetDocumentController( oDoc )
oListener = CreateUnoListener( "btnPress_", "com.sun.star.awt.XActionListener" )
for p = 0 to 2
oSheet = oDoc.getSheets().getByIndex(p)
oDocCtrl.setActiveSheet(oSheet)
for i = 0 to 1
sText = "Button " & i & " on Page " & p & " was pressed"
sButton = "btn_" & p & "_" & Format(i,"00")
oControlModel = FormCreateControl_Button( 900, 455 * i, 1200, 430, "Details", sButton, "MyForm_" & p , p, oDoc, sText )
oControl = oDocCtrl.getControl( oControlModel )
oControl.addActionListener( oListener )
Next
Next
End Sub
Sub btnPress_actionPerformed( tActionEvent As com.sun.star.awt.ActionEvent )
Print tActionEvent.Source.Model.Tag
End Sub
Sub btnPress_disposing( tActionEvent As com.sun.star.awt.ActionEvent )
Print "Disposing of the Listener " & tActionEvent.Source.Model.Tag
End Sub
Aber zurück zum Thema. Ich habe herausgefunden, daß oDocCtrl.getControl( oControlModel ) nur dann funktioniert, wenn ich vorher dem betreffenden sheet den Focus gebe, es also nach vorne hole. Ansonsten greift die getControl()-Routine ins Leere und gibt eine <com.sun.star.container.NoSuchElementExeption> aus. Sobald ich aber mittels setActiveSheet() einem anderen Sheet den Focus gebe, wird immer die disposing-Routine für alle Buttons der letzten Seite getriggert und die Buttons sind funktionslos. Ich habe leider keine Ahnung warum das passiert und wie ich das verhindern kann.
Wer kennt sich da aus ?
Danke, Rado