RichEdit1 solang Strings löschen, bis Schlüsselwort gefunden



  • Hallo Leute,

    also ich habe ein Programm, was einen Datensatz bearbeitet, d.h ab Zeile 15 löscht er jede 2te Zeile, bis in irgendeiner Zeile mal "M113" steht!

    Leider endet es in einer endlosschleife....

    Fehler wird wohl sein, das ich nicht richtig suche , bzw was anderes beim suchen und dann schleifenabbruch

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int StartPos=0;
    int EndPos=RichEdit1->Text.Length()-StartPos;
    FoundAt1 = RichEdit1->FindTextA("M113",StartPos,EndPos,TSearchTypes()<<stMatchCase);  //erstmal prüfen, ob schlüssel überhaupt vorhanden
    
    if(FoundAt1 != -1)  //wenn vorhanden, dann gehtz los mit löschen der zeilen ab zeile 16
    {
    int i=16;
    while(RichEdit1->Lines->Count>0)
     {
     int StartPos=0;
     int EndPos=RichEdit1->Lines->Strings[i].Length()-StartPos;
     int FoundAt = RichEdit1->FindTextA("M113",StartPos,EndPos,TSearchTypes()<<stMatchCase);
     if(FoundAt == FoundAt1)  //dachte mir, wenn er bei jeder zeile sucht, und dann findet, und position stimmt, hört er auf, position kann ja aber nicht stimmen, da zeilen gelöscht werden...
       break;
     RichEdit1->Lines->Delete(i);
     i++;
     }
    
    Button1->Enabled=false;
    enable=false;  
    
    }
    else
     ShowMessage("Datentyp nicht passend, Schlüssel M113 nicht gefunden");
    }
    

    wie könnte ich das am besten machen?



  • schon mal mit dem debugger schritt fuer schritt dein programm durchgegangen und die belegung der einzelnen variablen angeschaut, speziell wenn die abbruchbedingung greifen soll?



  • habs jetzt so geaändert, jetzt löscht er, und bricht auch ab, leider hört er kurz vor ende auf, noch zeilen zu löschen:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int StartPos=0;
    int EndPos=RichEdit1->Text.Length()-StartPos;
    FoundAt1 = RichEdit1->FindTextA("M113",StartPos,EndPos,TSearchTypes()<<stMatchCase);
    if(FoundAt1 != -1)
    {
    int i=16;
    int StartPos1=0;
    while(RichEdit1->Lines->Count>0)
     {
     i++;
     int EndPos=0;
     StartPos1=StartPos1+RichEdit1->Lines->Strings[i-1].Length()+1;
     EndPos=StartPos1+RichEdit1->Lines->Strings[i].Length();
     int FoundAt = RichEdit1->FindTextA("M113",StartPos1,EndPos,TSearchTypes()<<stMatchCase);
    
     //ShowMessage(FoundAt);  //debuggerzwecke
     if(FoundAt != -1)
       {
       //RichEdit1->Lines->Delete(i);   //TIPP 1, erklärung, siehe ganz unten
       break;
       }
     RichEdit1->Lines->Delete(i);
    
     }
    
    Button1->Enabled=false;
    enable=false;  
    
    }
    else
     MessageBoxA(0,"Dateityp kann nicht verwendet werden, Schlüssel M113 nicht gefunden","Inkompatibler Dateityp",MB_OK|MB_ICONWARNING);
    }
    

    ACHTUNG, so sieht rohdatei aus:

    0 BEGIN PGM TEST MM
    1 ; DATEI : TEST.h
    2 ; UNDEFINIERT D=0.00
    3 ; WANDSTAERKE=0.00 AUFMASS=0.00 ZUSTELLUNG=0.00 PENDELN SPITZE
    4 TOOL CALL 0 Z S0
    5 CYCL DEF 7.0 NULLPUNKT
    6 CYCL DEF 7.1 X+0,000
    7 CYCL DEF 7.2 Y+0,000
    8 CYCL DEF 7.3 Z+0,000
    9 CYCL DEF 8.0 SPIEGELN
    10 CYCL DEF 8.1
    11 CYCL DEF 10.0 DREHUNG
    12 CYCL DEF 10.1 ROT +0,000
    13 CYCL DEF 11.0 MASSFAKTOR
    14 CYCL DEF 11.1 SCL 1,000
    15 M112 T0.05 A15      //ab hier jede 2te zeile löschen
    16 L X+240.000 Y+100.000 Z+0.000 F0 M03
    17 L X+240.000 Y+100.000 Z+40.000   //weg
    18 L X+254.000 Y+100.000 Z+0.000
    19 L X+254.000 Y+100.000 Z+40.000  //weg etc...
    20 L X+268.000 Y+100.000 Z+0.000
    21 L X+268.000 Y+100.000 Z+40.000
    22 L X+282.000 Y+100.000 Z+0.000
    23 L X+282.000 Y+100.000 Z+40.000
    24 L X+296.000 Y+100.000 Z+0.000
    25 L X+296.000 Y+100.000 Z+40.000
    26 L X+310.000 Y+100.000 Z+0.000
    27 L X+310.000 Y+100.000 Z+40.000
    28 L X+324.000 Y+100.000 Z+0.000
    29 L X+324.000 Y+100.000 Z+40.000
    30 L X+338.000 Y+100.000 Z+0.000
    31 L X+338.000 Y+100.000 Z+40.000
    32 L X+352.000 Y+100.000 Z+0.000
    33 L X+352.000 Y+100.000 Z+40.000
    34 L X+366.000 Y+100.000 Z+0.000
    35 L X+366.000 Y+100.000 Z+40.000
    36 L X+380.000 Y+100.000 Z+0.000
    37 L X+380.000 Y+100.000 Z+40.000
    38 L X+394.000 Y+100.000 Z+0.000
    39 L X+394.000 Y+100.000 Z+40.000
    40 L X+408.000 Y+100.000 Z+0.000
    41 L X+408.000 Y+100.000 Z+40.000
    42 L X+422.000 Y+100.000 Z+0.000
    43 L X+422.000 Y+100.000 Z+40.000
    44 L X+436.000 Y+100.000 Z+0.000
    45 L X+436.000 Y+100.000 Z+40.000
    46 L X+450.000 Y+100.000 Z+0.000
    47 L X+450.000 Y+100.000 Z+40.000
    48 L X+240.000 Y+100.000 Z+0.000 F0 M03
    49 L X+240.000 Y+100.000 Z+40.000
    50 L X+254.000 Y+100.000 Z+0.000
    51 L X+254.000 Y+100.000 Z+40.000
    52 L X+268.000 Y+100.000 Z+0.000
    53 L X+268.000 Y+100.000 Z+40.000
    54 L X+282.000 Y+100.000 Z+0.000
    55 L X+282.000 Y+100.000 Z+40.000
    56 L X+296.000 Y+100.000 Z+0.000
    57 L X+296.000 Y+100.000 Z+40.000
    58 L X+310.000 Y+100.000 Z+0.000
    59 L X+310.000 Y+100.000 Z+40.000
    60 L X+324.000 Y+100.000 Z+0.000
    61 L X+324.000 Y+100.000 Z+40.000  //weg
    62 L X+338.000 Y+100.000 Z+0.000   //die bleibt als letzt stehen
    48 M113   //hier aufhören
    49 M30
    50 END PGM TEST MM
    

    leider sieht mein ergebniss so aus...

    0 BEGIN PGM TEST MM
    1 ; DATEI : TEST.h
    2 ; UNDEFINIERT D=0.00
    3 ; WANDSTAERKE=0.00 AUFMASS=0.00 ZUSTELLUNG=0.00 PENDELN SPITZE
    4 TOOL CALL 0 Z S0
    5 CYCL DEF 7.0 NULLPUNKT
    6 CYCL DEF 7.1 X+0,000
    7 CYCL DEF 7.2 Y+0,000
    8 CYCL DEF 7.3 Z+0,000
    9 CYCL DEF 8.0 SPIEGELN
    10 CYCL DEF 8.1
    11 CYCL DEF 10.0 DREHUNG
    12 CYCL DEF 10.1 ROT +0,000
    13 CYCL DEF 11.0 MASSFAKTOR
    14 CYCL DEF 11.1 SCL 1,000
    15 M112 T0.05 A15     //wunderbar, ab hier fängt er an
    16 L X+240.000 Y+100.000 Z+0.000 F0 M03
    18 L X+254.000 Y+100.000 Z+0.000   //super
    20 L X+268.000 Y+100.000 Z+0.000
    22 L X+282.000 Y+100.000 Z+0.000
    24 L X+296.000 Y+100.000 Z+0.000
    26 L X+310.000 Y+100.000 Z+0.000
    28 L X+324.000 Y+100.000 Z+0.000
    30 L X+338.000 Y+100.000 Z+0.000
    32 L X+352.000 Y+100.000 Z+0.000
    34 L X+366.000 Y+100.000 Z+0.000
    36 L X+380.000 Y+100.000 Z+0.000
    38 L X+394.000 Y+100.000 Z+0.000
    40 L X+408.000 Y+100.000 Z+0.000
    42 L X+422.000 Y+100.000 Z+0.000
    44 L X+436.000 Y+100.000 Z+0.000
    46 L X+450.000 Y+100.000 Z+0.000
    48 L X+240.000 Y+100.000 Z+0.000 F0 M03
    50 L X+254.000 Y+100.000 Z+0.000
    52 L X+268.000 Y+100.000 Z+0.000
    54 L X+282.000 Y+100.000 Z+0.000
    56 L X+296.000 Y+100.000 Z+0.000
    57 L X+296.000 Y+100.000 Z+40.000    //bis hier her, denn die dürfte ni stehen
    58 L X+310.000 Y+100.000 Z+0.000
    59 L X+310.000 Y+100.000 Z+40.000   //die au ni
    60 L X+324.000 Y+100.000 Z+0.000
    61 L X+324.000 Y+100.000 Z+40.000   //die au ni
    62 L X+338.000 Y+100.000 Z+0.000
    48 M113          //abbrechen tut er wieder richtig
    49 M30
    50 END PGM TEST MM
    

    und zu dem Tipp 1 im Quellcode, wenn ich diese Zeile reinnehme dann nimmt er die 57 auch noch raus, logisch!
    woran könnte das liegen??
    arghl



  • hast du das gemacht, was ich geschrieben habe? ja? was ist dabei rausgekommen?
    schon mal was von Pos() gehört?



  • naja, abbrechen tut er ja, aber mit dem Pos() hab ich noch nich gearbeitet!
    Wie funktioniert das?



  • lol

    if(RichEdit1->Lines->Strings[i].Pos("M113")>0)
       {
       break;
       }
    RichEdit1->Lines->Delete(i);
    }
    

    glaube so gehtz...


Anmelden zum Antworten