[GastForen Programmierung/Entwicklung AppleScript Quark letzte Textbox ermitteln / Fehler 609

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Quark letzte Textbox ermitteln / Fehler 609

MirkoG
Beiträge gesamt: 10

8. Aug 2013, 14:32
Beitrag # 1 von 16
Bewertung:
(6140 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

ich versuche ein Quarkdokument auf möglichen Überlauf in der letzten Textbox einer Kette von Textboxen zu prüfen. Entweder ist der Überlauf in einer Textbox auf der Dokumentseite und wird mit dem Überlaufzeichen angezeigt oder der Überlauf steht steht in einer Textbox neben der Seite (und es wird kein Überlaufzeichen angezeigt).

Das Script funktioniert auch, per Selbstaufruf (my QuarkNextTB(TB, theDokName)) ermittle ich die letzte Textbox der verketten Textboxen und prüfe auf Inhalt. Leider kommt es immer wieder zu sporadischen Fehlern ( -609 Connection Is Invalid). Der Fehler ist nicht zuverlässig reproduzierbar, tritt nach einiger Zeit bei beliebigen Dokumenten immer wieder auf. Die Anzahl der verknüpften Textboxen variiert übrigens je nach Dokument.

Versuchsweise habe ich mit delay den Ablauf verzögert, ohne Erfolg.

Meine Frage wäre, was ich am Ablauf verbessern könnte? Gibt es eventuell eine andere Möglichkeit, die letzte Textbox einer Reihe verketteter Boxen zu ermitteln? Die von mir im Dokument gesuchte Verknüpfung startet übrigens immer in Textbox 1, ich suche also die zugehörige (letzte) Textbox von story 1

Danke und viele Grüße in die Runde,
Mirko

Anbei das Script

property debugflag : true


repeat

if my checkUeberlauf() is true then
exit repeat
else
delay 5
end if

end repeat

on checkUeberlauf()
try

tell application "QuarkXPress Passport"

if debugflag is true then set theDokName to name of document 1 -- nur im debugmodus, anonsten kommt der name über die fmdb

if (document theDokName exists) then
tell document theDokName
set selection to null -- Auswahl aufheben
set allboxes to count (every text box whose box overflows is true)
set FirstBox to text box 1
set LastBox_Text to (my QuarkNextTB(FirstBox, theDokName)) -- letzte Box ermitteln aus der Verknüpfungskette

set CurBox to object reference of LastBox_Text
--set Page_Name to name of page 1 of CurBox
set Page_Number to page number of page 1 of CurBox --Page_Number = "2001" or Page_Number = "2002" beudeutet Box steht neben der Seite

log "allboxes" & allboxes

if allboxes > 0 then
set ueberlauf_flag to true
else if the text of LastBox_Text is not "" and Page_Number as text = "2001" then -- Überlauf gefunden?
log "2001"
set ueberlauf_flag to true

else if the text of LastBox_Text is not "" and Page_Number as text = "2002" then -- Überlauf gefunden?
log "2002"
set ueberlauf_flag to true
else
log "nix"
set ueberlauf_flag to false
end if

if ueberlauf_flag is true then
show LastBox_Text
select LastBox_Text
if debugflag is true then display dialog "Überlauf"


else
if debugflag is true then display dialog "Kein Überlauf"

end if

end tell

end if
end tell


return true

on error errMsg number errnum


display dialog "Fehler bei Überlaufscript" & return & errMsg & return & errnum with title "Ueberlauf testen" with icon stop

end try
end checkUeberlauf

on QuarkNextTB(TB, theDokName)
tell application "QuarkXPress Passport"
tell document theDokName
if next text box of TB is not null then
my QuarkNextTB(next text box of TB, theDokName)
else
return TB
end if

end tell
end tell
end QuarkNextTB
X

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

8. Aug 2013, 14:56
Beitrag # 2 von 16
Beitrag ID: #516011
Bewertung:
(6128 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

welche Version von QuarkXPress benutzest Du heute?
Unter welchem Mac OS X?

Gruss, Hans


als Antwort auf: [#516007]

Quark letzte Textbox ermitteln / Fehler 609

MirkoG
Beiträge gesamt: 10

8. Aug 2013, 15:09
Beitrag # 3 von 16
Beitrag ID: #516012
Bewertung:
(6115 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

sorry, das ist natürlich nicht unwichtig.

Quark 7.5
OS X 10.5.8

Viele Grüße,
Mirko


als Antwort auf: [#516011]

Quark letzte Textbox ermitteln / Fehler 609

MirkoG
Beiträge gesamt: 10

8. Aug 2013, 17:05
Beitrag # 4 von 16
Beitrag ID: #516019
Bewertung:
(6075 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Noch ein Nachtrag meiner neuesten Tests:

Scheinbar ereignet sich der Fehler immer bei folgendem Schritt:

Code
set Page_Number to page number of page 1 of CurBox 


Im Eventprotokoll des Scripteditors kommt dann:


get page number of page 1 of text box 5 of document "TAMODO-Test"
current application
end tell
tell some application
display dialog "errnum-609"
current application
end tell
tell application "QuarkXPress Passport"
display dialog "errnum-609"
«event ascrgdut»
{}
display dialog "errnum-609"
end tell


als Antwort auf: [#516007]

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

8. Aug 2013, 17:53
Beitrag # 5 von 16
Beitrag ID: #516022
Bewertung:
(6056 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

also ... Connection Is Invalid bedeutet ja, dass QuarkXPress abgestürzt ist.
Und das ist immer unangenehm.

Diesem alten Beitrag kannst Du entnehmen, wie der Absturz verhindert werden kann:
http://www.hilfdirselbst.ch/...i?post=418717#418717

Ich weiss aber nicht, ob dieser Workaround mit QXP 7 auch noch greift.

Allerdings verstehe ich nicht, weshalb die Seitennummer festgestellt wird.
Wie ich das Script verstehe, wird die erste Textbox, welche überläuft, angezeigt und ausgewählt.

Das könnte auch so erreicht werden:

Code
tell application "QuarkXPress Passport" 
activate
tell document 1
show (text box 1 whose box overflows is true)
select (text box 1 whose box overflows is true)
end tell
end tell

Man muss sich nicht zur letzten Textbox durchhangeln. Die überlaufende ist ja immer die letzte in der Verkettung.

Gruss, Hans


als Antwort auf: [#516019]

Quark letzte Textbox ermitteln / Fehler 609

MirkoG
Beiträge gesamt: 10

9. Aug 2013, 14:12
Beitrag # 6 von 16
Beitrag ID: #516050
Bewertung:
(5986 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

danke für den Hinweis auf den älteren Post. Hat leider nix gebracht, auch index of page 1 führt zu einem Absturz, wobei es wirklich schwankt, mal ist bereits bei der 2. Abfrage eines Dokuments Schluss, mal geht es über 200 Dokumente gut.

Das Abfragen der letzten Textbox einer Serie ist nötig, weil wir verschiedene Dokumente habe, einige haben die Überlaufbox außerhalb der Seite und die ist je nach Art des Überlaufs nicht komplett gefüllt. Ist ganz hilfreich beim Bearbeiten, wenn man neben der Seite sieht, das beispielsweise nur 3 Zeilen umbrechen usw.

Da der Fehler bei der Prüfung der Position der Textbox (auf der Seite oder nicht) auftritt, nützt es auch nix, wenn ich die letzte Textbox anderweitig ermitteln könnte.

Danke und viele Grüße
Mirko


als Antwort auf: [#516022]

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

9. Aug 2013, 19:41
Beitrag # 7 von 16
Beitrag ID: #516090
Bewertung:
(5964 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

so wie ich es jetzt verstehe, gibt es drei Arten von Textboxen mit Überlauf.
1. Die letzte Textbox steht auf einer Seite und das Überlauf-Symbol ist sichtbar.
2. Die letzte Textbox steht neben der Seite und das Überlauf-Symbol ist sichtbar.
3. Die letzte Textbox steht neben der Seite, ohne Überlauf-Symbol, weil nicht ganz gefüllt.

Ich habe eine Idee, wie man auf eine andere Weise herausfinden könnte, ob die Textbox
auf einer Seite steht oder nicht. Aber ich benötige weitere Angaben.

Wie ist ein typisches Dokument aufgebaut?
a) Einzelseiten (auf jedem Druckbogen ist nur eine Seite)
b) Einzelseiten (auf jedem Druckbogen sind immer zwei Seiten)
c) Einzelseiten (ein Druckbogen kann eine oder zwei Seiten enthalten)
d) Doppelseiten (auf jedem Druckbogen sind immer zwei Seiten)
e) Doppelseiten (ein Druckbogen kann eine oder zwei Seiten enthalten)

Was geschieht, wenn die erste Textbox mit Überlauf angezeigt wurde?
Wird der Überlauf entfernt?

Übrigens: In Deinem Script wird mit ...

Code
set FirstBox to text box 1 

... immer dieselbe Textbox, nämlich die erste des Dokuments, der Variablen 'FirstBox' zugewiesen.

Sobald der Aufbau des Dokuments bekannt ist, werde ich versuchen, meine Idee umzusetzen.

Gruss, Hans


als Antwort auf: [#516050]

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

9. Aug 2013, 21:57
Beitrag # 8 von 16
Beitrag ID: #516092
Bewertung:
(5941 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

die letzte Textbox einer Textkette kann so ermittelt werden:

Code
tell application "QuarkXPress Passport" 
activate
tell document 1
select last item of (get every text box of story 1)
end tell
end tell

Meine Idee ist umgesetzt. Das Script ist fertig. Aber es muss sehr wahrscheinlich auf den Aufbau Deiner Dokumente abgestimmt werden.
Wenn das gelingt, dann ist das Absturzproblem Vergangenheit.

Gruss, Hans


als Antwort auf: [#516090]

Quark letzte Textbox ermitteln / Fehler 609

MirkoG
Beiträge gesamt: 10

10. Aug 2013, 13:10
Beitrag # 9 von 16
Beitrag ID: #516103
Bewertung:
(5897 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

das klingt schon mal gut. Allerdings tritt der Absturz ja erst bei der Abfrage auf, ob die Textbox auf der Seite steht oder nicht. Vermutlich ist aber Deine Ermittlung der letzten Textbox schneller als das schrittweise "Durchhangeln".

Zu Deinen Fragen: genau, es gibt die drei Arten von Textboxen mit Überlauf.

Ein typisches Dokument ist wie

a) Einzelseiten (auf jedem Druckbogen ist nur eine Seite)

Beim Überlauf stoppt das Script den Ablauf, der Überlauf wird manuell beseitigt. Die Ursache dafür kann komplex sein.

Stimmt, Textbox 1 ist immer der Start der Verkettung. Das kann sich ändern, wenn man beispielsweise eine andere Box der Kette nach vorne holt, aber darauf wird immer geachtet, das Textbox 1 die erste ist. Könnte man auch durch Benennung der Textbox lösen, aber das war bislang zu aufwenig.

Zu einer genauen Überprüfung komme ich vermutlich erst am Montag.

Danke für Deine Mühe und viele Grüße,
Mirko


als Antwort auf: [#516090]

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

10. Aug 2013, 13:29
Beitrag # 10 von 16
Beitrag ID: #516105
Bewertung:
(5886 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

danke für die Angaben. Wie gesagt, das Script ist praktisch fertig. Eine kleine Änderung und dann kann ich es veröffentlichen.

Aber erst heute Abend, denn zur Zeit bin ich unterwegs.

Gruss, Hans


als Antwort auf: [#516103]

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

11. Aug 2013, 00:09
Beitrag # 11 von 16
Beitrag ID: #516110
Bewertung:
(5842 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

das folgende Script vermeidet das Absturzproblem, indem der Wert der linken Kante der letzten Box geprüft wird.
Ist dieser kleiner als Null oder grösser als die Seitenbreite, dann steht die Box ausserhalb der Seite.

Bedingung ist, dass die Objektkoordinaten auf "Montagefläche" eingestellt sind. Das Script kann dies prüfen
und falls notwendig ändern. Am Schluss wird wieder der ursprüngliche Zustand hergestellt.

Code
-- zwei Variablen initialisieren 
set ctr to 0
set overFlowFlag to false

tell application "QuarkXPress Passport"
activate
tell document 1
-- die Objektkoordinaten speichern ...
set isc to 0
if item spread coords is false then
-- ... und falls notwendig auf "Montagefläche" setzen
set item spread coords to true
set isc to 1
end if
-- den Seiten-Nullpunkt auf null/null setzen
set page rule origin to {0, 0}
-- die Seitenbreite speichern
set pageWidth to page width as real
-- eine Schleife durch die Textketten
repeat with s from 1 to count of stories
-- die letzte Textbox der aktuellen Textkette speichern
set lastBox to last item of (get every text box of story s)
tell lastBox
-- wenn die Box nicht leer ist
if text is not "" then
-- prüfen ob verkettet
if previous text box is not null then
-- wenn ein Überlauf besteht
if box overflows then
-- die Flagge auf "wahr" setzen
set overFlowFlag to true
else
-- wenn ja, die linke Kante speichern ...
set x1 to left of bounds as real
-- ... und den Wert prüfen
if x1 is less than 0 or x1 is greater than pageWidth then
-- die Flagge auf "wahr" setzen
set overFlowFlag to true
end if
end if
end if
end if
end tell
-- wenn eine Überlauf-Box gefunden wurde
if overFlowFlag then
-- diese Box anzeigen und auswählen
show lastBox
select lastBox
-- die Objektkoordinaten zurücksetzen (falls notwendig)
if isc is 1 then
set item spread coords to false
end if
-- den Zähler hochzälen
set ctr to ctr + 1
-- die Schleife verlassen
exit repeat
end if
end repeat
if ctr is 0 then
-- den Anwender informieren
display dialog "Kein Überlauf festgestellt." buttons "OK" default button 1 with icon 1
-- die Objektkoordinaten zurücksetzen (falls notwendig)
if isc is 1 then
set item spread coords to false
end if
end if
end tell
end tell

Gruss, Hans


als Antwort auf: [#516105]
(Dieser Beitrag wurde von Hans Haesler am 11. Aug 2013, 21:27 geändert)

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

11. Aug 2013, 21:28
Beitrag # 12 von 16
Beitrag ID: #516134
Bewertung:
(5805 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

ich habe jetzt den Code oben noch mit einer Prüfung ergänzt:

Code
-- prüfen ob verkettet 
if previous text box is not null then

Damit wird verhindert, dass eine nichtverkettete Box, welche inner- oder ausserhalb einer Seite steht, als überlaufend bezeichnet wird. Das bedingt allerdings, dass die Textkette mindestens durch zwei Boxen läuft. Falls es Dokumente gibt, in welchen nur eine Textbox vorhanden ist, müsste das Script entsprechend angepasst werden.

Noch etwas: Bisher wird nur die horizontale Position geprüft. Falls sich Überlauf-Textboxen auch unterhalb (oder oberhalb) der Seiten befinden können, bitte durchgeben. Dann müsste das Script ergänzt werden.

Gruss, Hans


als Antwort auf: [#516110]
(Dieser Beitrag wurde von Hans Haesler am 11. Aug 2013, 21:38 geändert)

Quark letzte Textbox ermitteln / Fehler 609

MirkoG
Beiträge gesamt: 10

12. Aug 2013, 11:57
Beitrag # 13 von 16
Beitrag ID: #516165
Bewertung:
(5768 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

besten Dank!

Seltsamerweise funktioniert hier folgender Ausdruck nicht ganz
Code
					tell lastBox 
if text is not "" then
...


Aber ich habe vor dem tell lastBox mit

Code
set theText to text of lastBox 

den Inhalt der letzten Textbox abgefragt und dann geprüft... das hat dann alles bestens funktioniert.

Erste Tests haben keinen Absturz produziert und der Ablauf ist auch viel schneller ;-)

Danke für Deine kompetente und schnelle Hilfe!
Mirko

PS. die Überlaufboxen stehen immer neben der Seite, die Abfrage sollte also genügen.


als Antwort auf: [#516134]

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

12. Aug 2013, 12:58
Beitrag # 14 von 16
Beitrag ID: #516176
Bewertung:
(5757 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

bitte sehr.

Gut, dass es jetzt funktioniert. Kann sein, dass ich nichts bemerkte, weil ich QXP 8.51 benutzte (aus Bequemlichkeit, weil QXP 7 in einer anderen Partition installiert ist).

Ich bin gerade unterwegs. Aber heute Abend werde ich die Sache prüfen.

Gruss, Hans


als Antwort auf: [#516165]

Quark letzte Textbox ermitteln / Fehler 609

MirkoG
Beiträge gesamt: 10

13. Aug 2013, 10:27
Beitrag # 15 von 16
Beitrag ID: #516249
Bewertung:
(5721 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

leider gibt es bei sehr kleinen Dokumenten ein Problem, es wird dann nicht zuverlässig erkannt, das die letzte Text-Box nicht außerhalb steht.


Beispielsweise ist das Dokument 70 mm breit, die vollständig auf der Seite stehende Textbox bekommt aber mit

Code
set x1 to left of bounds as real 



eine Wert von 73, was die Box als außerhalb der Seite stehend qualifiziert.


Hast Du da noch eine Idee?

Update: ich glaube ich habe was gefunden, ich glaube es muss

Code
set spread rule origin to {0, 0} 


statt

Code
set page rule origin to {0, 0} 


sein.

Danke und Grüße,


als Antwort auf: [#516176]
(Dieser Beitrag wurde von MirkoG am 13. Aug 2013, 10:46 geändert)

Quark letzte Textbox ermitteln / Fehler 609

Hans Haesler
  
Beiträge gesamt: 5826

13. Aug 2013, 11:20
Beitrag # 16 von 16
Beitrag ID: #516254
Bewertung:
(648 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mirko,

wenn das Setzen des Linealursprungs auf Null hilft, dann okay.

Soviel ich weiss, kann dieser nicht manuell verändert werden. Es kann aber sein, dass er durch andere Änderungen (Seitenformat, Einzel- oder Doppelseite) verschoben wird.

Doch das Ändern des Seiten-Nullpunkts würde ich drin lassen. Das heisst, ich muss zuerst prüfen, ob dies notwendig ist.

Gruss, Hans


als Antwort auf: [#516249]
X