hilfdirselbst.ch
Facebook Twitter gamper-media
Kai Rübsamen  M  p
Beiträge: 4457
6. Sep 2013, 15:31
Beitrag #1 von 13
Bewertung:
(3540 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Hallo!

Ich habe die Funktion zum Anzeigen und Auswerten eines Dialogs aus dem FindChangeByList Skript genommen.

In Kurzform: Der User kann entweder a, b oder c wählen. Dieses Ergebnis lege ich in eine Variable 'counter'

Zum einen frage ich mich, ob man das mit Aufbau u. Auswertung des Dialogs so macht und dann habe ich das Problem, dass return offenbar nichts zurückgibt. Denn wenn ich später außerhalb der Funktion auf if(counter == 2) prüfe, kommt die Meldung 'counter ist undefiniert'.

Code
function myDisplayDialog(){ 
var myDialog = app.dialogs.add({name:"SkewFrameAndContent"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Art der Formatierung:"});
}
var myRangeButtons = radiobuttonGroups.add();
with(myRangeButtons){
radiobuttonControls.add({staticLabel:"Absatzformat", checkedState:true});
radiobuttonControls.add({staticLabel:"Lokale Abweichung", checkedState:true});
radiobuttonControls.add({staticLabel:"Zeichenformat"});
}
}
}
var myResult = myDialog.show();
if(myResult == true){
var counter;
switch(myRangeButtons.selectedButton){
case 0:
counter = 1;
break;
case 1:
counter = 2;
break;
case 2:
counter = 3;
break;
}
return counter;
myDialog.destroy();
}
else{
myDialog.destroy();
exit();
}
}


Danke.

Gruß Kai Rübsamen
_______________________
Top
 
X
WernerPerplies
Beiträge: 2177
6. Sep 2013, 16:08
Beitrag #2 von 13
Beitrag ID: #517014
Bewertung:
(3526 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Hallo Kai,

ein einfaches Beispiel, vielleicht hilft es Dir:

Code
#target indesign 
main()

function main()
{
var result = showDialog()
alert(result);
function showDialog()
{
var dlgWin = new Window("dialog", "Rückgabetest");
var btYes = dlgWin.add("button", undefined, app.translateKeyString("$ID/Yes"), {name:"yes"});
var btNo = dlgWin.add("button", undefined, app.translateKeyString("$ID/No"), {name: "Cancel"});
/*boolean*/btNo.onClick=function()
{
dlgWin.close(1);
}
/*string*/btYes.onClick=function()
{
dlgWin.close(2);
}
return dlgWin.show();
}
}


Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#517005] Top
 
Kai Rübsamen  M  p
Beiträge: 4457
6. Sep 2013, 16:36
Beitrag #3 von 13
Beitrag ID: #517019
Bewertung:
(3507 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Hallo Werner,

leider nein. Wie immer bin ich am pröbeln und stoße auf die meisten Ergebnisse eher durch Zufall, als durch fundiertes Wissen ;-)

Funktionen u. ich sind bisher keine Freunde. Was fehlt dir, um mir in meinem konkreten Fall eine Antwort zu geben?

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517014] Top
 
WernerPerplies
Beiträge: 2177
6. Sep 2013, 17:23
Beitrag #4 von 13
Beitrag ID: #517021
Bewertung:
(3478 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Hallo Kai,

Zitat leider nein. Wie immer bin ich am pröbeln und stoße auf die meisten Ergebnisse eher durch Zufall, als durch fundiertes Wissen ;-)

Da hilft Lesen:
Bücher und weitere Infos
Deine Frage wird bei Grant Gamble, in meiner Ausgabe: 4. Creating Dialogs, Seite 67, Listing 4-4 behandelt.

Ich mache so etwas halt etwas anders, und dachte, dass ich Dir Deine Frage nach der Rückgabe der Parameter beantwortet hätte.

So, hier noch einmal ein ein Beispiel, das, wenn ich alles richtig verstanden habe, das tut, was Du möchtest. allerdings auf einem anderen Weg.

Aber der Weg ist aber Geschmackssache.

Zitat Funktionen u. ich sind bisher keine Freunde. Was fehlt dir, um mir in meinem konkreten Fall eine Antwort zu geben?


Mir fehlt da gar nichts, aber wenn Dir die Arbeitsweise von Funktionen unklar ist, solltest Du daran arbeiten, denn die brauchst Du immer wieder.

