Objekte verlieren ihre "titel" nach dem schließen des Fensters

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Objekte verlieren ihre "Namen" nach dem schließen des Fensters

Ich habe ein grosses Problem, nach dem schliessen des übergeordneten Fensters in meinem AppleScript Studio Programm verlieren alle darin enthaltenen Objekte und das Fenster selbst ihren AppleSkript “Namen“.
Der Fehler trat erst auf, nachdem ich auf MacOS 10.4 Aktualisiert habe. Und danach mit Xcode2 erstellt habe. Frühere Build-versionen hingegen die noch mit XCode1 erstellt wurden stürzen sofort nach dem öffnen des ersten Fensters ab mit dem Signal SIGSERV (11).

Ich habe es mal anhand eines Skripts im SkriptEditor das Problem dargestellt.
Code:
tell application "MediaGate"
	show window "WINDOW:Main"
	get name of windows
	close window "WINDOW:Main"
	get name of windows
end tell

//Und nun das ergebniss aus dem Event-Protokoll:

tell application "MediaGate"
	show window "WINDOW:Main"
	get name of every window
		{[COLOR="red"]"WINDOW:Main"[/COLOR], etc...} //Das ist der richtige AppleSkript Name
	close window "WINDOW:Main"
	get name of every window
		{[COLOR="red"]"MediaGate / Home"[/COLOR], etc...} //Das ist der Titel des Fensters
end tell
Der AppleSkript Name für das Fenster wurde nach dem schliessen des Fensters in den "Window Title" des Fensters umgewandelt wie von Zauberhand. Alle Obiekte des Fensters haben danach ihren AppleSkript Namen verloren.

Ich währe für jede Hilfe sehr dankbar!
 
Zuletzt bearbeitet:

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Aufgrund dessen, dass niemand geantwortet hat, muss ich davon ausgehen, dass ich der einzige Mensch hier bin der ein solches Problem hat. Ich habe nun schon unzählige Stunden in dieses Problem gestekt und bin zu keiner Lösung gekommen :mad: . Auch mit einem neu erstelltem Test Programm tritt das Problem auf:

Code:
tell application "j"
	get name of every window
		{"hello"}
	close window "hello"
	get name of every window
		{"Window"}
end tell

Ich habe das XCode Test Projekt angehängt: j.zip
wenn jemand mal lust hat kann er es ja mal bei sich testen.

Ich weiss, dass hier viele schlaue Köpfe rumschwirren, mit jahrelanger erfahrung mit Skript's. Eventuel hat ja jemand einen vorschlag, wass ich noch ausprobieren könnte.
 
Zuletzt bearbeitet:

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Hallo Pete

der angegebene Code ist das Event Protokoll aus dem Script Editor, um zu zeigen wie sich das Fenster mit dem AppleScript Namen "hello" nachh dem schliessen automatisch zu "Window" umbenannt hat. "Window" ist ja der Name derTitelzeile des Fensters.

Was meinst do mit offenen Code? Benutzerrechte ändern?

Dein Skript habe ich natürlich gleich mal ausprobiert. Hier das Event Protokoll:
Code:
tell application "j"
	count every window
		1
	get class of item 1 of every window
		window
	get class of item 1 of every window
		window
	(*window*)
end tell

Die Klasse "window" sollte ja den Befehl "close" aus "Standart Suite" aus der Bibliothek des Programms unterstützen oder nicht? mit MacOS 10.3.9 hat auch alles einwandfrei funktioniert. Das Problem habe ich erst seit 10.4!

Kann es denn sein das der Systemupdate fehlerhaft installiert wurde? Ich habe noch andere Probleme seit 10.4 z.B. mit dem DVD Player. Am liebsten würde ich zurück auf 10.3!

Gruss Patric
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Ich habe den Anhang sofort GELOESCHT!!!

Weis zwar nicht wie so etwas möglich ist, aber SORRY, SORRY,SORRY!!!

