Seite 1 von 2

Writer: Tabellenzeile löschen

Verfasst: Sa 16. Mär 2013, 20:06
von supric
Hallo,

ich möchte in einem Makro die Tabellenzeile löschen, in der der Cursor steht. Weiß jemand, wie ich diese Zeile identifizieren und lösche?

Danke!

Re: Writer: Tabellenzeile löschen

Verfasst: So 17. Mär 2013, 00:11
von F3K Total
Hallo supric,
versuche es mal hiermit:

Code: Alles auswählen

Sub S_delete_current_row
    oselection = ThisComponent.currentselection
    osheet = oselection.spreadsheet
    nrow = oselection.rangeaddress.startrow
    if oselection.rows.count = 1 then
        osheet.rows.removebyindex(nrow,1)
    else
        if msgbox ("Um eine Zeile zu löschen, muss der Cursor in einer Zelle oder im Zeilenkopf stehen!"+chr(13)+_
                    "Soll die oberste Zeile der aktuellen Auswahl gelöscht werden?",276,"Fehler") = 6 then
            osheet.rows.removebyindex(nrow,1)
        endif
    endif
End Sub
Gruß R

Re: Writer: Tabellenzeile löschen

Verfasst: Mo 18. Mär 2013, 18:51
von supric
Hallo,

kann es sein, dass das Makro nur in calc funktioniert? Ich bekomme einen BASIC-Laufzeitfehler: Eigenschaft oder Methode nicht gefunden: spreadsheet. Ich möchte das ganze auf eine Tabelle in writer anwenden.

Danke!

Re: Writer: Tabellenzeile löschen

Verfasst: Mo 18. Mär 2013, 20:36
von F3K Total
Moin,
supric hat geschrieben:Hallo,
kann es sein, dass das Makro nur in calc funktioniert?
Aber ja, da hast Du völlig Recht, das Writer: habe ich übersehen, nimm also dies:

Code: Alles auswählen

Sub S_remove_current_row
    osel = thiscomponent.currentselection(0)
    if osel.supportsservice("com.sun.star.text.TextTableCursor") then
         msgbox ("Um eine Zeile zu löschen, muss der Cursor in einer Zelle stehen!",16,"Fehler")
    else
        if not IsEmpty(osel.Cell) then
            scell = osel.cell.cellname
            otexttable = osel.texttable
            ncolumns =  otexttable.columns.count
            nrows = otexttable.rows.count
            for i = 0 to ncolumns - 1
                for k = 0 to nrows - 1
                    ocell = otexttable.getCellByPosition(i,k)
                    if ocell.cellname = scell then 
                        nrow = k
                        exit for
                    endif
                next k
            next i
            otexttable.rows.removebyindex(nrow,1)
        endif
    endif
End Sub
Gruß R

Re: Writer: Tabellenzeile löschen

Verfasst: Di 19. Mär 2013, 19:36
von supric
Hallo ,

perfekt! Vielen Dank für die wirklich schnelle Lösung.

Als nicht ganz unerfahrener Entwickler in Java tue mich als Anfänger mit der Makro-Programmierung schwer und interessiere mich natürlich sehr für den Lösungsweg. Vor allem kann ich überhaupt noch nicht mit der API umgehen und mir fehlt dafür der Einstiegspunkt. Vielleicht kannst du mir noch ein paar Fragen beantworten oder mir ein paar Tipps geben, wie ich mir eine solche Lösung auch hätte selbst erarbeiten können, beziehungsweise welche Lektüre oder welches Tutorial dabei gut helfen kann.

Ich habe soviel verstanden, dass das Löschen der Zeile über texttable.rows.removebyindex vorgenommen wird. Wenn ich diese Funktion kenne, weiß ich, dass ich den Index der Zeile benötige und mir ein Verfahren zur Identifizierung des Indexes erarbeiten. Nur wie finde ich diese Funktion removebyindex oder in der Folge getCellByPosition? Warum kann mir die texttable nicht direkt sagen, in welcher Zeile sich der Cursor befindet?

Was ich noch nicht verstanden habe ist der Abbruch nur der inneren Schleife und das Weiterlaufen der äußeren Schleife. Warum kann ich nicht sofort bei Identifizierung der Zeile die Funktion removebyindex aufrufen und beide Schleifen nacheinander abbrechen?

