Fehler in der ActiveScript-Schnittstelle

Fehler- und Bugmeldungen zum Scriptly

Fehler in der ActiveScript-Schnittstelle

Beitragvon gabischatz » 11.12.2011 12:58

Hi Benedikt,
ich wünsche dir erst ein mal einen schönen Advent.
Ich bin gerade über einen Fehler gestolpert.
app.document.selstart gibt die aktuelle Position des Cursor´s wieder, so weit alles ok.
Wird nun der Text markiert, sollte wenn der Cursor rechts steht auch die rechte Cursor Position ausgegeben werden.
Leider wird aber immer nur die Linke Position zurück gegeben und der Cursor springt nach links um die Anzahl der markierten Zeichen.
Code: Alles auswählen
function test(){
   var Cursor = app.document.selstart;      // Cursor zwischenspeichern
   app.showMessage('-->'+Cursor);
      // mach was
   doc.selstart = Cursor;                  // Cursor an die Ausgangsposition stellen   
   app.showMessage('-->'+Cursor);
}

MfG. gabischatz
gabischatz
Sehr engagiertes Mitglied
 
Beiträge: 246
Registriert: 11.07.2010 11:22
Wohnort: Bad Langensalza, Thüringen

Advertisement



Registrieren Sie sich, um diese Anzeige nicht mehr zu sehen!
 

Re: Fehler in der ActiveScript-Schnittstelle

Beitragvon raum40302 » 11.12.2011 18:44

Hallo,

bin nicht Benedikt aber vielleicht kann ich helfen.
gabischatz hat geschrieben:app.document.selstart gibt die aktuelle Position des Cursor´s wieder

Meines Wissens nur wenn nichts Markiert ist. Wenn Text Markiert ist gibt selstart die erste Position der Markierung zurück.
Auszug aus der Hilfe:
selstart integer property
document.selstart
Beginn der Markierung


Gruß Markus
raum40302
Engagiertes Mitglied
 
Beiträge: 190
Registriert: 05.02.2011 23:18
Wohnort: Am Bodensee

Re: Fehler in der ActiveScript-Schnittstelle

Beitragvon gabischatz » 11.12.2011 20:44

Hi Markus,
raum40302 hat geschrieben:Meines Wissens nur wenn nichts Markiert ist. Wenn Text Markiert ist gibt selstart die erste Position der Markierung zurück.Auszug aus der Hilfe:selstart integer propertydocument.selstart Beginn der Markierung

Das ist korrekt, aber ich brauche trotz Markierung die korrekte Cursorposition und die lässt sich so nicht bestimmen.
MfG gabischatz
gabischatz
Sehr engagiertes Mitglied
 
Beiträge: 246
Registriert: 11.07.2010 11:22
Wohnort: Bad Langensalza, Thüringen

Re: Fehler in der ActiveScript-Schnittstelle

Beitragvon raum40302 » 11.12.2011 23:15

Hallo gabischatz,
gabischatz hat geschrieben:aber ich brauche trotz Markierung die korrekte Cursorposition


Das währe ja dann entweder vor oder nach der Markierung, jenachdem von wo nach wo man Markiert. Wo der Cursor nun steht, lässt sich mit der ActiveScript- Schnittstelle im Moment nicht ermitteln (meiner Meinung nach) leider. Wobei ich jetzt auf die Schnelle in Delphi7 auch keine Funktion gefunden habe die die Cursorposition bei Markiertem Text zurück gibt (möglich das ichs nicht gefunden habe ist natürlich gegeben :? ).
Die "hintere" Cursorposition währe dann SelStart+SelLength "vordere" ist mit SelStart ja klar. Aber das wusstest du ja schon und bringt dich vermutlich auch nicht weiter.