Scheinbar habe ich mehr Probleme mit meinem System als mir bewust ist! Ich hoffe des haben nicht noch mehr Leute die date j.zip heruntergeladen. wenn doch löscht sie bitte sofort wieder!!

Dass war der ganze inhalt des Skripts:
Code:
tell application "j"
	get name of windows
	close window "hello"
	get name of windows
end tell
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Hallo Pete

Du hast absolut recht, ich verwende tatsächlich eine alte Version von XCode (nämlich 2.0). Währe schön, wenn dass ganze ein Bug in dieser Version von XCode ist.

Ich habe mit "j" einfach ein neues Programm mit XCode erstellt und dort mit dem IB dem Fenster im Infopanel unter AppleSkript dem Fenster den Namen "hello" gegeben.
Danach habe ich mit dem SkriptEditor mit dem Befehl:
get name of windows of application "j"
alle namen der Fenster abgerufen. Die Antwort ist wie erwartet: {"hello"} Also der Name den ich zuvor in IB dem einzigen Fenster vergeben habe.

Nun lasse ich mit dem Befehl: close window "hello" , das Fenster schliessen. Und genau hier passiert der grosse Fehler: ALLE Objekte einschliesslich des übergeortneten Fensters verliehren hier ihre AppleSkript Namen. In meinem eigentlichen Programm, ist das fatal, denn ich beziehe mich bei allen Aufrufen und Befehle immer auf den AppleSkript Namen.

Wird nun der exakt gleiche Befehl: get name of windows , erneut aufgerufen ist jedoch die ausgabe eine andere nämlich: {"windows"} :eek:


Mein eigentliches Programm ist gut 13Mb gross, und desshalb macht es wenig sinn, des hier zum Download bereitzustellen, desshalb der umweg über "j" es ist im Prinzip ein absolut leeres Programm, allerdings auf meinem Computer erstellt, und mich hätte es interesiert, ob ein von mir erstelltes Programm auch auf anderen Maschinen nicht funktioniert. Aber ich sehe ein, dass es eine schlechte Idee war.

Jedenfalls installiere ich jetzt zuerst XCode 2.2 und schaue dann weiter.

Sorry und Danke für deine Hilfe!
Mfg Patric
 

commander

Baldwins roter Pepping
Unvergessen
Registriert
25.02.04
Beiträge
3.206
Immer dieses Windows.

Kinder, ich hab euch schon tausendmal gesagt: Lasst die Finger von Windows! Das ist ungesund! Man wird zwar wenigstens (ganz sicher) nicht süchtig, aber gesund ist das nicht! ;)

Gruß,

.commander
 

commander

Baldwins roter Pepping
Unvergessen
Registriert
25.02.04
Beiträge
3.206
@pete: Na, jetzt mach doch den Doc schnydi nicht so fertig, der hat doch eh schon ein schlechtes Gewissen ;)
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Hallo zusammen