Die Rückgabe eines modalen Dialogs ist aber schon ein recht spezielles Ding.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#517019] Top
 
Gerald Singelmann  M  p
Beiträge: 6178
6. Sep 2013, 17:50
Beitrag #5 von 13
Beitrag ID: #517023
Bewertung:
(3467 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Hai Kai,

Werner kennt das halt nicht, dass man neugierig seine Nase nebenbei in Sachen reinsteckt, die man gar nicht vollständig durchdringen will ;)

Dein eigentliches Problem ist vermutlich, dass du den Wert, den die Funktion zurückgibt, nicht aufnimmst.

Wenn du folgendes machst:
Code
 
var my_counter = myDisplayDialog();

function myDisplayDialog(){
(...)
}


...dann kannst du hinterher den Wert, der innerhalb der Funktion "counter" hieß mit "my_counter" auslesen.

--------------------

In der Funktion hast du noch ein kleines Problemchen. Mit "return" hört die Funktion auf. Alles was danach kommt, wird nicht mehr ausgeführt.

In deinem Fall:

Code
		return counter;  
myDialog.destroy();


Die zweite Zeile passiert nicht. Du musst die Reihenfolge umdrehen.

------------------

Und: damit in my_counter immer etwas drin steht, musst du auch immer etwas zurückgeben.

In deinem Fall müsste es also z.B. heißen:
Code
	else{  
myDialog.destroy();
return null;
}


und der Funktionsaufruf ist dann:
Code
var my_counter = myDisplayDialog(); 
if (my_counter == null) {
return null;
// oder exit(), je nachdem
}





Also insgesamt:
Code
var my_selection = myDisplayDialog(); 
if (my_selection == null) {
alert("Sie haben abgebrochen");
} else {
alert("Sie haben den " + my_selection + ". Knopf gedrückt");
}

function myDisplayDialog(){
var myDialog = app.dialogs.add({name:"SkewFrameAndContent"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Art der Formatierung:"});
}
var myRangeButtons = radiobuttonGroups.add();
with(myRangeButtons){
radiobuttonControls.add({staticLabel:"Absatzformat", checkedState:true});
radiobuttonControls.add({staticLabel:"Lokale Abweichung"});
radiobuttonControls.add({staticLabel:"Zeichenformat"});
}
}
}
var myResult = myDialog.show();
if(myResult == true){
var counter = myRangeButtons.selectedButton + 1;
myDialog.destroy();
return counter;
}
else{
myDialog.destroy();
return null;
}
}



Alles klar?

--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#517019] Top
 
Kai Rübsamen  M  p
Beiträge: 4457
6. Sep 2013, 17:55
Beitrag #6 von 13
Beitrag ID: #517024
Bewertung:
(3463 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Werner, ich freu mich, dass du mir antwortest, aber ich verstehe gar nicht, warum das hier so schwierig ist?! Dein zweites Beispiel scheint zu fehlen? ;-)

Hast du dir mein Schnipsel mal richtig angesehen?
So wie ich es verstehe, ist meine Variable 'counter' außerhalb der Funktion nicht bekannt.

Ich hab das mit dem FCBL-Skript mal verglichen. Hier wird die Variable in der Funktion main() deklariert und dann nochmal in der Funktion myDisplayDialog()? Ich hatte es so verstanden, dass man Variablen eben nicht 2x deklariert, sondern irgendwie die Werte übergibt.

Da hier jetzt alles 'myObject' heißt u. mehrfach übergeben bzw. deklariert wird, sehe ich als Anfänger jetzt nicht mehr, was hier passiert bzw. was in meinem Fall anders laufen muss.

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517021] Top
 
