Einzelnen Beitrag anzeigen

Overphil

Registriert seit: 19. Okt 2015
4 Beiträge
 
#1

String nach bestimmten muster auflösen

  Alt 19. Okt 2015, 12:07
Hallo zusammen, ich habe folgendes Problem.
Ich will ein Programm schreiben, mit dem ich mittels eigenen Textbefehlen aus einem editfeld in einer Imagekomponente zeichnen kann. Also z.B. V90R45V90 soll 90px "nach vorne" zeichnen, dann wird um 45 grad nach rechts gedreht und wieder 90px in die neue richtung gezeichnet.
Außerdem gibt es noch wiederholungsbefehle, die zb so aussehen könnten: W4(v90r45). In dem fall soll das in der klammer 4 mal wiederholt werden. Mein problem ist jetzt das umschreiben dieser wiederholungsstrings. Mein ansatz war, den inhalt der klammern in einen neuen string zu speichern und diesen dann eben entsprechend oft zu wiederholen. Durch eine while schleife ermittle ich, wo sich die erste und zweite klammer des jeweiligen W befindet und speichere dann den Inhalt in einem neuen string. Meine frage also jetzt, wie mache ich es, dass der string so lange aufgelöst wird, bis er keine wiederholungsbefehle mehr enthält, denn so ein string könnte ja auch so aussehen W2(w2(v90)), wenn man das auflöst, hätte man ja w2(v90)w2(v90), was wiederrum aufgelöst werden muss.
Hier meine kleine Funktion, die den string auflösen soll:

Meine Variablen
repInt: gibt die Anzahl der wiederholungen an, die nach einem W steht
wCount: Variable zum finden der zugehörigen klammer
bracketPlace1/2: Position der ersten bzw. zweiten Klammer
repStr: Der string, der wiederholt werden soll(dieser soll eigentlich dann voll aufgelöst und der rückgabestring sein)
oldRepStr: der wiederholungsstring vom letzten schleifendurchlauf
strToCopy: beinhaltet den befehl in einer klammer


Code:
function TForm1.interpretateString(str:string) : string;
var repInt, wCount, bracketPlace1, bracketPlace2, i, j: integer;
  repStr, oldRepStr, strToCopy: string;
begin
     wCount:=0;
     bracketPlace2:=0;
     oldRepStr:='';
     repStr:='';
     for i:=1 to Length(str) do begin
         if str[i]='W' then begin



              repInt:=getCount(str, i);

              bracketPlace1:=i+Length(IntToStr(repInt))+2;
              j:=bracketPlace1;
              while wCount<>-1 do begin
                    if str[j]=')' then begin
                       wCount:=wCount-1;
                       if wCount=-1 then begin
                          //Delete(str, j, 1);
                          bracketPlace2:=j+1;
                          break;
                       end;
                    end
                    else if str[j]='(' then begin
                         wCount:=wCount+1;
                    end;

                   j:=j+1;
              end;

              strToCopy:=Copy(str, bracketPlace1, bracketPlace2-bracketPlace1-1);


              repStr:=repStr+repeatString(strToCopy, repInt);


              ShowMessage('repStr: '+repstr);
              oldRepStr:=repStr;

              ShowMessage('ors... '+ oldRepStr);

              result:=repStr+oldRepStr;

         end;
     end;

end;
PS: Ich weiß, dass manches da nach der while schleife nicht viel sinn gibt, aber das ist eben meine frage, wie ich nach der schleife weiter mache, sodass alles aufgelöst in einem string gespeichert wird.

Danke im vorraus
  Mit Zitat antworten Zitat