Adobe AIR 3.2 Glitch - actionscript-3

I just finished a successful build of my program last night. Then, I get up this morning, and after an update fro Adobe AIR 3.1 to AIR 3.2, I find THIS bug!
The same build under 3.1 works perfectly. However, as soon as 3.2 is installed, the following code after stopDrag fails silently. Mind you, it only fails in the packed and installed AIR application. It works perfectly when I test it inside of Adobe Flash Professional CS5.5
WHAT is going on? Here's the code I'm dealing with. Again, this works without error for Adobe AIR 3.1, but fails for 3.2. I cannot get to any other MouseEvent.MOUSE_UP events in my program at this point, due to my structure.
I omitted the irrelevant parts of the code. All the same, there is a lot, due to the fact that I don't know where the error occurs exactly. Instead of everything that is supposed to happen happening, stopDrag is the last line of code that fires in this block.
tile5.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler5);
function mouseUpHandler5(evt:MouseEvent):void
{
Mouse.cursor = "paw";
var obj = evt.target;
var target = obj.dropTarget;
obj.stopDrag();
if (target != null && target.parent == hsSlot1)
{
brdgcheck(5, 1);
}
}
function brdgcheck(tile:int, slot:int)
{
var ck_brdg_l:String = "osr.Langue.brdg_l" + String(slot);
var ck_brdg_t:String = "osr.Langue.brdg_t" + String(tile);
var ck_slotfilled:String = "Slot" + String(slot) + "Filled";
var ck_tile:String = "tile" + String(tile);
var ck_slot:String = "hsSlot" + String(slot);
var ck_txtTile:String;
switch(tile)
{
case 1:
ck_brdg_t = osr.Langue.brdg_t1;
ck_txtTile = tile1.txtTile1.text;
break;
case 2:
ck_brdg_t = osr.Langue.brdg_t2;
ck_txtTile = tile2.txtTile2.text;
break;
case 3:
ck_brdg_t = osr.Langue.brdg_t3;
ck_txtTile = tile3.txtTile3.text;
break;
case 4:
ck_brdg_t = osr.Langue.brdg_t4;
ck_txtTile = tile4.txtTile4.text;
break;
case 5:
ck_brdg_t = osr.Langue.brdg_t5;
ck_txtTile = tile5.txtTile5.text;
break;
}
switch(slot)
{
case 1:
ck_brdg_l = osr.Langue.brdg_l1;
break;
case 2:
ck_brdg_l = osr.Langue.brdg_l2;
break;
case 3:
ck_brdg_l = osr.Langue.brdg_l3;
break;
case 4:
ck_brdg_l = osr.Langue.brdg_l4;
break;
case 5:
ck_brdg_l = osr.Langue.brdg_l5;
break;
}
if (ck_brdg_l == ck_brdg_t)
{
osr.Sonus.PlaySound("concretehit");
this[ck_slotfilled].visible = true;
switch(slot)
{
case 1:
Slot1Filled.txtSlot1.text = ck_txtTile;
break;
case 2:
Slot2Filled.txtSlot2.text = ck_txtTile;
break;
case 3:
Slot3Filled.txtSlot3.text = ck_txtTile;
break;
case 4:
Slot4Filled.txtSlot4.text = ck_txtTile;
break;
case 5:
Slot5Filled.txtSlot5.text = ck_txtTile;
break;
}
this[ck_tile].visible = false;
this[ck_slot].visible = false;
if (hsSlot1.visible == false && hsSlot2.visible == false && hsSlot3.visible == false && hsSlot4.visible == false && hsSlot5.visible == false)
{
osr.Gradua.Score(true);
osr.Gradua.Evaluate("brdg");
btnReset.visible = false;
hsChar.visible = false;
if (osr.Gradua.Fetch("brdg", "arr_act_stcnt") < 4)
{
bga.gotoAndPlay("FINKEY");
win_key();
}
else
{
bga.gotoAndPlay("FINNON");
}
}
else
{
osr.Gradua.Score(true);
}
}
else
{
osr.Gradua.Score(false);
osr.Sonus.PlaySound("glassbreak");
switch(tile)
{
case 1:
tile1.x = 92.85;
tile1.y = 65.85;
break;
case 2:
tile2.x = 208.80;
tile2.y = 162.85;
break;
case 3:
tile3.x = 324.80;
tile3.y = 65.85;
break;
case 4:
tile4.x = 437.80;
tile4.y = 162.85;
break;
case 5:
tile5.x = 549.80;
tile5.y = 65.85;
break;
}
}
}
EDIT: I found a good workaround, to use "if (hsSlot1.hitTestPoint(mouseX,mouseY) && hsSlot1.visible == true)"
However, a solution to this problem would still be appreciated!