WernerPerplies
Beiträge: 2177
6. Sep 2013, 18:01
Beitrag #7 von 13
Beitrag ID: #517025
Bewertung:
(3450 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Hallo Kai,

da ist nichts schwierig, und Gerald hat Dir ja jetzt einige Erklärungen geliefert.

Mein zweites Skript habe ich tatsächlich vergessen, also noch einmal:
Code
#target indesign 
main()
function main()
{
var result = showDialog()
alert(result);

function showDialog()
{
var dlgWin = new Window("dialog", "Rückgabetest");
dlgWin.panel = dlgWin.add("panel", undefined, "Art der Formatierung:");
dlgWin.panel.rb1 = dlgWin.panel.add("radiobutton", undefined, "Absatzformat");
dlgWin.panel.rb2 = dlgWin.panel.add("radiobutton", undefined, "Lokale Abweichung");
dlgWin.panel.rb3 = dlgWin.panel.add("radiobutton", undefined, "Zeichenformat");
dlgWin.panel.rb1.onClick=function()
{dlgWin.close(1);}
dlgWin.panel.rb2.onClick=function()
{dlgWin.close(2);}
dlgWin.panel.rb3.onClick=function()
{dlgWin.close(3);}
var result = dlgWin.show();
dlgWin = null;
return result;
}
}


Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#517024] Top
 
Kai Rübsamen  M  p
Beiträge: 4457
6. Sep 2013, 18:38
Beitrag #8 von 13
Beitrag ID: #517026
Bewertung:
(3412 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Hallo ihr beiden. Großes Dankeschön :)

Gero hat den Vorteil, Mitglied der ehemaligen Javascript-Männergruppe zu sein und weis, wie er mit Grafikern reden muss ;-)

Wenn ihr hier wollt, dass auch Grafiker ein bisschen scripten lernen, finde ich diese Art der Kommunikation gegenüber Werners Beispielen zumindest für mich geeigneter.

Zu meiner Ehrenrettung möchte ich sagen, dass ich eine lauffähige Variante ohne Funktion habe und heute erstmals einen Dialog gebastelt habe ;-) Trotzdem möchte ich das Ganze natürlich halbwegs verstehen. Den Gamble habe ich übrigens auch …

Nun zum Skript:
Antwort auf: Dein eigentliches Problem ist vermutlich, dass du den Wert, den die Funktion zurückgibt, nicht aufnimmst.

Genau. Alleine die Tatsache, dass du die Funktion in eine Variable legst und mit unterschiedlichen Namen arbeitest, macht das für mich jetzt deutlich.
Antwort auf: In der Funktion hast du noch ein kleines Problemchen. Mit "return" hört die Funktion auf.

Ah. Ein wichtiger Hinweis. Ich dachte, man gibt damit nur einen Wert zurück. Danke.
Antwort auf: damit in my_counter immer etwas drin steht, musst du auch immer etwas zurückgeben.

DAS habe ich noch nicht ganz verstanden!
Kann ich nicht anstelle von
if (counterResult == null) exit();
direkt in der Funktion
statt return null > exit(); schreiben?

Edit: Nein kann ich wohl nicht, da ein exit() innerhalb der Funktion nur die Funktion, aber nicht das Skript abbricht?!

var counter = myRangeButtons.selectedButton + 1;: Das finde ich besser gelöst, als im FCBL-Skript, cool.

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517025]
(Dieser Beitrag wurde von Kai Rübsamen am 6. Sep 2013, 18:48 geändert)
Top
 
