Sorry for taking so long in responding to your suggestions. I found them both to be helpful, but I'm afraid I need to award the "Correct Answer" to Skemicle​. His answer was easier for me to understand and I was able to implement the change he suggested with little to no difficulty. Skemicle, thank you. I don't know why arrays work in the loop and objects don't, but now that I know they make a difference in such cases, I'll be sure to keep that in mind. Loic.Aigon​, I really wanted to go with your answer. I definitely can appreciate modular code that is broken down into smaller, easier-to-follow tasks and can be re-used more than once in the main program. However, I am still apparently so much of a n00b that I was having difficulty following the logic of your code. In fact, I think there may be a syntax error or two in it, just from reading it. I could be entirely wrong, though, of course. Also, I've never used event handlers before--even in a Java program I wrote for work--so as much as I wanted to use your answer, I just really need to understand what I'd be getting into first. After all, if bugs were found, I'd need to maintain the code, so I'd rather grock it fully first. Perhaps if you walked me through the code execution, step by step, that may help me to understand it (and event handlers, even) better. Again, thank you both for your rapid responses to my question! You're both awesome! Also, here's the final executable code that now seems to work properly: /** * Label is an object that represents a single label for a product. * */ function Label(lSize, lQuantity, lInstructions, lContentType, lContents) { this.lSize = lSize; // String: The size of the label ("Brother 3x1", "Zebra 3x1", or "Zebra 6x4"). this.lQuantity = lQuantity; // Number: Actual quantity of this label. this.lInstructions = lInstructions; // String: The instructions for this label. this.lContentType = lContentType; // String: "Text" = text-only label, "File" = file-based label (using pre-made artwork). this.lContents = lContents; // String or File: Depending on previous property, can be a String for a text-only label, // or a File object for a file-based label. } // Label groups, as an object. function labelGroup (labelPanel, quantityInstGroup, quantityInstStatics, quantityInstFields, quantity, instructions, labelSizeGroup, rbBrother3x1, rbZebra3x1, rbZebra6x4, labelTypeGroup, labelTypeRadios, labelTypeFields, typeFileGroup, rbTypeText, rbTypeFile, textfield, filenameField, browsebutton, fileselected) { this.labelPanel = labelPanel; this.quantityInstGroup = quantityInstGroup; this.quantityInstStatics = quantityInstStatics; this.quantityInstFields = quantityInstFields; this.quantity = quantity; this.instructions = instructions; this.labelSizeGroup = labelSizeGroup; this.rbBrother3x1 = rbBrother3x1; this.rbZebra3x1 = rbZebra3x1; this.rbZebra6x4 = rbZebra6x4; this.labelTypeGroup = labelTypeGroup; this.labelTypeRadios = labelTypeRadios; this.labelTypeFields = labelTypeFields; this.typeFileGroup = typeFileGroup; this.rbTypeText = rbTypeText; this.rbTypeFile = rbTypeFile; this.textfield = textfield; this.filenameField = filenameField; this.browsebutton = browsebutton; this.fileselected = fileselected; } // Label dialog - Choosing a file for the label. function fileLabel (fnFields, fnFiles) { return function () { var thisFile = File.openDialog(); fnFields[this.label].text = thisFile.fsName; fnFiles[this.label] = thisFile; // thisGroup.fileselected = thisFile; }; } // Label dialog. function getLabelInfo (labelArray, lastButton) { var totalNumLabels = 3; var wLabelTitle = "Label"; wLabelTitle += totalNumLabels > 1 ? "s " : " "; wLabelTitle += "for item: " + "<Test Name>" + "."; var lastButtonText = lastButton ? "Begin Proofing" : "Next Product"; var wLabel = new Window("dialog", wLabelTitle); var productNameText = wLabel.add("statictext", undefined, "<Test Name>"); // productNameText.graphics.font = ScriptUI.newFont("Myriad Pro", "Bold", 20); // Font handling no longer works in CC+. var labelGroups = []; var fnFields = []; var fnFiles = []; var thisField; // var thisFile; for (var index = 0; index < totalNumLabels; index++) { // For each label for this item, create a labelGroup object and add it to the array. var thisGroup = new labelGroup(); thisGroup.labelPanel = wLabel.add("panel", /*[0, 0, 300, 75]*/ undefined, "Label " + (index + 1)); thisGroup.labelPanel.orientation = "row"; thisGroup.quantityInstGroup = thisGroup.labelPanel.add("group"); thisGroup.quantityInstGroup.alignChildren = "top"; thisGroup.quantityInstStatics = thisGroup.quantityInstGroup.add("group"); thisGroup.quantityInstStatics.orientation = "column"; thisGroup.quantityInstStatics.alignChildren = "right"; // thisGroup.quantityInstStatics.margins = [0, 3, 0, 0]; // [left, top, right, bottom]. thisGroup.quantityInstStatics.margins.top = 3; thisGroup.quantityInstStatics.spacing = 15; thisGroup.quantityInstStatics.add("statictext", undefined, "Quantity: "); thisGroup.quantityInstStatics.add("statictext", undefined, "Instructions: "); thisGroup.quantityInstFields = thisGroup.quantityInstGroup.add("group"); thisGroup.quantityInstFields.orientation = "column"; thisGroup.quantityInstFields.alignChildren = "left"; thisGroup.quantity = thisGroup.quantityInstFields.add("edittext"); thisGroup.quantity.characters = 6; thisGroup.instructions = thisGroup.quantityInstFields.add("edittext", [0, 0, 200, 55], "", {multiline: true, scrolling: true, wantReturn: true}); thisGroup.labelPanel.add("panel", [0, 0, 2, 100]); // Vertical divider line. thisGroup.labelSizeGroup = thisGroup.labelPanel.add("group"); thisGroup.labelSizeGroup.orientation = "column"; thisGroup.labelSizeGroup.alignChildren = "left"; thisGroup.rbBrother3x1 = thisGroup.labelSizeGroup.add("radiobutton", undefined, "Brother 3x1"); thisGroup.rbZebra3x1 = thisGroup.labelSizeGroup.add("radiobutton", undefined, "Zebra 3x1"); thisGroup.rbZebra6x4 = thisGroup.labelSizeGroup.add("radiobutton", undefined, "Zebra 6x4"); thisGroup.rbBrother3x1.value = true; thisGroup.labelPanel.add("panel", [0, 0, 2, 100]); // Vertical divider line. thisGroup.labelTypeGroup = thisGroup.labelPanel.add("group"); thisGroup.labelTypeGroup.alignChildren = "top"; thisGroup.labelTypeRadios = thisGroup.labelTypeGroup.add("group"); thisGroup.labelTypeRadios.orientation = "column"; thisGroup.labelTypeRadios.alignChildren = "left"; thisGroup.labelTypeRadios.margins.top = 6; thisGroup.labelTypeRadios.spacing = 13; thisGroup.rbTypeFile = thisGroup.labelTypeRadios.add("radiobutton", undefined, "File"); thisGroup.rbTypeText = thisGroup.labelTypeRadios.add("radiobutton", undefined, "Text"); thisGroup.rbTypeText.value = true; thisGroup.labelTypeFields = thisGroup.labelTypeGroup.add("group"); thisGroup.labelTypeFields.orientation = "column"; thisGroup.labelTypeFields.alignChildren = "left"; thisGroup.typeFileGroup = thisGroup.labelTypeFields.add("group"); thisField = thisGroup.typeFileGroup.add("edittext", undefined, "---", {readonly: true}); thisField.characters = 20; thisField.label = index; fnFields[index] = thisField; thisGroup.browsebutton = thisGroup.typeFileGroup.add("button", undefined, "Browse"); thisGroup.browsebutton.label = index; thisGroup.browsebutton.onClick = fileLabel(fnFields, fnFiles); thisGroup.textfield = thisGroup.labelTypeFields.add("edittext", [0, 0, 200, 55], "", {multiline: true, scrolling: true, wantReturn: true}); labelGroups.push(thisGroup); } var buttonGroup = wLabel.add("group"); buttonGroup.alignment = "right"; var cancelButton = buttonGroup.add("button", undefined, "Cancel", {name: "cancel"}); var okButton = buttonGroup.add("button", undefined, lastButtonText, {name: "ok"}); function getLabelSize (rButtonGroup) { for (k = 0; k < rButtonGroup.children.length; k++) { if (rButtonGroup.children .value === true) { return rButtonGroup.children .text; } } } function getContents (currentGroup, ind) { if (currentGroup.rbTypeText.value) { return currentGroup.textfield.text; } return fnFiles[ind]; } if (wLabel.show() == 1) { // Assign data gathered from fields to product's object. var thisLabel; var qty; for (j = 0; j < labelGroups.length; j++) { qty = labelGroups .quantity.text; thisLabel = new Label( getLabelSize(labelGroups .labelSizeGroup), parseInt(qty.replace(/\,/g, ''), 10), labelGroups .instructions.text, labelGroups .rbTypeText.value ? "Text" : "File", getContents(labelGroups , j) ); labelArray.push(thisLabel); } for (var l = 0; l < labelArray.length; l++) { thisLabel = labelArray ; $.writeln("[label sample output] Label " + (l+1) + " Size: " + thisLabel.lSize); $.writeln("[label sample output] Label " + (l+1) + " Quantity: " + thisLabel.lQuantity); $.writeln("[label sample output] Label " + (l+1) + " Instructions: " + thisLabel.lInstructions); $.writeln("[label sample output] Label " + (l+1) + " Content Type: " + thisLabel.lContentType); $.writeln("[label sample output] Label " + (l+1) + " Contents: " + thisLabel.lContents); $.writeln("[label sample output]"); } } else { $.writeln("[getLabelInfo] Canceling the Label window."); return 7; } return 0; } var returnedValue = 0; var labelArray = []; returnedValue = getLabelInfo(labelArray, true);
... View more