Related

retrieving EntryID for Checkbox item in Google Sheets Form not working

I used the code from #contributorpw on this post get Entry ID which is used to pre-populate fields (Items) in a Google Form URL and added the extended list of form types from #SourceFli (in same post).
I get the error message: "Exception: The parameters (String) don't match the method signature for FormApp.CheckboxItem.createResponse". That checkbox has only 1 option: "yes".
The rest of all my form items are only TEXT items and work fine.
function getPreFillEntriesMap(){
var ssOrder = SpreadsheetApp.openById(ORDER_SPREADSHEET_ID);
var orderFormUrl = ssOrder.getFormUrl();
var orderForm = FormApp.openByUrl(orderFormUrl);
var form = orderForm;
// var form = FormApp.openById(id);
var items = form.getItems();
var newFormResponse = form.createResponse();
var itms = [];
for(var i = 0; i < items.length; i++){
var response = getDefaultItemResponse_(items[i]);
if(response){
newFormResponse.withItemResponse(response);
itms.push({
id: items[i].getId(),
entry: null,
title: items[i].getTitle(),
type: "" + items[i].getType()
});
}
}
var ens = newFormResponse.toPrefilledUrl().split("&entry.").map(function(s){
return s.split("=")[0];
});
ens.shift();
return Logger.log(itms.map(function(r, i){
r.entry = this[i];
return r;
}, ens));
}
function getDefaultItemResponse_(item){
switch(item.getType()){
case FormApp.ItemType.TEXT:
return item.asTextItem().createResponse("1");
break;
case FormApp.ItemType.MULTIPLE_CHOICE:
return item.asMultipleChoiceItem()
.createResponse(item.asMultipleChoiceItem().getChoices()[0].getValue());
break;
case FormApp.ItemType.CHECKBOX:
return item.asCheckboxItem()
.createResponse(item.asCheckboxItem().getChoices()[0].getValue());
break;
case FormApp.ItemType.DATETIME:
return item.asDateTimeItem()
.createResponse(new Date());
break;
case FormApp.ItemType.DATE:
return item.asDateItem()
.createResponse(new Date());
break;
case FormApp.ItemType.LIST:
return item.asListItem()
.createResponse(item.asListItem().getChoices()[0].getValue());
break;
case FormApp.ItemType.PARAGRAPH_TEXT:
return item.asParagraphTextItem()
.createResponse(item.asParagraphTextItem().createResponse("some paragraph"));
break;
case FormApp.ItemType.CHECKBOX_GRID:
return item.asCheckboxGridItem()
.createResponse(item.asCheckboxGridItem().createResponse([item.asGridItem().getColumns[0], item.asGridItem().getRows[0]]));
break;
case FormApp.ItemType.DURATION:
return item.asDurationItem()
.createResponse(item.asDurationItem().createResponse(2, 20, 20));
break;
case FormApp.ItemType.GRID:
return item.asGridItem()
.createResponse(item.asGridItem().createResponse([item.asGridItem().getColumns[0], item.asGridItem().getRows[0]]));
break;
case FormApp.ItemType.SCALE:
return item.asScaleItem()
.createResponse(item.asScaleItem().createResponse(1));
break;
case FormApp.ItemType.TIME:
return item.asTimeItem()
.createResponse(item.asTimeItem().createResponse(1, 1));
break;
default:
return undefined;
}
}
response of createResponse(responses) of Class CheckboxItem is String[]. In your script, the string is used. I thought that this might be the reason of your issue. So how about the following modification?
From:
return item.asCheckboxItem()
.createResponse(item.asCheckboxItem().getChoices()[0].getValue());
To:
return item.asCheckboxItem()
.createResponse([item.asCheckboxItem().getChoices()[0].getValue()]);
Reference:
createResponse(responses)

System.Text.Json parse document that exists internal to a string