Danke für die Hilfe!

Re: Writer: Tabellenzeile löschen

Verfasst: Di 19. Mär 2013, 19:47
von F3K Total
Hi,
klar gebe ich dir einen Tipp:
Ich empfehle Dir die Verwendung eines Inspection-Tools wie MRI oder Xray
Damit kannst Du alle OOo-Dokumente hinsichtlich ihres Aufbaues durchleuchten.
Und wenn Du dann noch das aktuelle SDK (unten rechts) installierst und in Xray oder MRI einrichtest, kannst Du direkt zum selektierten Objekt in die API Doku springen.
Hier habe ich mal versucht, dass zu erklären.
UND hier noch ETWAS Lektüre
Viel Erfolg Gruß R

Edit: Klar kann man auch die äussere Schleife verlassen, mein Fehler.

Re: Writer: Tabellenzeile löschen

Verfasst: Di 19. Mär 2013, 20:07
von F3K Total
supric hat geschrieben:Warum kann mir die texttable nicht direkt sagen, in welcher Zeile sich der Cursor befindet?
Tja, danach habe ich auch gesucht, in Calc kein Problem, da hat jede Zelle eine

Code: Alles auswählen

.celladdress
Die fehlt hier leider, daher habe ich an dem Umweg länger basteln müssen.
Gruß R

Re: Writer: Tabellenzeile löschen

Verfasst: Di 19. Mär 2013, 20:18
von supric
F3K Total hat geschrieben:Ich empfehle Dir die Verwendung eines Inspection-Tools wie MRI oder Xray
Damit kannst Du alle OOo-Dokumente hinsichtlich ihres Aufbaues durchleuchten.
Und wenn Du dann noch das aktuelle SDK (unten rechts) installierst und in Xray oder MRI einrichtest, kannst Du direkt zum selektierten Objekt in die API Doku springen.
Hier habe ich mal versucht, dass zu erklären.
Da bin ich wirklich gespannt.
F3K Total hat geschrieben:Edit: Klar kann man auch die äussere Schleife verlassen, mein Fehler.
Genau das hatte ich natürlich gleich probiert und bekomme diesen Fehler:
Bild
bei

Code: Alles auswählen

for i = 0 to ncolumns - 1
                for k = 0 to nrows - 1
                    ocell = otexttable.getCellByPosition(i,k)
                    if ocell.cellname = scell then
                        nrow = k
                        exit for
                    endif
                next k
               exit for
            next i
            otexttable.rows.removebyindex(nrow,1)
Wenn ich die Zeile versuche in der inneren Schleife gleich zu löschen, passiert einfach nichts:

Code: Alles auswählen

for i = 0 to ncolumns - 1
                for k = 0 to nrows - 1
                    ocell = otexttable.getCellByPosition(i,k)
                    if ocell.cellname = scell then
                        otexttable.rows.removebyindex(k,1)
                        exit for
                    endif
                next k
               exit for
            next i
            

Re: Writer: Tabellenzeile löschen

Verfasst: Di 19. Mär 2013, 20:26
von F3K Total
Na, dann hüpf doch raus:

Code: Alles auswählen

Sub S_remove_current_row
    osel = thiscomponent.currentselection(0)
    if osel.supportsservice("com.sun.star.text.TextTableCursor") then
         msgbox ("Um eine Zeile zu löschen, muss der Cursor in einer Zelle stehen!",16,"Fehler")
    else
        if not IsEmpty(osel.Cell) then
            scell = osel.cell.cellname
            otexttable = osel.texttable
            ncolumns =  otexttable.columns.count
            nrows = otexttable.rows.count
            for i = 0 to ncolumns - 1
                for k = 0 to nrows - 1
                    ocell = otexttable.getCellByPosition(i,k)
                    if ocell.cellname = scell then
                        nrow = k
                        goto 100
                    endif
                next k
            next i
            100:
            otexttable.rows.removebyindex(nrow,1)
        endif
    endif
End Sub
Gruß R

Re: Writer: Tabellenzeile löschen

Verfasst: Di 19. Mär 2013, 20:52
von supric
F3K Total hat geschrieben:Na, dann hüpf doch raus:
Ja, nee. Es funktioniert ja mit deiner Lösung. Ich kann mir nur nicht erklären, warum die anderen beiden Varianten nicht funktionieren.