[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Wie Ergebnis aus Funktion zurückgeben?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Wie Ergebnis aus Funktion zurückgeben?

Kai Rübsamen
Beiträge gesamt: 4668

6. Sep 2013, 15:31
Beitrag # 1 von 13
Bewertung:
(3803 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.
X

Wie Ergebnis aus Funktion zurückgeben?

WernerPerplies
Beiträge gesamt: 2693

6. Sep 2013, 16:08
Beitrag # 2 von 13
Beitrag ID: #517014
Bewertung:
(3789 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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();
}
}



als Antwort auf: [#517005]

Wie Ergebnis aus Funktion zurückgeben?

Kai Rübsamen
Beiträge gesamt: 4668

6. Sep 2013, 16:36
Beitrag # 3 von 13
Beitrag ID: #517019
Bewertung:
(3770 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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?


als Antwort auf: [#517014]

Wie Ergebnis aus Funktion zurückgeben?

WernerPerplies
Beiträge gesamt: 2693

6. Sep 2013, 17:23
Beitrag # 4 von 13
Beitrag ID: #517021
Bewertung:
(3741 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


als Antwort auf: [#517019]

Wie Ergebnis aus Funktion zurückgeben?

Gerald Singelmann
  
Beiträge gesamt: 6261

6. Sep 2013, 17:50
Beitrag # 5 von 13
Beitrag ID: #517023
Bewertung:
(3730 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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?


als Antwort auf: [#517019]

Wie Ergebnis aus Funktion zurückgeben?

Kai Rübsamen
Beiträge gesamt: 4668

6. Sep 2013, 17:55
Beitrag # 6 von 13
Beitrag ID: #517024
Bewertung:
(3726 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


als Antwort auf: [#517021]

Wie Ergebnis aus Funktion zurückgeben?

WernerPerplies
Beiträge gesamt: 2693

6. Sep 2013, 18:01
Beitrag # 7 von 13
Beitrag ID: #517025
Bewertung:
(3713 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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;
}
}



als Antwort auf: [#517024]

Wie Ergebnis aus Funktion zurückgeben?

Kai Rübsamen
Beiträge gesamt: 4668

6. Sep 2013, 18:38
Beitrag # 8 von 13
Beitrag ID: #517026
Bewertung:
(3675 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


als Antwort auf: [#517025]
(Dieser Beitrag wurde von Kai Rübsamen am 6. Sep 2013, 18:48 geändert)

Wie Ergebnis aus Funktion zurückgeben?

WernerPerplies
Beiträge gesamt: 2693

6. Sep 2013, 18:44
Beitrag # 9 von 13
Beitrag ID: #517027
Bewertung:
(3667 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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);



als Antwort auf: [#517024]

Wie Ergebnis aus Funktion zurückgeben?

Kai Rübsamen
Beiträge gesamt: 4668

6. Sep 2013, 19:16
Beitrag # 10 von 13
Beitrag ID: #517028
Bewertung:
(3645 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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 ;-)


als Antwort auf: [#517027]
Anhang:
verzerren.zip (12.9 KB)

Wie Ergebnis aus Funktion zurückgeben?

Gerald Singelmann
  
Beiträge gesamt: 6261

6. Sep 2013, 21:57
Beitrag # 11 von 13
Beitrag ID: #517029
Bewertung:
(3595 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


als Antwort auf: [#517026]

Wie Ergebnis aus Funktion zurückgeben?

Kai Rübsamen
Beiträge gesamt: 4668

7. Sep 2013, 19:37
Beitrag # 12 von 13
Beitrag ID: #517057
Bewertung:
(3476 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


als Antwort auf: [#517029]

Wie Ergebnis aus Funktion zurückgeben?

Gerald Singelmann
  
Beiträge gesamt: 6261

8. Sep 2013, 01:17
Beitrag # 13 von 13
Beitrag ID: #517061
Bewertung:
(3446 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
>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.


als Antwort auf: [#517057]
X

Aktuell

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
02.02.2023

Prozesse optimieren und effizient gestalten

Zürich
Donnerstag, 02. Feb. 2023, 08.00 - 10.00 Uhr

Digitalisierung, Webauftritt

Digitalisierung mitgestalten - Worauf kommt es an? Wie wichtig ist die Webseite? Webseite mit Word Press? Interne Prozesse optimieren

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: Birol Isik, E-Mailinfo AT bkcc DOT ch

https://digitalisierung-heute.ch/digitalisierung-informationstag-schweiz/

Veranstaltungen
01.03.2023 - 09.03.2023

Online
Mittwoch, 01. März 2023, 00.00 Uhr - Donnerstag, 09. März 2023, 00.00 Uhr

Online Webinar

Wie gehen wir mit diesen Veränderungen um? Was ist notwendig, damit wir die Digitalisierung im Unternehmen klappt? Veränderungsprozesse verstehen und entsprechend handeln Mitarbeiter als Botschafter Webseite mit WordPress erstellen SEA /SEO (Ads aufschalten)

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: B. Isik, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/digitalisierung-schweiz/