I receive string content that starts with a JSON value (could be simple or complex) and has some additional content afterward. I'd like to be able to parse the JSON document.
I don't have control over the string, so I can't put any kind of delimiter after the JSON content that would enable me to isolate it.
Examples:
"true and some more" - yields <true>
"false this is different" - yields <false>
"5.6/7" - yields <5.6>
"\"a string\""; then this" - yields <"a string">
"[null, true]; and some more" - yields <[null, true]>
"{\"key\": \"value\"}, then the end" - yields <{"key": "value"}>
The issue is the trailing content. The parser expects the input to end and throws an exception:
')' is invalid after a single JSON value. Expected end of data.
There isn't an option in JsonDocumentOptions to allow trailing content.
As a bonus, if you can give a solution that uses ReadOnlySpan<char>, that'd be aweseme.
The suggested answer of the custom reader wasn't working for me because the problem existed in the base reader: it just doesn't like certain trailing characters.
Since I still wanted to rely on JsonDocument.Parse() to extract the element for me, I really just needed to find where the element stopped break that bit off as a separate piece and submit that to the parse method. Here's what I came up with:
public static bool TryParseJsonElement(this ReadOnlySpan<char> span, ref int i, out JsonElement element)
{
try
{
int end = i;
char endChar;
switch (span[i])
{
case 'f':
end += 5;
break;
case 't':
case 'n':
end += 4;
break;
case '.': case '-': case '0':
case '1': case '2': case '3':
case '4': case '5': case '6':
case '7': case '8': case '9':
end = i;
var allowDash = false;
while (end < span.Length && (span[end].In('0'..'9') ||
span[end].In('e', '.', '-')))
{
if (!allowDash && span[end] == '-') break;
allowDash = span[end] == 'e';
end++;
}
break;
case '\'':
case '"':
end = i + 1;
endChar = span[i];
while (end < span.Length && span[end] != endChar)
{
if (span[end] == '\\')
{
end++;
if (end >= span.Length) break;
}
end++;
}
end++;
break;
case '{':
case '[':
end = i + 1;
endChar = span[i] == '{' ? '}' : ']';
var inString = false;
while (end < span.Length)
{
var escaped = false;
if (span[end] == '\\')
{
escaped = true;
end++;
if (end >= span.Length) break;
}
if (!escaped && span[end] == '"')
{
inString = !inString;
}
else if (!inString && span[end] == endChar) break;
end++;
}
end++;
break;
default:
element = default;
return false;
}
var block = span[i..end];
if (block[0] == '\'' && block[^1] == '\'')
block = $"\"{block[1..^1].ToString()}\"".AsSpan();
element = JsonDocument.Parse(block.ToString()).RootElement;
i = end;
return true;
}
catch
{
element = default;
return false;
}
}
It doesn't care so much about what's in the middle except (for strings, objects, and arrays) to know whether it's in the middle of a string (where it would be valid for the end character to be found) and checking for \-delimited characters. It works well enough for my purposes.
It takes a ReadOnlySpan<char> and an integer by reference. i needs to be the start of the expected JSON value, and it will be advanced to the next character after, if a valid value is found. It also follows the standard Try* pattern of returning a bool with an output parameter for the value.

When pressed button in react, console log shows the result but page does not

I am new to react and web. I have an issue when calling the function console shows it but i can not show it in my page.
usePriest = (evt, id) => {
const num = 3;
const { rear,bottom2,bottom3,bottom,player1, player2, player3, player4, mycards } = this.state;
var whichPlayer;
switch(num){
case 1:
whichPlayer = player1[0];
rear[1]=whichPlayer;
rear[0]=card6;
break;
case 2:
whichPlayer = player2[0];
bottom[1]=whichPlayer;
bottom[0]=card6;
break;
case 3:
whichPlayer = player3[0];
bottom2[1]=whichPlayer;
bottom2[0]=card6;
break;
case 4:
whichPlayer = player4[0];
bottom3[1]=whichPlayer;
bottom3[0]=card6;
break;
}
// bottom[1]=whichPlayer;
// bottom[0]=card6;
// console.log(bottom);
}
and i call my function in here
else if (mycards[0]==="/static/media/priest.ae71698d.jpg") {
return ( <div>
<button className="button_card1_use" onClick={(evt) => this.usePriest(evt, 1)}>Use</button>
<button className="button_card1_discard">Discard</button>
<div className="about1"><p>Priest</p>
Player is allowed to see another player's hand. </div></div>
)
}
What should i return in function or do something in order to be able to show it on the page.
You just need to call a setState at the end of the function in order tot reflect the changes -:
usePriest = (evt, id) => {
const num = 3;
// your old code
this.setState({ rear,bottom2,bottom3,bottom,player1, player2, player3, player4, mycards })
}
Actually in JS things get copied by reference, so effectively we are mutating the state directly. This is a better solution for the same -:
usePriest = (evt, id) => {
const num = 3;
const { rear,bottom2,bottom3,bottom,player1, player2, player3, player4, mycards } = this.state;
var whichPlayer;
switch(num){
case 1:
this.setState({whichPlayer: player1[0], rear: [...rear, 0: card6, 1: whichPlayer]});
break;
case 2:
this.setState({whichPlayer: player2[0], bottom: [...bottom, 0: card6, 1: whichPlayer]});
break;
case 3:
this.setState({whichPlayer: player3[0], bottom2: [...bottom2, 0: card6, 1: whichPlayer]});
break;
case 4:
this.setState({whichPlayer: player4[0], bottom3: [...bottom3, 0: card6, 1: whichPlayer]});
break;
}
}

