Stichworten mit Hyperlink
Moderator: Moderatoren
Stichworten mit Hyperlink
Ich könnte gut ein Makro gebrauchen, mit dem ich den Stichworten einen Hyperlink einbinden kann.
So wie das beim Inhaltsverzeichnis oder bei den Fußnoten vorhanden ist.
Martin
So wie das beim Inhaltsverzeichnis oder bei den Fußnoten vorhanden ist.
Martin
Re: Stichworten mit Hyperlink
Folgendes funktioniert bei mir seit Jahren in OO:
Gruß
Stephan
Code: Alles auswählen
Dim tt
dim startzeit
Dim fehler_log
Dim warten_model
Dim oMod_warten
Dim bereinigte_eintraege(0) 'array mit Seitenzahlen (ReDim im Code beachten)
Dim eintraege_zusatz(0) 'array mit Zusätzen f. oder ff. wenn zutreffend
Dim akt_zusatz 'der jeweils aktuelle Zusatz
Dim weiter 'Fehlerspeicher für Einträge
Dim nummer_untereintrag 'Zähler für Stichwortverzeichniseintrag mit mehreren Seitenzahlen
Dim anzahl_seiteneintraege 'Anzahl der Seiteneinträge für aktuelles Stichwort im Verzeichnis
Dim abbruch_durch_benutzer 'kennzeichnet das Benutzer manuell abgebrochen hat
Dim raus 'beendet Hauptschleife Do-Loop
Sub verweise_setzen()
'Autor: www.jm-schmidt.de
startzeit = time()
fehler_log = ""
abbruch_durch_benutzer = 0
raus = 0
rueck = 0
rueck = Msgbox("Wollen Sie die Einträge im Stichwortverzeichnis verlinken? " & _
CHR(13) & CHR(13) & "ACHTUNG das Stichwortverzeichnis muss unmittelbar vor " & _
"dem Start des Makros hier, aktualisiert worden sein. Ansonsten klicken Sie bitte ab ""Abbrechen"" " & _
" und aktualisieen das Stichwortverzeichnis und starten Sie danach das Makro neu." & CHR(13) & " ", 33, "Stichwortverzeichnis bearbeiten")
If Not(rueck = 1) Then Exit Sub
cur = ThisComponent.Text.createTextCursor
indexes = ThisComponent.getDocumentIndexes()
For i = 0 To Indexes.getCount() - 1
oIndex = Indexes.getByIndex(i)
If oIndex.supportsService("com.sun.star.text.DocumentIndex") Then
cur.gotoRange(oIndex.getAnchor, false)
cur.CollapseToStart 'vorderste Position im Verzeichnis
'warten-Dialog--------------------------
warten_model = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
warten_model.setPropertyValue("Width", 200) '343
warten_model.setPropertyValue("Height", 65) '65
warten_model.SetPropertyValue("Title","Bitte etwas Geduld")
oMod_warten = warten_model.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod_warten
.setPropertyValue("Name","warten1")
.setPropertyValue("PositionX",5) '192
.setPropertyValue("PositionY",5)
.setPropertyValue("Width",180)
.setPropertyValue("Height",15)
.setPropertyValue("MultiLine", True)
.setPropertyValue("Label","Querverweise werden erstellt ...")
End With
warten_model.insertByName("warten1", oMod_warten)
oMod_warten2 = warten_model.createInstance("com.sun.star.awt.UnoControlButtonModel")
With oMod_warten2
.setPropertyValue("Name","but1")
.setPropertyValue("PositionX",70)
.setPropertyValue("PositionY",45) '45
.setPropertyValue("Width",60)
.setPropertyValue("Height",16)
.setPropertyValue("Label", "Stop")
.setPropertyValue("DefaultButton", True)
'.setPropertyValue("Enabled", False)
End With
warten_model.insertByName("but1", oMod_warten2)
oListbut = createUnoListener("butlist_","com.sun.star.awt.XActionListener")
oMod_warten3 = warten_model.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod_warten3
.setPropertyValue("Name","warten3")
.setPropertyValue("PositionX",5) '192
.setPropertyValue("PositionY",20)
.setPropertyValue("Width",180)
.setPropertyValue("Height",15)
.setPropertyValue("MultiLine", True)
.setPropertyValue("Label","")
End With
warten_model.insertByName("warten3", oMod_warten3)
warten_dialog = CreateUnoService("com.sun.star.awt.UnoControlDialog")
warten_dialog.setModel(warten_model)
warten_dialog.getControl("but1").addActionListener(oListbut)
oWin2 = CreateUnoService("com.sun.star.awt.Toolkit")
warten_dialog.createPeer(oWin2, null)
warten_dialog.setVisible(True)
'#Anzahl Einträge ermitteln
anzahl_eintraege = 0
Do
IF cur.ParaStyleName = oIndex.ParaStyleLevel1 OR cur.ParaStyleName = oIndex.ParaStyleLevel2 OR _
cur.ParaStyleName = oIndex.ParaStyleHeading Then
anzahl_eintraege = anzahl_eintraege + 1
cur.GotoNextParagraph(False)
Else
Exit Do
End If
Loop
cur.gotoRange(oIndex.getAnchor, false)
cur.CollapseToStart
Do While raus = 0
dd = dd + 1
cur.GotoEndOfParagraph(False)
IF cur.ParaStyleName = oIndex.ParaStyleLevel1 OR cur.ParaStyleName = oIndex.ParaStyleLevel2 Then
cur.GotoStartOfParagraph(False)
cur.GotoEndOfParagraph(True)
tmp = Split(cur.String, CHR(9)) 'es wird das Vorhandensein eines Tabulators je Eintrag vorausgesetzt
'#
If LEN(tmp(0)) > 0 Then
warten_dialog.getControl("warten3").Text = "Aktuelles Stichwort ... " & tmp(0)
Else
warten_dialog.getControl("warten3").Text = "Bookmarks werden geprüft ..."
End If
Wait 100
tmp2 = Split(tmp(1), ", ")
weiter = 0
If UBOUND(tmp2()) = 0 Then
If teilen(tmp2(0)) = "nOK" Then
'####--------------------->ernster Fehler
'weiter = 0
'bereinigte_eintraege(0) = teilen(tmp2(0)) 'überflüssig da ohnehin nur ein Eintrag zu bearbeiten
Else
weiter = 1
'geprüft und OK
ReDim bereinigte_eintraege(0)
bereinigte_eintraege(0) = teilen(tmp2(0))
ReDim eintraege_zusatz(0)
eintraege_zusatz(0) = akt_zusatz
End If
If weiter = 1 Then
'-->Hauptroutine für eine Seitenzahl-------------------------------
erg = finden(tmp(0), dd)
If erg <> "OK" Then
'Msgbox "Fehler bei: " & tmp(0)
'Exit Sub
fehler_log = fehler_log & tmp(0) & CHR(13)
Else
'aktueller Textmarke entspricht: "x_" & dd
'cur hinter Tabulator und Seitenzahlen weg
cur.GotoStartOfParagraph(False)
cur.goRight(LEN(tmp(0))+1, False)
cur.GotoEndOfParagraph(True)
cur.String = ""
oReference = ThisComponent.createInstance("com.sun.star.text.textfield.GetReference")
oReference.SourceName = "x_" & tmp(0) & "-" & dd
oReference.SequenceNumber = 0
oReference.ReferenceFieldPart = com.sun.star.text.ReferenceFieldPart.PAGE
oReference.ReferenceFieldSource = com.sun.star.text.ReferenceFieldSource.BOOKMARK
ThisComponent.getText.insertTextContent(cur, oReference, False)
cur.GotoEndOfParagraph(False)
cur.CollapseToEnd()
cur.String = eintraege_zusatz(0)
warten_dialog.getControl("warten1").Text = "Einträge wurden bearbeitet ... " & dd & " von " & anzahl_eintraege
'warten_dialog.model.getByName("progress1").setPropertyValue("ProgressValue", dd)
Wait 150
End If
'---------------------------------------------------------------<--
End If
Else 'mehr als ein Eintrag
ReDim bereinigte_eintraege(UBOUND(tmp2()))
ReDim eintraege_zusatz(UBOUND(tmp2()))
anzahl_seiteneintraege = UBOUND(tmp2()) 'Anzahl-1 der vorhandenen Seitenzahlen bei aktuellem Eintrag
for ii = LBOUND(tmp2()) To UBOUND(tmp2())
If teilen(tmp2(ii)) = "nOK" Then
'####--------------------->ernster Fehler
'weiter = 0 '-->darf nicht verwendet werden, wegen Konflikt mit anderen Einträgen
bereinigte_eintraege(ii) = teilen(tmp2(ii)) 'entspricht "nOK", essentiell für Hauptroutine
fehler_log = fehler_log & tmp(ii) & CHR(13)
Else
weiter = 1
'geprüft und OK
bereinigte_eintraege(ii) = teilen(tmp2(ii))
eintraege_zusatz(ii) = akt_zusatz
End If
Next ii
'Hinweis zu "weiter":
'durch weiter = 1 im Else-Teil wird sichergestellt das auch
'bei nur einer 'funktionierenden' Seitenzahl später die Hauptroutine aufgerufen wird
If weiter = 1 Then
'-->Hauptroutine für mehrere Seitenzahlen--------------------------
'Hinweis: es gibt hier nur ein dd für mehrere Seiteneinträge
nummer_untereintrag = 0
erg2 = finden2(tmp(0), dd) 'erg2 ist "OK" wenn MINDESTENS ein Durchlauf OK war
If erg2 <> "OK" Then
fehler_log = fehler_log & tmp(0) & CHR(13) 'kein einziger Untereintrag war OK
Else
'einzelne Untereinträge könnentrotzdem nicht OK sein
'nummer_untereintrag enthält den akt. Zählerstand für Untereinträge
'aktueller Textmarke entspricht:
'"x_" & eintrag & "-" & aktuelle_Nummer & "-" & nummer_untereintrag
'cur hinter Tabulator und Seitenzahlen weg
cur.GotoStartOfParagraph(False)
cur.goRight(LEN(tmp(0))+1, False)
cur.GotoEndOfParagraph(True)
cur.String = ""
'alle Seitenzahlen durchprüfen:
for jj = 0 To anzahl_seiteneintraege
If bereinigte_eintraege(jj) = "nOK" Then
'nichts tun
Else
'alle relevanten Bookmarks durchlaufen:
For jjj = 0 To nummer_untereintrag
cur.GotoEndOfParagraph(False) : cur.CollapseToEnd() 'zur Sicherheit
oReference = ThisComponent.createInstance("com.sun.star.text.textfield.GetReference")
oReference.SourceName = "x_" & tmp(0) & "-" & dd & "-" & jjj
oReference.SequenceNumber = 0
oReference.ReferenceFieldPart = com.sun.star.text.ReferenceFieldPart.PAGE
oReference.ReferenceFieldSource = com.sun.star.text.ReferenceFieldSource.BOOKMARK
ThisComponent.getText.insertTextContent(cur, oReference, False)
cur.GotoEndOfParagraph(False)
cur.CollapseToEnd()
'letztes Textfeld des aktuellen Eintrags verweist auf aktuelle Bookmark
'die Seitennummer dieses Textfeld/Querweis sichtbar machen und vergleichen:
oReference.update()
hh = ""
yy = 0
Do
'Wait 500 '! 'reicht 200 in allen Situationen?
Wait 10
yy = yy + 1
hh = oReference.CurrentPresentation()
If yy > 100 Then hh = "mach Weiter" 'zur Sicherheit
Loop While hh = ""
If oReference.CurrentPresentation() = bereinigte_eintraege(jj) Then
'#
'Msgbox oReference.CurrentPresentation() & "|" & bereinigte_eintraege(jj)
'der richtige Verweisist gesetzt, Zusatz ggf. egänzen
cur.String = eintraege_zusatz(jj) & ", "
Exit For
Else
'Eintrag ist nicht der Richtige, deshalb entfernen
cur.goLeft(1, True)
cur.String =""
End If
Next jjj
End If
Next jj
'alle SEiteneinträge/Querverweise sind gesetzt, aber Ende ist: ", "
cur.GotoEndOfParagraph(False)
cur.CollapseToEnd()
cur.goLeft(2, True)
If cur.String = ", " Then
cur.String =""
End If
cur.GotoEndOfParagraph(False)
warten_dialog.getControl("warten1").Text = "Einträge wurden bearbeitet ... " & dd & " von " & anzahl_eintraege
Wait 150
End If
'---------------------------------------------------------------<--
End If
End If
ElseIf cur.ParaStyleName = oIndex.ParaStyleHeading Then
'Überschrift
'cur.GotoNextParagraph(False) 'weiter
Else
raus = 1
cur.GotoPreviousParagraph(False)
End If
cur.GotoNextParagraph(False)
Loop
End If
Next i
On Error Resume Next '#!
ThisComponent.getTextfields.refresh()
warten_dialog.setVisible(False)
'Cursor richtig positionieren:
vCur = ThisComponent.getCurrentController().getViewCursor()
cur9 = vCur.Text.CreateTextCursor()
indexes = ThisComponent.getDocumentIndexes()
For i = 0 To Indexes.getCount() - 1
oIndex = Indexes.getByIndex(i)
If oIndex.supportsService("com.sun.star.text.DocumentIndex") Then
cur9.gotoRange(oIndex.getAnchor, false) 'hier Fehler?
cur9.CollapseToStart
cur9.GotoEndOfParagraph(False)
cur9.GotoNextParagraph(False)
vCur.gotoRange(cur9, false)
End If
Next i
Wait 500
if fehler_log <> "" Then
fehler_log = "Fehler bei: " & CHR(13) & fehler_log
End If
If abbruch_durch_benutzer = 1 Then
Msgbox "Bearbeitet wurden " & dd-1 & " Einträge." & CHR(13) & CHR(13) & "Start: " & startzeit & CHR(13) & _
"Ende: " & time() & CHR(13) & CHR(13) & fehler_log, 16, "Abbruch durch Benutzer"
Else
Msgbox "Bearbeitet wurden " & dd-1 & " Einträge." & CHR(13) & CHR(13) & "Start: " & startzeit & CHR(13) & _
"Ende: " & time() & CHR(13) & CHR(13) & fehler_log, 64, "Fertig"
End If
End Sub
'unterscheidet und teilt Ausdrücke der Form:
'123
'123f.
'123ff.
Function teilen(xx)
On Error Resume Next
teilen = ""
akt_zusatz = ""
tmp_l = LEN(xx)
lmp_l2 = tmp_l-2 '2-->f.; 3-->ff.
lmp_l3 = tmp_l-3 '2-->f.; 3-->ff.
'Fehler vermeiden der durch Resume Next entsteht:
If lmp_l2 < 0 Then lmp_l2 = 0
If lmp_l3 < 0 Then lmp_l3 = 0
If IsNumeric(Left(xx, lmp_l2)) AND Right(xx, 2) = "f." Then
'eine Zahl mit f.
teilen = Left(xx, lmp_l2)
akt_zusatz = "f."
ElseIf IsNumeric(Left(xx, lmp_l3)) AND Right(xx, 3) = "ff." Then
'eine Zahl mit ff.
teilen = Left(xx, lmp_l3)
akt_zusatz = "ff."
ElseIf IsNumeric(xx) Then
'nur eine Zahl
teilen = xx
Else
'irgendwas Anderes
teilen = "nOK"
End If
On Error Goto 0
End Function
Function finden(eintrag, aktuelle_Nummer)
'Msgbox "|" & eintrag & "|"
finden = "nOK"
indexes = ThisComponent.getDocumentIndexes()
'For a = 0 To 260
for i=0 to indexes.count-1
index = indexes(i)
if index.supportsService("com.sun.star.text.DocumentIndex") then
marks = index.DocumentIndexMarks
for j=uBound(marks()) to lBound(marks()) Step -1
If marks(j).getAnchor.getString() <> "" Then 'dbg_properties
kk = marks(j).getAnchor.getString()
Else
kk = marks(j).MarkEntry()
End If
'doppelte Leerzeichen entfernen
mm = Split(kk, " ")
tmp_m = ""
For m = LBOUND(mm()) To UBOUND(mm())
If mm(m) <> "" Then
If tmp_m = "" Then
tmp_m = mm(m)
Else
tmp_m = tmp_m & " " & mm(m)
End If
End If
Next m
kk = tmp_m
If kk = eintrag Then
finden = "OK"
'nur gültig für Einträge mit nur einer Seitenzahl:
oDoc = ThisComponent
oText = oDoc.getText()
oControlelr = oDoc.getCurrentController()
oViewCursor = oControlelr.getViewCursor()
f = marks(j).getAnchor
oViewCursor.gotoRange(f, false) '??
cur1 = oViewCursor.Text.CreateTextCursor
cur1.gotoRange(f, false)
oBookmark = ThisComponent.createInstance("com.sun.star.text.Bookmark")
oViewCursor.gotoRange(cur1, false)
oBookmark.setName("x_" & eintrag & "-" & aktuelle_Nummer)
oViewCursor.Text.insertTextContent(cur1, oBookmark, False)
Exit For
End If
Next j
End If
Next i
End Function
Function finden2(eintrag, aktuelle_Nummer)
finden2 = "nOK"
indexes = ThisComponent.getDocumentIndexes()
for i=0 to indexes.count-1
index = indexes(i)
if index.supportsService("com.sun.star.text.DocumentIndex") then
marks = index.DocumentIndexMarks
for j=uBound(marks()) to lBound(marks()) Step -1
If marks(j).getAnchor.getString() <> "" Then 'dbg_properties
kk = marks(j).getAnchor.getString()
Else
kk = marks(j).MarkEntry()
End If
'doppelte Leerzeichen entfernen
mm = Split(kk, " ")
tmp_m = ""
For m = LBOUND(mm()) To UBOUND(mm())
If mm(m) <> "" Then
If tmp_m = "" Then
tmp_m = mm(m)
Else
tmp_m = tmp_m & " " & mm(m)
End If
End If
Next m
kk = tmp_m
If kk = eintrag Then
finden2 = "OK"
'nur gültig für Einträge mit nur einer Seitenzahl:
oDoc = ThisComponent
oText = oDoc.getText()
oControlelr = oDoc.getCurrentController()
oViewCursor = oControlelr.getViewCursor()
f = marks(j).getAnchor
oViewCursor.gotoRange(f, false) '??
cur1 = oViewCursor.Text.CreateTextCursor
cur1.gotoRange(f, false)
oBookmark = ThisComponent.createInstance("com.sun.star.text.Bookmark")
oViewCursor.gotoRange(cur1, false)
oBookmark.setName("x_" & eintrag & "-" & aktuelle_Nummer & "-" & nummer_untereintrag)
oViewCursor.Text.insertTextContent(cur1, oBookmark, False)
nummer_untereintrag = nummer_untereintrag + 1
End If
Next j
End If
Next i
'um 1 reduzieren
If nummer_untereintrag >= 1 Then 'diese Prüfung ist eigentlich überflüssig, es muss mindestens 2 Seitenzahlen/Untereinträge geben
nummer_untereintrag = nummer_untereintrag - 1
End If
End Function
Sub butlist_ActionPerformed()
abbruch_durch_benutzer = 1
raus = 1
End Sub
Gruß
Stephan
Re: Stichworten mit Hyperlink
Guten Tag Stefan,
ich danke dir von Herzen.
Martin
ich danke dir von Herzen.
Martin
Re: Stichworten mit Hyperlink
Zur Verdeutlichung,
Dieses Eingabe Feld soll aufgerufen werden.
Komm der gleiche Eintrag mehrfach vor, stehen dort mehrere Seitenzahlen.
Es soll von denen nur eine angeklickt werden.
Insofern ist die Meldung ein Eintrag gefunden, also nicht bearbeitet,
das ist aber nur ein Wort in einer Meldung
Wurde der Eintrag editiert, soll, der von mir unter neuem Stichwort gespeichert werden.
Martin
Dieses Eingabe Feld soll aufgerufen werden.
Komm der gleiche Eintrag mehrfach vor, stehen dort mehrere Seitenzahlen.
Es soll von denen nur eine angeklickt werden.
Insofern ist die Meldung ein Eintrag gefunden, also nicht bearbeitet,
das ist aber nur ein Wort in einer Meldung
Wurde der Eintrag editiert, soll, der von mir unter neuem Stichwort gespeichert werden.
Martin
- Dateianhänge
-
- Hyperlink_Ruft_Maske.jpg (51.72 KiB) 5135 mal betrachtet
Re: Stichworten mit Hyperlink
Die Sichtbarkeit dieses Dialogs ist unwesentlich, weil der nur den Fortschritt anzeigt. Mutmaßlich ist auf Deinem System irgendeine Besonderheit die dazu führt das die Anzeige nicht richtig aktualisiert wird, wodurch der Dialog nicht sichtbar wird. Ich kenne aus meiner täglichen Praxis dutzende Fälle wo sowas passiert ohne das eine konkrete Ursache feststellbar wäre.Wenn ich den Code richtig verstehe, wird per Code ein Dialog erstellt.
Dieser wurde bei mir jedoch erst sichtbar, als ich ein
Wait 3000 eingegeben hatte:
der 'übliche' Workaround ist dann ein "wait..." einzufügen, so wie Du es getan hast, es sollte praktisch aber bereits ein kleiner Wert genügen, z.B. "wait 10". Lediglich gehört das "wait" dann dorthin wo sich der Inhalt der Anzeige dieses Dialogs ändert ... Moment, da ist ja bereits Eines, nämlich "Wait 150".
Somit: ich kann leider keinen konkreten Grund angeben warum der Dialog nicht angezeigt wird.
Ja. Genau gesagt erzeugt der Code Querverweise die zu den Stichwörtern im Text springen.Jetzt weiß ich aber auch nicht, ob ich es richtig verstanden habe.
Soll der Code im gesamten Stichwortverzeichnis Hyperlinks erstellen,
um von hier aus zu den Textsektionen zu springen?
Ansonsten tut es mir leid, ich werde ich diesem Falle keine Hilfe leisten, denn das Makro ist extrem komplex und in mehrtätiger Arbeit für ein Kundenprojekt entstanden.
Ich habe es hier im Forum nur gepostet weil ich weiß das das was der Frager wollte nur sehr kompliziert zu erreichen ist und das nicht mit einigen Worten zu erklären gewesen wäre.
Natürlich habe ich das Makro aktuell getestet bevor ich es hier im Forum postete und habe es jetzt, auf Deine Fehlermeldung hin, nochmals speziell mit AOO 4.1.6. In Beiden Fällen war die Funktion fehlerfrei.
Einen Tipp kann ich geben: ich weiß das das Makro in seltenen Fällen Probleme macht wenn sich die Stichwörter nicht im Fließtext befinden. Möglicherweise ist auch das hier die Ursache.
(Das Makro ist so konzipiert das es alle Stichwörter im Fließtext und in Fußnoten bearbeiten können soll, Weiteres war nicht Ziel und ist nie explizit geprüft worden.)
Gruß
Stephan
Re: Stichworten mit Hyperlink
Stephan,
Wenn das Makro bei dir läuft, ergibt sich die Frage, ob man das ganze nicht kompilieren kann?
Dann müsste es ja auch hier laufen.
Denn Win 10 soll ja Win 10 sein, hoffentlich.
Kann man das nach Java konvertieren?
Ich habe gelesen, dass in OP und Lo viel mit Java erstellt wurde.
Und Basic kann man doch auch kompilieren.
Dann hätte man zwei oder mehr Exen die sich aufrufen.
Nur mal zur Erklärung,
Ich bin Schriftstelle und kein Logiker, das muss man als Programmierer ja sein.
In Lauf der Jahrzehnte erfährt man eben das eine und das andere.
Martin
Wenn das Makro bei dir läuft, ergibt sich die Frage, ob man das ganze nicht kompilieren kann?
Dann müsste es ja auch hier laufen.
Denn Win 10 soll ja Win 10 sein, hoffentlich.
Kann man das nach Java konvertieren?
Ich habe gelesen, dass in OP und Lo viel mit Java erstellt wurde.
Und Basic kann man doch auch kompilieren.
Dann hätte man zwei oder mehr Exen die sich aufrufen.
Nur mal zur Erklärung,
Ich bin Schriftstelle und kein Logiker, das muss man als Programmierer ja sein.
In Lauf der Jahrzehnte erfährt man eben das eine und das andere.
Martin
Re: Stichworten mit Hyperlink
Nein, eigentlich nicht.Wenn das Makro bei dir läuft, ergibt sich die Frage, ob man das ganze nicht kompilieren kann?
Ein Makro ist ja gerade ein Makro weil es zur Laufzeit interpretiert wird[1] und nicht vorher kompilliert, denn sonst wäre es ein Programm und kein Makro.
[1]
ja, "Faol" äußert sich dazu etwas anders, das aber wäre dann eine Diskussion unter Experten, denn es geht dabei quasi um den Unterschied zwischen Interpreter und Laufzeitkompiler
Anderserseits sei angemerkt das es irgendwo im Internet (ich weiß gerade nicht wo) es tatsächlich ein Projekt gibt das eine Software erstellt hat mit der man OO-Makros kompilieren kann. Ich weiß aber nicht einmal ob das Projekt noch aktiv ist.
Ich selber schreibe seit mehr als 10 Jahren beruflich Makros für OO und habe noch nie eines kompiliert, weil das völlig, völlig unüblich ist.
(wohlgemerkt, ich rede hier nicht über Basic, sondern über Basic-Makros. Natürlich kompiliere auch ich VisualBasic oder VisualBasic .Net Code, nur das sind keine Makros.)
Ja sicher, aber dazu fehlen mir persönlich die Kenntnisse, denn ich programmiere kein Java.Kann man das nach Java konvertieren?
Da ich erahne wohin das zielt, will ich betonen: der einzige Grund ein kompilliertes Programm einzusetzen (und das wäre wohl eher eine dll und keine exe) sind hier, meiner Meinung nach, Geschwindigkeitsfragen, denn strenggenommen ist ein Basic-Makro für das Verlinken des Stichwortverzeichnisses recht langsam, man würde also z.B. Python oder Java bevorzugen, nur beide Programmiersprachen kann ich persönlich nicht und habe deshalb Basic genutzt.Dann hätte man zwei oder mehr Exen die sich aufrufen.
Ich kann Dir hingegen garantieren, das es kein Grund ist eine Exe deshalb einzusetzen weil es bei Extensions Probleme mit Menüs oder dem Aufruf einzelner Makros gäbe.
Es ist allen In Ordnung, Du darfst auch gerne als Nicht-Programmierer Gedanken zur Programmierung äußern oder Fragen stellen oder Antworten in Zweifel ziehen. Das stört oder ärgert niemanden, denn im Kern ist das ja hier ein Forum für Endanwender und nicht für den Meinungsaustausch zwischen Experten.Nur mal zur Erklärung,
Ich bin Schriftstelle und kein Logiker, das muss man als Programmierer ja sein.
In Lauf der Jahrzehnte erfährt man eben das eine und das andere.
Gruß
Stephan
Re: Stichworten mit Hyperlink
Ja, das stimmt. Im geposteten Makro ist das für "ff" so gelöst das an die erste Fundstelle verlinkt wird.wie es z.B. bei Fußnoten und Einträgen im Inhaltsverzeichnis der Fall ist.
Keine klaren Sprungziele weil:
Beispiel:
Seite 20ff
Ich erinnere mich nicht ob im Makro alle 'Treffer' bei "ff" durchlaufen werden (oder nach dem ersten zum nächsten Stichwort verzweigt wird), genutzt wird letztlich nur der jeweils Erste.Fortfolgend per Makro im Text zu finden, nun ja.
Vielleicht muss ich an der Stelle dazu sagen das es noch eine Hilfsroutine für das Makro gibt die alle gesetzten Textmarken nachträglich entfernen kann, damit das Makro mehrfach auf ein Dokument angewendet werden kann wenn das Dokument durch Bearbeitung wächst.
Zwar kannst Du das Makro auch so mehrfach anwenden, nur irgendwann dürfte der Punkt erreicht sein wo OO wegen zu vieler Textmarken 'aussteigt'.
Ja, natürlich.kann es eigentlich nur an der Struktur des Dokuments liegen.
Das Makro, wie ich es hier gepostet habe, ist Teil einer Fachanwendung die ich für einen Verlag programmiert habe und für die Tests stand mir ein Dokument mit ca. 500 Seiten und ca. 3000 Stichworteinträgen (200 Abbildungen, 15 Tabellen) zur Verfügung (habe gerade in mein Archiv geschaut).Es handelt sich um ein Buch mit ca. 240 Seiten. Hierin sind neben dem Fließtext,
auch mehrere Texttabellen (inklusive der Stichwörter) enthalten, Grafiken, Bilder.
Das Makro ist also in der Lage mit recht großen Dokumenten zu laufen, allerdings ist die Laufzeit auch entsprechend hoch, ich glaube um 30 Minuten für das erwähnte Dokument.
Genau so ist es. z.B. habe ich bei diesem Makro das erste Mal in Praxis erlebt das Textmarken (die ja unsichtbar sind) wenn sie gehäuft auftreten nicht keine Breite haben, sondern tausende Textmarken dazu führen das sich der Textfluss geringfügig ändert und dadurch sich natürlich auch Seitenzahlen etc. verschieben, was dann auch wieder berücksichtigt werden muss.Nun ich habe beim Programmieren auch die Erfahrung gemacht, dass man nicht alle Eventualitäten voraussehen kann.
Gerade bei komplexeren Aufgaben tritt dieses Problem häufiger auf.
Du wirst, wenn Du selbst programmieren kannst an vielen Stellen des Makros merken, das nachgebessert wurde und teilweise nur workarounds verwendet wurden, das sind die Stellen wo bei realen Tests bzw. auch beim Produktiveinsatz einzelne Probleme auftraten wo sich aber keine konkrete Ursache finden lies. (in Praxis ist das auch immer eine Kostenfrage)
Gruß
Stephan
Re: Stichworten mit Hyperlink
Es muss noch weitere Nebenbedingungen geben, denn in meinem damaligen Testdokument gibt es Texttabellen und ich habe jetzt kurz drei davon kontrolliert, das sind 08/15 Texttabellen, also nicht Tabelle in Rahmen oder sowas.Resultat:
Sobald sich Texttabellen im Dokument befinden,
funktioniert das Makro bei mir nicht.
Aktuell getestet hatte ich hingegen auch nur mit einem kurzen, schnell erstellen Dokument.
Gruß
Stephan
Re: Stichworten mit Hyperlink
Ich habe jetzt ein Testdokument mit Tabelle erstellt, wo das Makro bei mir durchläuft.Es muss noch weitere Nebenbedingungen geben, denn in meinem damaligen Testdokument gibt es Texttabellen
Gruß
Stephan
- Dateianhänge
-
- Testdokument mit Tabellle.odt
- (24.97 KiB) 109-mal heruntergeladen
Re: Stichworten mit Hyperlink
Guten Abend Stephan,
kannst Du, würdest Du was daran machen können, wollen?
Das Stichwortverzeichnis darf nicht alphabetisch formatiert sein.
Menü Einfügen → Verzeichnisse → Stichwortverzeichnis
Register Einträge → Rubrik „Formatierung“ → Alphabetisches Trennzeichen.
Sollte das viel sein, dann muss das nicht für Gotteslohn sein.
Ich könnte Dir das gesamte Buch schicken.
Albert
kannst Du, würdest Du was daran machen können, wollen?
Das Stichwortverzeichnis darf nicht alphabetisch formatiert sein.
Menü Einfügen → Verzeichnisse → Stichwortverzeichnis
Register Einträge → Rubrik „Formatierung“ → Alphabetisches Trennzeichen.
Sollte das viel sein, dann muss das nicht für Gotteslohn sein.
Ich könnte Dir das gesamte Buch schicken.
Albert
Re: Stichworten mit Hyperlink
Ich hatte ja gleich in den Thread geschrieben das ich zu diesem Makro keine weitere Hilfe leisten möchte, weil das Makro sehr komplex ist und mir noch aus einem Kundenprojekt in unliebsamer Erinnerung, des Aufwands wegen.martin11 hat geschrieben: ↑Do, 14.02.2019 18:19 Guten Abend Stephan,
kannst Du, würdest Du was daran machen können, wollen?
Das Stichwortverzeichnis darf nicht alphabetisch formatiert sein.
Menü Einfügen → Verzeichnisse → Stichwortverzeichnis
Register Einträge → Rubrik „Formatierung“ → Alphabetisches Trennzeichen.
Sollte das viel sein, dann muss das nicht für Gotteslohn sein.
Ich könnte Dir das gesamte Buch schicken.
Albert
Trotzdem habe ich mir jetzt angeschaut was "Faol" zu dem Problem in dem zip hochgeladen hat und eine Stunde einige Dinge ausprobiert. Ohne Erfolg.
Wenn Dir mein Wort hier genügt, das ich Deine Datei vertraulich behandeln werde, kannst Du mir über das Forum hier eine persönliche Nachricht schicken und die Datei anhängen. Dann würde ich einmal draufschauen (aber natürlich ohne jede Zusage eine Lösung zu finden).
Gruß
Stephan
Re: Stichworte mit Hyperlink
Hallo Stephan,
ich komme auf deinen Eintrag vom 14.2. zurück.
Private Nachricht das verstehe ich nicht.
Ich schicke Dir hier das Dokument.
Leide ist auch die Zip zugroß, was tun?
Gruß
Martin
ich komme auf deinen Eintrag vom 14.2. zurück.
Private Nachricht das verstehe ich nicht.
Ich schicke Dir hier das Dokument.
Leide ist auch die Zip zugroß, was tun?
Gruß
Martin
Re: Stichworten mit Hyperlink
wenn Du angemeldet bist ist bei jedem registrierten Forumsteilnehmer ein 'Button' zu sehen wo Du draufklicken und zwischen Email und Privater Nachricht wählen kannst. Eine Private Nachricht ist technisch nichts Anderes als ein nicht-öffentlicher Forumspost/Thread.Private Nachricht das verstehe ich nicht.
Wie groß ist die denn? Hoffentlich nicht größer als einige MB?Leide ist auch die Zip zugroß, was tun?
Gruß
Stephan
Re: Stichworten mit Hyperlink
Hallo Stephan < 3 Mb
Martin
Martin