Also ich hab während meiner abwesenheit mein mac ein bisschen aufgemöbelt.
Erstens habe ich auf 10.4.4 aktualisiert, und zweitens habe ich XCode 2.2 heruntergeladen. Leider brauchte ich 3 versuche bis endlich ein erfolgreicher Download zustande gekommen ist :( . Warum auch immer so etwas nicht über die Systemeigene Software Aktualisierung integriert ist, und muss es denn gleich knapp 900Mb sein?

Egal jetzt zum Thema; Es hat alles nichts genützt :-c alles ist beim alten geblieben!
@pete: statt "get windows" kann mann auch schreiben: "get every window" ist also dasselbe.

Dass es besser gewesen währe die Objekte über ihre id zu identifizieren weis ich jetzt auch, obwohl es auch grosse vorteile hat jedem objekt einen eindeutigen Namen zuzuweisen, oder wie soll ich mir die id's von 100derten von Objekten merken?

Übrigens habe ich gestern in einem anderen Thread von jemanden gelesen der das selbe Problem schilderte, allerdings nur beiläufig. Dass heist immerhin, dass ich nicht ganz alleine bin mit dem Problem. Wenn ich herausfinde wo dann werde ich das melden.

Grüsse aus der Schweiz: Patric
 

commander

Baldwins roter Pepping
Unvergessen
Registriert
25.02.04
Beiträge
3.206
pete schrieb:
(...) Es hat sehr große Nachteile, die Namen von irgendwelchen Dingen in irgendeinen Code zu schreiben. Glaube mir.

*Commander: Nickt wie verrückt*
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Ich habe den Artikel von dem ich im letzten Beitrag wieder gefunden. Er ist ein Thema auf: www.mactechnews.de.
Dort heist es etwa:
Ich kenne den Fehler. Wenn Du im GUI Builer ein Fenster oder ein Dialog erzeugt hast auf dessen Felder (einstellugen z.B.) Du mit AppleScript zugreifst, dann kommt der Fehler (wie oben Beschrieben) wenn der Benutzer das Fenster mit dem roten Knopf geschlossen hat und Du danach wieder auf die Felder zugreifen willst.

Normalerweise ist das Fenster-Objekt auch zugreifbar, wenn es geschlossen wurde (es ist nur nicht sichtbar). Aber AppleScript kann wohl durch einen Fehler nicht mehr drauf zugreifen.

Ich fand nur einen Workaround: Die Einstellungen speichern, die Applikation schliessen und neu starten". Alternative: Das Fenster darf nicht über den Roten Knopf schliessbar sein.
Aber auch dort ist keine Lösung zu finden. Ich habe in anderen Diskusionen Meldungen gefunden wie:
Der Fehler liegt in der erweiterung AppleSkript2.component. Es giebt zurzeit kein Update dass das Problem beheben würde.

Wiso meinst ihr hätte es nachteile Objekte über ihren Namen zu identifizieren?

Ein Beispiel:
In einem Programm erstelle ich ein neues Fenster und lege dort mehrere Buttons zur steuerung von iTunes an. Nun taufe ich im Info Fenster unter AppleSkript die Namen fest und zwar so: 1. itunesPlay, 2. itunesStop etc... . In XCode schreibe ich nun Aktionen für die einzelnen Buttons im gleichen Skript: if name of theObject is equal to "itunesPlay" then... .Selbst wenn ich Jahre später eine Funktion ändern möchte, ist der Name itunesPlay klar was die aufgabe dieses Buttons ist. Hingegen mit der id 133 kann ich danach nichts mehr anfangen.

Aber der springende Punkt ist nach wie vor: Warum verlieren alle meine Objekte nach dem klicken auf das hübsche kleine rote kästchen links oben ihre Namen???
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Ich habe inzwischen noch unzählige Diskusionen gefunden die sich mit dem Problem beschäftigen!!! Überall schildern Leute ihr Problem und niemand weis rat!
Diese Fehlermeldung hat mich mal fast zur Verzweiflung gebracht. Am Ende war's die Sache mit dem roten Button. Ist mir bis heute unbegreiflich, aber war genau so. Es kommt nicht drauf an, was das Skript macht, sondern es kommt drauf an, was du machst, bevor du das Skript startest. Ich weiss, dass das ziemlich unglaubwürdig klingt...

Wenn also jemand eine Lösung zu diesem Problem hat dann hilft er nicht nur mir, sondern noch vielen anderen Skripters!!!
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Ich muss iher mal eins klarstellen über Fenster:

Name of window ist der AppleSkript Name und den vergibt man im IB unter AppleSkript!
Title of window ist der Name des Fensters in Titelleiste! Der wird im IB unter Attributes und nur den kann der Benutzer sehen! Und den werde ich logischerweise niemals in einem Skript verwenden!

Ich habe desshalb immer von AppleSkript Namen gesprochen!
Mit meinem Beispielskript wollte ich zeigen, wass nach dem schliesen eines fensters mit dem AppleSkript Namen passiert.

Ich hätte eine Lösung, aber ich weis nicht wie ich es anstellen soll!
Also: wie ist es möglich einen close befehl in ein hide umzuwandeln, denn dann müsste ich über den "on will close theObject" Handler einen stopp der Aktion erwirken. Weis jemand wie das geht? o_O

Leider habe ich schon gegessen, aber Morgen ist ja auch nuch ein Tag!!
 
Zuletzt bearbeitet:

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Tja hast sicher viel zeit in dein schönes skript investiert, oder hast du es kopiert?!? ;)