Line 49, 52,55,58,61,64- 1119:Access of possibly undefined property text through a reference with static type String

Not sure what I am doing wrong, I removed any text from the text box fields so why am I still getting this error ?
Code below :
switch (day) {
case "Sun":
day.text = "Monday";
break;
case "Mom":
day.text = "Tuesday";
break;
case "Tue":
day.text = "Wednesday";
break;
case "Wed":
day.text = "Thursday";
break;
case "Thu":
day.text = "Friday";
break;
case "Fri":
day.text = "Saturday";
break;
case "Sat":
day.text = "Sunday";
break;
}
switch (codeToday) {
case "0":
case "3200":
var weather00:weather00 = new weather00();
_weatherToday.addChild(weather00);
_weatherToday.scaleX = 10.85;
_weatherToday.scaleY = 158.75;
break;
case "1":
case "3200":
var weather01:weather01 = new weather01();
_weatherToday.addChild(weather01);
_weatherToday.scaleX = 10.85;
_weatherToday.scaleY = 158.75;
break;
}
i suppose that 'day' is a String variable and have not a text property - look here -> String
Some components have a text property like: TextField and TextArea

my google apps script doesn't run, no parameters with serverhandler

I try to change a sheets with a script but it doesn't work as expected. I can load the right panel, but nothing happens when I try to record the change. It seems "masterFunctionPS" isn't called.
The function periodSelection post the panel, the listbox and the button. But nothing append, when I clic on the Button. Nothing change in the sheets.
function periodSelection() {
var activeSS = SpreadsheetApp.getActiveSpreadsheet();
var sheetPS = activeSS.getSheetByName("Periods");
var uiPS = UiApp.createApplication().setWidth(300);
var panelPS = uiPS.createVerticalPanel();
var periodPS = uiPS.createListBox();
for (var i = 2; i < 13; i++) {
var range = "A" + i;
periodPS.addItem(sheetPS.getRange(range).getValue());
}
var endDatePS = uiPS.createDatePicker();
var recordPS = uiPS.createButton("Enregistrer");
var masterPS = uiPS.createServerHandler('masterFunctionPS');
masterPS.addCallbackElement(periodPS)
.addCallbackElement(endDatePS)
recordPS.addClickHandler(masterPS);
panelPS.add(periodPS);
panelPS.add(endDatePS);
panelPS.add(recordPS);
uiPS.add(panelPS);
SpreadsheetApp.getUi().showSidebar(uiPS);
return uiPS;
}
function masterFunctionPS(element) {
var parameterPS = element.parameter;
var appE = UiApp.getActiveApplication();
var periodE = parameterPS.periodPS;
var endDateE = parameterPS.endDatePS;
var activeE = parameterPS.activeSS;
var sheetE = parameterPS.sheetPS;
switch (periodE) {
case "P1":
sheetE.getRange("C2").setValue(endDateE);
break;
case "P2":
sheetE.getRange("C3").setValue(endDateE);
break;
case "P3":
sheetE.getRange("C4").setValue(endDateE);
break;
case "P4":
sheetE.getRange("C5").setValue(endDateE);
break;
case "P5":
sheetE.getRange("C6").setValue(endDateE);
break;
case "P6":
sheetE.getRange("C7").setValue(endDateE);
break;
case "P7":
sheetE.getRange("C8").setValue(endDateE);
break;
case "P8":
sheetE.getRange("C9").setValue(endDateE);
break;
case "P9":
sheetE.getRange("C10").setValue(endDateE);
break;
case "10":
sheetE.getRange("C11").setValue(endDateE);
break;
case "P11":
sheetE.getRange("C12").setValue(endDateE);
break;
}
return (appE);
}
There are a few errors in your code...mainly you forgot to give names to your widgets and name is used to retrieve values from the callbackelements
below is a "rectified" version that works but there are still 2 items that won't work because you tried to get properties of the sheet in the Ui and that can't be done like this...
please explain what for you need that and I could suggest a better way to go.
(see comments in code and look at the logger to see the values in event parameters)
function periodSelection() {
var activeSS = SpreadsheetApp.getActiveSpreadsheet();
var sheetPS = activeSS.getActiveSheet();
var uiPS = UiApp.createApplication();
var panelPS = uiPS.createVerticalPanel();
var periodPS = uiPS.createListBox().setName('periodPS');
for (var i = 2; i < 13; i++) {
var range = "A" + i;
periodPS.addItem(sheetPS.getRange(range).getValue());
}
var endDatePS = uiPS.createDatePicker().setName('endDatePS');
var recordPS = uiPS.createButton("Enregistrer");
var masterPS = uiPS.createServerHandler('masterFunctionPS');
masterPS.addCallbackElement(panelPS);
recordPS.addClickHandler(masterPS);
panelPS.add(periodPS);
panelPS.add(endDatePS);
panelPS.add(recordPS);
uiPS.add(panelPS);
SpreadsheetApp.getUi().showSidebar(uiPS);
}
function masterFunctionPS(element) {
var parameterPS = element.parameter;
var appE = UiApp.getActiveApplication();
Logger.log('parameter : '+JSON.stringify(parameterPS));
var periodE = parameterPS.periodPS;
var endDateE = parameterPS.endDatePS;
var activeE = parameterPS.activeSS; // won't work
var sheetE = parameterPS.sheetPS; // won't work
switch (periodE) {
case "P1":
sheetE.getRange("C2").setValue(endDateE);
break;
case "P2":
sheetE.getRange("C3").setValue(endDateE);
break;
case "P3":
sheetE.getRange("C4").setValue(endDateE);
break;
case "P4":
sheetE.getRange("C5").setValue(endDateE);
break;
case "P5":
sheetE.getRange("C6").setValue(endDateE);
break;
case "P6":
sheetE.getRange("C7").setValue(endDateE);
break;
case "P7":
sheetE.getRange("C8").setValue(endDateE);
break;
case "P8":
sheetE.getRange("C9").setValue(endDateE);
break;
case "P9":
sheetE.getRange("C10").setValue(endDateE);
break;
case "10":
sheetE.getRange("C11").setValue(endDateE);
break;
case "P11":
sheetE.getRange("C12").setValue(endDateE);
break;
}
return appE;
}
EDIT :
I think I guess what you are trying to do...
Actually the active SS and sheet are always the same, you can just reuse it the same way ...(personally I would keep the same names all along...) see updated handler function below :
function masterFunctionPS(element) {
var parameterPS = element.parameter;
var appE = UiApp.getActiveApplication();
Logger.log('parameter : '+JSON.stringify(parameterPS));
var periodE = parameterPS.periodPS;
var endDateE = parameterPS.endDatePS;
// var activeE = parameterPS.activeSS; // won't work
// var sheetE = parameterPS.sheetPS; // won't work
var activeE = SpreadsheetApp.getActiveSpreadsheet();
var sheetE = activeE.getActiveSheet();
switch (periodE) {
case "P1":
sheetE.getRange("C2").setValue(endDateE);
break;
case "P2":
sheetE.getRange("C3").setValue(endDateE);
break;
case "P3":
sheetE.getRange("C4").setValue(endDateE);
break;
case "P4":
sheetE.getRange("C5").setValue(endDateE);
break;
case "P5":
sheetE.getRange("C6").setValue(endDateE);
break;
case "P6":
sheetE.getRange("C7").setValue(endDateE);
break;
case "P7":
sheetE.getRange("C8").setValue(endDateE);
break;
case "P8":
sheetE.getRange("C9").setValue(endDateE);
break;
case "P9":
sheetE.getRange("C10").setValue(endDateE);
break;
case "10":
sheetE.getRange("C11").setValue(endDateE);
break;
case "P11":
sheetE.getRange("C12").setValue(endDateE);
break;
}
// the following line is only for test... remove it when it works!!!
sheetE.getRange("A1").setValue('failed to write value '+endDateE);
return appE;
}