Tut mir leid das ich dir nicht weiterhelfen konnte. :(

Gruß Markus
raum40302
Engagiertes Mitglied
 
Beiträge: 190
Registriert: 05.02.2011 23:18
Wohnort: Am Bodensee

Re: Fehler in der ActiveScript-Schnittstelle

Beitragvon gabischatz » 12.12.2011 00:29

Hi Markus,
raum40302 hat geschrieben:Die "hintere" Cursorposition währe dann SelStart+SelLength "vordere" ist mit SelStart ja klar. Aber das wusstest du ja schon und bringt dich vermutlich auch nicht weiter.

Weiß ich, bringt mich aber nicht weiter, da ich nicht weiß wie der Benutzer markiert hat. Von rechts nach links gelinkt`s immer. :lol:
Habe noch einen Bug gerade gefunden.
Code: Alles auswählen
var Cursor = doc.selstart;   // Cursor zwischenspeichern
doc.seltext = 'Test';   // Text am Cursor eingeben
doc.selstart = Cursor;   // Cursor vorsichtshalber positionieren
doc.sellength = 4;        // Länge der Markierung festlegen
afunktion();  // Funktion afunktion() aufrufen die den Markierten Text weiterbearbeitet.

Ist ein blödes Beispiel, trifft aber den Nagel auf den Kopf, den der Text wird nicht wie erwartet markiert. :oops:
Nachtrag:
Und noch ein Fehler nach Aufruf des Suchen Dialog wird der Code nur weiterverarbeitet wenn etwas gefunden wurde :oops: .
Code: Alles auswählen
    var OptRegEx = search.optRegEx          // Einstellung zwischen speichern
       if(search.optRegEx != true){search.optRegEx = true;}
      // suchen mit Regulären Ausdrücken einschalten falls noch nicht schon eingestellt.
    var go = search.search("<\\w[^<>]*>",0,"")  // Suchen Dialog öffnen
       if(OptRegEx != true){search.optRegEx = false;}
      // suchen mit Regulären Ausdrücken wieder ausschalten falls vorher einschalten.
   if(go!=true){
      var btn =  app.inputDlg(lng_dlg_caption,lng_msg_no_L, "");
   }


MfG.gabischatz
gabischatz
Sehr engagiertes Mitglied
 
Beiträge: 246
Registriert: 11.07.2010 11:22
Wohnort: Bad Langensalza, Thüringen

Re: Fehler in der ActiveScript-Schnittstelle

Beitragvon Benedikt Loepp » 12.12.2011 21:06

Hi,
erstmal möchte ich auch hier bitten, nicht irgendwelche Sachen als etwas anderes auszugeben, als er der Fall ist. Die Funktion selstart gibt laut Dokumentation die Position zurück, an der die Markierung beginnt, und nicht die des Cursors! Also ist es kein Bug, wenn nicht die Position des Cursors zurückgegeben wird!

gabischatz hat geschrieben:Weiß ich, bringt mich aber nicht weiter, da ich nicht weiß wie der Benutzer markiert hat. Von rechts nach links gelinkt`s immer. :lol:
Habe noch einen Bug gerade gefunden.
Code: Alles auswählen
var Cursor = doc.selstart;   // Cursor zwischenspeichern
doc.seltext = 'Test';   // Text am Cursor eingeben
doc.selstart = Cursor;   // Cursor vorsichtshalber positionieren
doc.sellength = 4;        // Länge der Markierung festlegen
afunktion();  // Funktion afunktion() aufrufen die den Markierten Text weiterbearbeitet.

Ist ein blödes Beispiel, trifft aber den Nagel auf den Kopf, den der Text wird nicht wie erwartet markiert. :oops:
Gerade ausprobiert, bei mir wird ganz hervorragend das Wort "Test" eingefügt, welches danach markiert erscheint. Was machst du in "afunktion();"?

gabischatz hat geschrieben:Und noch ein Fehler nach Aufruf des Suchen Dialog wird der Code nur weiterverarbeitet wenn etwas gefunden wurde :oops: .
Code: Alles auswählen
    var OptRegEx = search.optRegEx          // Einstellung zwischen speichern
       if(search.optRegEx != true){search.optRegEx = true;}
      // suchen mit Regulären Ausdrücken einschalten falls noch nicht schon eingestellt.
    var go = search.search("<\\w[^<>]*>",0,"")  // Suchen Dialog öffnen
       if(OptRegEx != true){search.optRegEx = false;}
      // suchen mit Regulären Ausdrücken wieder ausschalten falls vorher einschalten.
   if(go!=true){
      var btn =  app.inputDlg(lng_dlg_caption,lng_msg_no_L, "");
   }


Verstehe ich auch nicht? Die Funktion search liefert in der aktuellen Version immer "true" zurück, sprich dein Code dürfte in dem If-Zweig dürfte nie abgearbeitet werden. Oder versteh ich was falsch?
Ab der kommenden Version wird es so sein, dass search "true" liefert, wenn etwas gefunden wurde, und ansonsten "false".

Schönen Gruß, Benedikt Loepp
Benedikt Loepp
Administrator
 
Beiträge: 2729
Registriert: 17.06.2005 18:30
Wohnort: Lünen

Re: Fehler in der ActiveScript-Schnittstelle

Beitragvon gabischatz » 12.12.2011 21:50

Hi Benedikt, ich möchte auf keinem Fall irgend etwas schlecht machen.
Sicherlich rühren meine Vermutungen von einer ... guten Beschreibung.
Ich nehme es auch sofort zurück.
Zurück zum Thema, ich überarbeite gerade mein Script Spezial-Lesezeichen.
Hier der Aktuelle Code:
Code: Alles auswählen
/////////////////////////////////////////
//                                     //
//  //::<Lesezeichen>                  //
//                                     //
//  (cc) gabischatz 2011/12            //
//  http://bad-Langensalza.npage.de    //
//                                     //
/////////////////////////////////////////

var app = application;
//Handle auf die Applications-Klasse holen
var doc = app.document;
//Handle auf die Funktionen fürs aktuelle Dokument holen
var allText = doc.text;
//Inhalt des Dokumentes zwischenspeichern
var selText = doc.seltext;
//Inhalt der Markierung zwischenspeichern
var cursor = doc.selstart;
//Cursor zwischenspeichern
/*------------------------------------------------------------------*/
if(doc) {              //::<Language>
   if(app.editorLanguage == "de") {
       //Sprache abfragen, deutsche Meldungen
       var lng_msg_Abb = "Abbruch durch Benutzer";
       var lng_msg_Abb_Zahl = "Abbruch durch Benutzer\noder es wurde keine korrekte Nummer eingegeben!";
      var lng_dlg_caption = "Es wurde kein Lesezeichen gefunden.";
      var lng_msg_no_L = "Möchten Sie ein Lesezeichen anlegen?"
      var lng_msg_Clear = "Möchten Sie das Lesezeichen Löschen? \n\nJa für: "
      var lng_msg_Del = "\nNein für: "
   } else {
       //Englische Meldungen
      var lng_msg_Abb = "Cancelled by the user";
      var lng_msg_Abb_Zahl = "Cancelled by the user\nor no correct number entered!";
      var lng_dlg_caption = "No bookmark found.";
      var lng_msg_no_L = "Do you want to create a bookmark?"
      var lng_msg_Clear = "Do you want to delete the bookmark? \n\nYes for: "
      var lng_msg_Del = "\nNo for: "
   }
/*------------------------------------------------------------------*/
   if (doc.sellength != 0) {                // Text wurde markiert
      // Funktion zeile()[0] mit Parameter(0), gibt die aktuelle Zeile am Cursor wieder.
       if (pruefe(zeile()[0])!= -1) {          // Funktion pruefe() prüft die Zeile am Corsor, lieferte 1 zurück, gefunden.
            loeschen(zeile()[0]);            // Funktion loeschen() löscht aus der Zeile das Lesezeichen
        } else {                                // Funktion pruefe() lieferte -1 zurück, nicht gefunden
            createL();
      }
   } else {                                    // Text wurde nicht markiert
       if (pruefe(zeile()[0])!= -1) {          // Funktion pruefe() prüft die Zeile am Corsor, lieferte 1 zurück, gefunden
             loeschen(zeile()[0]);              // Funktion loeschen() löscht aus der Zeile das Lesezeichen
      } else {                                // Lieferte -1 zurück, nicht gefunden
         geheZu();                         // Funktion geheZu(), listet alle Lesezeichen auf.
      }
       doc.selstart = cursor;                  // Cursor an die Ausgangsposition stellen
    }
}
/*----------------------------------------------------------------------------*/
function geheZu() {         //::<geheZu()>
   var Cursor = doc.selstart;            // Cursor zwischenspeichern
   var SelText = doc.seltext;            // Inhalt der Markierung zwischenspeichern
   var SelLength = doc.sellength;         // Länge der Markierung auslesen
    var OptRegEx = search.optRegEx          // Einstellung zwischen speichern
       if(search.optRegEx != true){search.optRegEx = true;}
      // suchen mit Regulären Ausdrücken einschalten falls noch nicht schon eingestellt.
    var go = search.search("//::<\\w[^<>]*>",0,"")  // Suchen Dialog öffnen
       if(OptRegEx != true){search.optRegEx = false;}
      // suchen mit Regulären Ausdrücken wieder ausschalten falls vorher einschalten.
   if(go!=true){
      var btn =  app.inputDlg(lng_dlg_caption,lng_msg_no_L, "");
       //Anzeige Meldungsfenster (Fehler kein Lesezeichen gefunden)
        /*--------------------------------------------------------------------*/
       if (btn != "") {
            //Abfrage Button, weiter machen
            doc.seltext = btn;
          //search.optFromCursor  = true;
          //search.search(btn,0,"")
            doc.selstart = Cursor;         // Cursor positionieren
            //sleep(1000);
         doc.sellength = btn.length;        // Länge der Markierung festlegen
         createL();
          //search.optFromCursor  = false;
          }
   }
    if(SelText!=""){                        // Markierten Text wieder markieren
         doc.selstart = Cursor;            // Cursor positionieren
       doc.sellength = SelLength;           // Länge der Markierung festlegen
   }else{
         doc.selstart = Cursor;         // Cursor positionieren
   }
}   //app.showMessage(a);
/*------------------------------------------------------------------*/
function loeschen(iIn) {
   var Cursor = doc.selstart;            // Cursor zwischenspeichern app.document.selstart
   var anfangZeile = zeile()[1];           // Zeilenanfang zwischenspeichern
   var endeZeile = zeile()[2];             // Zeilenanfang zwischenspeichern
   var reg = new RegExp(/(?:<\?php.*|<\?.*|<!.*|\/\*.*|\s|^|^\s*)(\/\/::<(\/?\w[^<>]*)>)(?:\/?\s?.*?\?>|\s?.*?->|.*$)/im);
   var m = reg.exec(iIn);                  // Regulären Ausdruck anwenden, gibt einen Array mit dem Treffer zurück
   var len1 = iIn.indexOf(m[0]);         // Ermittelt das erste Vorkommen eines Zeichens
   var leng1 = "";                         // Ersetzung (Variable) definieren
   var i = 0;                              // Lauf-Variable definieren
   while (i!=m[0].length){                 // solange wiederholen, bis erfüllt ist.
      leng1 += " ";                       // +=, Fügt an einen String an die Variable an.(Leerzeichen)
        i++;                                // i++, erhöht die Lauf-Variable nach Aufruf, Ausgabe = 0,1
     }
   var iOut1 = iIn.replace(m[0],leng1);    // Regulären Ausdruck anwenden und ersetzen
   // ersetzt '//::<Text1> Tex2' durch 'Leerzeichen'
  /*   reg.compile(/(?:<\?php.*|<\?.*|<!.*|\/\*.*|\s|^|^\s*)(\/\/::<(\/?\w[^<>]*)>)(?:\/?\s?.*?\?>|\s?.*?->|.*$)/i);
     //  'variable.compile()' ersetzt 'new RegExp()' für eine schnellere Ausführung bei ähnlichen RegEx.              */
   var len2 = iIn.indexOf(m[1]);         // Ermittelt das erste Vorkommen eines Zeichens
   var leng2 = "";                         // Ersetzung (Variable) definieren
   var j = 0;                              // Lauf-Variable definieren
   while (j!=m[1].length){                 // solange wiederholen, bis erfüllt ist.
      leng2 += " ";                       // +=, Fügt an einen String an die Variable an.(Leerzeichen)
        j++;                                // ++j, erhöht die Lauf-Variable direkt vor dem Aufruf, Ausgabe = 1,1
   }
   var iOut2 = iIn.replace(m[1],leng2);    // Regulären Ausdruck anwenden und ersetzen  leng2
   // ersetzt '//::<Text>' durch 'Leerzeichen'
   if(iOut1 != iOut2){                     // Prüfen ob die Ausgabe nicht gleich ist
      var iOut3 = lng_msg_Clear + m[0] + lng_msg_Del + m[1];
      // Abffage Text zusammenstellen
      var Zahl = app.messageDlg(3, iOut3);// Abfrage=3 [Ja=6, Nein=7, Abbrechen=2]
   }else{                                  // Ausgabe ist gleich
      var Zahl = 6;                      // Kein Dialog, Ja simulieren
   }
      if(Zahl!=2){if(Zahl==6){iOut=iOut1}else{iOut=iOut2}}else{iOut=-1;}
          // Abfrage auswerten, Abbrechen=2, Ja=6, Nein=7
        if (iOut != -1) {                  // bearbeiten
         doc.selstart = anfangZeile;     // Cursor am Anfang der Zeile positionieren
         doc.sellength = endeZeile-anfangZeile;// Text Markieren mit der Anzahl der zu makierenden Zeichen
         doc.seltext = iOut;             // Text überschreiben / zurückschreiben
      } else {
         return -1;                      // Liefert -1 zurück, nicht nicht bearbeitet
      }
         doc.selstart = Cursor;          // Cursor an die Ausgangsposition stellen
}
/*------------------------------------------------------------------*/
function pruefe(x) {        //::<pruefe(x)> // x = Text der getestet werden soll
   if (/\/\/::<(\s*?.*\s*?)>/.test(x)){   // Regulären Ausdruck probehalber anwenden
      return 1;                          // Successful match
   } else {                                // Match attempt failed
      return -1;                          // Liefert -1 zurück, nicht gefunden
   }
}
/*------------------------------------------------------------------*/
function createL() {           //::<createL()>
    var SelText = doc.seltext
   var Cursor = doc.selstart;               // Cursor zwischenspeichern
    var len = SelText.length;                 // Länge des markierten Text`s ermitteln
    if (/\d:\w.*/i.test(SelText)) {             // Successful match Sondermarkierung erwünscht
      if (/1:\w.*/i.test(SelText)) {           // Successful match
          var match1 = SelText.match(/1:(\w.*)/);
         doc.seltext = SelText.replace(selText,"<?//::<"+match1[1]+">?>"); // ersetzen
      }else if (/2:\w.*/i.test(SelText)) {    // Successful match
         var match2 = SelText.match(/2:(\w.*)/);
         doc.seltext = SelText.replace(selText,"/*//::<"+match2[1]+">*/"); // ersetzen
      }else{
         var match3 = SelText.match(/3:(\w.*)/);
         doc.seltext = SelText.replace(selText,"<!-- //::<"+match3[1]+"> -->");// ersetzen
      }
   }else{                                    // Match attempt failed, keine Sondermarkierung erwünscht
      doc.seltext = SelText.replace(SelText,"//::<"+selText+">");
   }
   doc.selstart = Cursor;                      // Cursor neu positionieren
}
/*------------------------------------------------------------------*/
function sleep(milliseconds) {    //::<sleep()>
// Delay for a given number of milliseconds
// note: Consider using setTimeout() instead.
// example 1: sleep(1000); = 1s
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }//Enf If
  }//End for -Schleife
    //while (new Date() < start + milliseconds) {}
    //statt ser for -Schleife
    return 0;
} //End function sleep()
/*------------------------------------------------------------------*/
function zeile(){          //::<zeile()>
   var Cursor = doc.selstart;            // Cursor zwischenspeichern app.document.selstart
   var SelText = doc.seltext;            // Inhalt der Markierung zwischenspeichern
   var SelLength = doc.sellength;         // Länge der Markierung auslesen
      var aText = doc.text.slice(0, Cursor);  // Extrahiert den Dokumentenanfang bis zum Cursor
   var lines = new Array();            // Array definieren
      lines = aText.split("\n");         // Zeilen bis Cursor, ins Array einfügen   // Zerlegt Zeichenkette in mehrere Teilzeichenketten
    var onLinie = lines.length;             // Anzahl der Zeilen vom Anfang bis zum Cursor
      lines = doc.text.split("\n");      // Zeilen bis Cursor, ins Array einfügen   // Zerlegt Zeichenkette in mehrere Teilzeichenketten
   var allLinie = lines.length;         // Anzahl der Zeilen im Dokument
   var offLinie = allLinie-onLinie;        // Anzahl der Zeilen nach dem Cursor bis zum Ende
   document.gotoLine(onLinie)            // Bewegt den Cursor zu einer bestimmten Zeile (Cursor Zeile)
    var anfangZeile = doc.selstart;         // Holt die Cursorposition (Startposition Cursor Zeile)
   document.gotoLine(onLinie+1)         // Bewegt den Cursor zu einer bestimmten Zeile
   var endeZeile = doc.selstart-1;         // Holt die Cursorposition (Endposition Cursor Zeile)
    doc.selstart = anfangZeile;            // Cursor positionieren
    doc.sellength = endeZeile-anfangZeile;   // Länge der Markierung festlegen
   var returnArray = new Array();         // Array definieren
   returnArray[0] = doc.seltext;         // Aktuelle Zeile in Array speichern
   returnArray[1] = anfangZeile;         // Cursorposition Zeilenanfang
   returnArray[2] = endeZeile;            // Cursorposition Zeilenende
   returnArray[3] = allLinie;            // Anzahl der Zeilen im Dokument in Array speichern
   returnArray[4] = onLinie;            // Anzahl der Zeilen bis zum Cursor in Array speichern
   returnArray[5] = offLinie;            // Anzahl der Zeilen nach dem Cursor in Array speichern
    doc.selstart = Cursor;                  // Cursor an die Ausgangsposition stellen
    if(SelText!=""){                        // Markierten Text wieder markieren
      doc.selstart = Cursor;            // Cursor positionieren
    doc.sellength = SelLength;             // Länge der Markierung festlegen
   }
return returnArray;                          // Array zurück geben
}
In Zeile 64 wird der Suchen Dialog aufgerufen und in Zeile 67 wird geprüft ob etwas gefunden wurde.
Wenn nichts gefunden wurde soll in Zeile 68 eine Input-Box den Wert des neuen Lesezeichen zwischengespeichert werden.
In Zeile 78 sollte dann der Text aus der Input-Box eingeschrieben und Markiert sein.
Die Funktion createL(); aus Zeile 144, erstellt nun das neue Lesezeichen.
Zum erstellen der Lesezeichen gibt es fünf Möglichkeiten.
1. Text nicht/-markieren Script ausführen
2. keine Zahl und kein : Lesezeichen 1 ergibt //::<Lesezeichen 1>
3. 1:Lesezeichen 2 ergibt ein php Lesezeichen <?//::<Lesezeichen 2>?>
4.2:Lesezeichen 3 ergibt ein css Lesezeichen /*//::<Lesezeichen 3>*/
5.3:Lesezeichen 4 ergibt ein html Lesezeichen <!-- //::<Lesezeichen 4> -->
MfG gabischatz
gabischatz
Sehr engagiertes Mitglied
 