WernerPerplies
Beiträge: 2177
6. Sep 2013, 18:44
Beitrag #9 von 13
Beitrag ID: #517027
Bewertung:
(3404 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Hallo Kai,

Zitat Ich hatte es so verstanden, dass man Variablen eben nicht 2x deklariert, sondern irgendwie die Werte übergibt.


Das hängt davon ab, wie Du die Variablen definierst und nutzt.
Variablen sind je nach Definition unterschiedlich sichtbar.

Falls es Dich interessiert, kannst Du Dir ja mal dieses Skript ansehen:
Code
#target indesign 
main()
function main()
{
// sichtbar in allen Funktionen, die die Teil
// der Funktion main sind:
var couldBeSeenInChilds = "couldBeSeenInChilds";
childOne("thisIsCreatesALocalVariable");
var returnValue = childTwo();
alert("returnValueOfchildTwo(): " + returnValue);
function childOne(/*string*/localVariable)
{
// local variable could be seen in childs, but not in function at same or higher levels
alert("childOne: " + couldBeSeenInChilds+"\n"+localVariable);
childOneOfOne();
function childOneOfOne()
{
var isNotDefinedInParents = "isNotDefinedInParents";
// but this is a really dangerours thing, it defines a global variable
isDefinedAtEveryLevel = "isDefinedAtEveryLevel";
alert("childOneOfOne: " + couldBeSeenInChilds +"\n" + isDefinedAtEveryLevel+"\n"+localVariable);
}
alert("childOne: isNotDefinedInParents " + "undefined" +"\n" + isDefinedAtEveryLevel);
}
function childTwo()
{
// local variable could be seen in childs, but not in function at same or higher levels
alert("childTwo: " + couldBeSeenInChilds+"\nlocalVariable is here undefined");
childTwoOfOne();
function childTwoOfOne()
{
var isNotDefinedInParents = "isNotDefinedInParents";
// but this is a really dangerours thing, it defines a global variable
alert("cildtwoOfOne: " + couldBeSeenInChilds +"\n" + isDefinedAtEveryLevel);
}
alert("childOne: isNotDefinedInParents " + "undefined" +"\n" + isDefinedAtEveryLevel);
return "aParameter";
}
alert("childOne: isNotDefinedInParents " + "undefined" +"\n" + isDefinedAtEveryLevel);
}
alert("childOne: isNotDefinedInParents " + "undefined" +"\n" + isDefinedAtEveryLevel);


Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#517024] Top
 
Kai Rübsamen  M  p
Beiträge: 4457
6. Sep 2013, 19:16
Beitrag #10 von 13
Beitrag ID: #517028
Bewertung:
(3382 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Soderle: Das Übungsskript ist übrigens eine Antwort auf Heikes Frage hier: http://www.hilfdirselbst.ch/...;;page=unread#unread

Heike hatte sich in der Zwischenzeit dafür entschieden, den Redakteuren ein Absatzformat für den Rahmen an die Hand zu geben. Es war nur nicht klar, ob die Verzerrung für den Text im AF, als lokale Abweichung oder mit einem ZF erfolgen sollte.

Anbei mein Skript und ein Snippet, falls es einer testen mag. Über die Meldung grober Fehler oder Verbesserungsvorschläge würde ich mich freuen. Und ja, man könnte den Dialog sicher schöner gestalten oder sinnvoller benennen. Aber das ist ein anderes Thema ;-)

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517027] Top

Anhang:
verzerren.zip (12.9 KB)
 
Gerald Singelmann  M  p
Beiträge: 6178
6. Sep 2013, 21:57
Beitrag #11 von 13
Beitrag ID: #517029
Bewertung:
(3332 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Zitat DAS habe ich noch nicht ganz verstanden!
Kann ich nicht anstelle von
if (counterResult == null) exit();
direkt in der Funktion
statt return null > exit(); schreiben?

Edit: Nein kann ich wohl nicht, da ein exit() innerhalb der Funktion nur die Funktion, aber nicht das Skript abbricht?!


Nein, entschuldige, da war ich zu korinthenkackerig.

exit() beendet an jeder Stelle das gesamte Script.

Ist aber ganz schlechter Stil.

So in etwa der Unterschied, ob du ein Gespräch beim Kaufmann mit "Hmmm, haben Sie nicht, na, dann schau ich halt woanders" oder mit "IHR SEID DOCH ALLE SCH**E, ICH GEH JETZT ZUR KONKURRENZ" beendest.

Für jetzt ist es für dich aber völlig OK, das gesamte Script auch mitten in der Funktion mit exit() einzureißen.

--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#517026] Top
 
Kai Rübsamen  M  p
Beiträge: 4457
7. Sep 2013, 19:37
Beitrag #12 von 13
Beitrag ID: #517057
Bewertung:
(3213 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


Ist das so? Wenn ich Zeile 37 im Skript aus dem Beitrag vorher auskommentiere und dafür in Zeile 116 exit(); schreibe, wird das Skript trotzdem ausgeführt, wenn ich im Dialog auf Abbrechen klicke?

Selber rausgefunden: ;-) if(myResult == true) war doppelt angegeben. Jetzt ist es so, wie von dir beschrieben. Wenn du allerdings meinst, dass deine zusätzliche Variante die korrektere wäre, würde ich mir das so angewöhnen. Danke.

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517029] Top
 
Gerald Singelmann  M  p
Beiträge: 6178
8. Sep 2013, 01:17
Beitrag #13 von 13
Beitrag ID: #517061
Bewertung:
(3183 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Wie Ergebnis aus Funktion zurückgeben?


>wird das Skript trotzdem ausgeführt, wenn ich im Dialog auf Abbrechen klicke?

Nein. exit() bricht immer komplett ab. Egal wie oder wann oder wo.

--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#517057] Top
 
X