Ich stelle mir die Lösung meines Problems etwa so vor:

Code:
[COLOR="Blue"][B]on[/B] will close[/COLOR] [COLOR="green"]meinFenster[/COLOR]
     [COLOR="Red"]-- jetzt sollte der schliessprozess abgebrochen werden![/COLOR]
    [COLOR="Blue"] hide[/COLOR] [COLOR="Green"]meinFenster[/COLOR]
[COLOR="Blue"][B]end[/B] will close[/COLOR]

Im IB wird das Fenster mit einem Skript verknüpft, dass den oben beschriebenen Handler enthällt. Aber wie kann ich nun Das Programm dazu zwingen ein Fenster nun doch nicht zuschliesen, obwohl der Benutzer den schliessen button gedrückt hat?

Vorschläge sind hier gerne willkomen

Grüsse Patric
 
Zuletzt bearbeitet:

pi26

Adams Parmäne
Registriert
17.12.04
Beiträge
1.297
Hallo,

kommt zwar darauf an ob der Event wie anderswo üblich mit einem Rückgabewert implementiert ist, aber versuch es mal mit

return false

oder

return true


mfg pi26
 

pi26

Adams Parmäne
Registriert
17.12.04
Beiträge
1.297
Um doch auch noch auf das Ursprungsproblem einzugehen;)

Es hat möglicherweise etwas mit dem Fenstertyp zu tun - diverse Fenstertypen werden im Grunde als Kids des Hauptfensters gehandelt...


mfg pi26
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Also habs gleich mal ausprobiert:

return true bzw. return false funktioniert nicht.
Das Fenster wird trozdem geschlossen. Und return alleine geht auch nicht, dass habe ich früher schon ausprobiert.

trozdem glaube ich es muss doch einen weg geben, den Prozess abzubrechen.

Das mit den "Untergeordneten" fenster eines Haubtfensters verstehe ich nicht, ich habe meines wissens kein Fenster als main window definiert!
Alle Fenster meines Programms werden über das Menü aufgeruffen.
 

pi26

Adams Parmäne
Registriert
17.12.04
Beiträge
1.297
üblicherweise kann man ja für Fenster definieren, ob die rote close-Ampel überhaupt aktiv sein soll, weiss jetzt nicht ob AS-Studio dir diese Möglichkeit lässt. Andernfalls ist "will close" ja vor dem Close, vielleicht gibt es auch einen "close"-Event in dem du dann einfach wieder ein open bzw show einfügst...


mfg pi26
 

schnydi

James Grieve
Registriert
08.01.06
Beiträge
137
Die Fenster müssen eine möglichkeit zum schliessen besitzen.
Andernfalls ist "will close" ja vor dem Close,
So billig läst sich ein Programm nicht überlisten, man kann schon in den "on will close" Handler ein show window einfügen, das fenster wird jedoch gleich danach geschlossen.

es giebt nur zwei Handler:
1.) on will close
2.) should close

Nun muss ich einer kollegin noch ein neues iBook installieren gehen!
Ich hoffe dass die neuen PowerMacs oder wie sie dann auch immer heisen "MacMac????" :-D auf den Markt kommen!

Bis dann
 

pi26

Adams Parmäne
Registriert
17.12.04
Beiträge
1.297
doch gerade getestet -- du kannst du close-Ampel deaktivieren.

1. das .nib-Datei öffnen
2. das ensprechende Fenster wählen
3. Im Menü Tools den Inspektor wählen
4. In Title Bar Controls die Checkbox "close" deaktiveren


mfg pi26