Beiträge: 246
Registriert: 11.07.2010 11:22
Wohnort: Bad Langensalza, Thüringen

Re: Fehler in der ActiveScript-Schnittstelle

Beitragvon Benedikt Loepp » 12.12.2011 22:00

Kein Ding ;) Wenn etwas wirklich falsch ist, sollst du mir und der Community dass ja auch mitteilen -- nur so kann ich den Scriptly weiter verbessern!
Ich wollte nur klarstellen, dass es sich bei der Funktion von selstart nicht um einen Bug handelt -- sollte nicht falsch rüberkommen :D

Dass bei der search-Funktion immer "true" zurückgegeben wird, ist ja auch tatsächlich ein Bug und ich Bedanke mich für dein Feedback diesbezüglich :)
Auch wenn es jetzt mit der neuen Version schon sehr lange dauert, all die Sachen die hier (auch von dir) gepostet werden bearbeite ich auch, und dafür bin ich auch sehr dankbar! Schließlich entwickele ich den Scriptly für euch Nutzer, ansonsten hät ich nämlich auch schon längst das berühmte Handtuch schmeißen können ;)

Schönen Abend noch,
Benedikt Loepp
Benedikt Loepp
Administrator
 
Beiträge: 2729
Registriert: 17.06.2005 18:30
Wohnort: Lünen


Zurück zu Bug-Report



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste