Zeile aus memo suchen



  • Ich hab ein problem, ich will aus einer Memo-Box mit mehrern Zeilen text nur die Zeilen mit z.B. "A" am anfang suchen und in dieser Zeile wieder ein paar zeichen vor einer bestimmten Zeichenkette Speichern, mit find() bin ich nicht besonders weit gekommen. Ich weis nicht ob das möglich ist, aber freue mich auf Antwort.



  • Dann schau dir mal die Eigenschaften von TMemo, TStrings und AnsiString in der BCB-Hilfe an. Da solltest du einiges finden.



  • danke, werde mal schauen 🙂 👍

    Edit: Sorry, aber ich weis nicht nach was ich da suchen soll bei TMemo sind Tausende von eigenschaften, aber nix wie find oder search 😞



  • Ok, dann ein Hinweis: etwas wie find oder search gibt es nicht. Du kannst aber die Zeilen der Reihe nach durchgehen und dir die Anfangsbuchstaben anschauen.



  • __property Classes::TStrings* Lines = {read=FLines, write=SetLines};
    

    Das? weis aber nicht wie ich das anwende 😞



  • VIelleicht liest du mal hier etwas näher nach (o:

    -junix



  • ok, hab das nun glaubich kapiert :p

    if(Memo1->Lines->CompareStrings(Memo1->Lines->GetText(),"H") == 0) {
            Form1->Caption = "geht!";
    }
    

    geht aber nicht 😞

    [C++ Fehler] Unit1.cpp(20): E2247 Zugriff auf '_fastcall TStrings::CompareStrings(const AnsiString,const AnsiString)' nicht möglich

    Muss ich dazu noch irgendwas includen oder so?



  • versuchs mal so:

    [code]
    ansiString line;
    for(int i = 0; i < Memo1->Lines->Count; i++)
    {
    line = Memo1->Lines->Strings[i];
    if(line[1] == 'A')
    ShowMessage("Zeile " + IntToStr(i) + " beginnt mit einem A");
    }[cpp]
    ich glaube, das du nach soetwas suchst.



  • irgendwie hab ich mich mit den code tags vertan...
    also nochmal:

    ansiString line; 
    for(int i = 0; i < Memo1->Lines->Count; i++) 
    { 
    line = Memo1->Lines->Strings[i]; 
    if(line[1] == 'A') 
    ShowMessage("Zeile " + IntToStr(i) + " beginnt mit einem A"); 
    }
    


  • danke, das geht 🙂 nur musst ich anstatt ansistring string nehmen, da er das nich gekannt hat, aber geht. Nun zu meinem 2. Problem 😞 wie mach ich jetzt das er in der Zeile einen Bestimmten Buchstaben sucht, und 3 Buchstaben dahinter ausgibt?

    Ich glaub ich bin auf dem Richtigem Pfad, bitte nix sagen, will mal was schaffen machn XD 🙄 👍



  • String line;
    for(int i = 0; i < Memo1->Lines->Count; i++) {
            line = Memo1->Lines->Strings[i];
            if(line[1] == 'A') {
                    if(line[2] == 'B') {
                            for(int L = 0; L < sizeof(line); L++) {
                                    if(line[L] == 'C') {
                                            if(line[L+1] == 'D') {
                                                    if(line[L+2] == 'E') {
                                                            for(int k = L+3; k < sizeof(line); k++) {
                                                                    ShowMessage(line[k] + " " + line[k+1] + " " + line[k+2]);
                                                            }
                                                    }
                                            }
                                    }
                            }
                    }
            }
    }
    

    So, ich glaub das is schonmal ein guter anfang nur:

    1 - wie verknüpf ich line[k], " ", line[k+1] und line[k+2] ?
    2 - wenn ich nur ShowMessage(line[k]); mach und ich einen Text reinschreibe, dann kommt "Zugriffsverletzung bei Adresse sonso in Modul 'rtl60.bpl'. Lesen von adresse sonso" wie kann ich das verhindern?



  • Hi,
    schau dir mal die Methode AnisString::SubString an! Ist bestimmt hilfreicher als diese anzen if's....

    Und du bist dir bewusst, dass l und L was anderes ist?

    MfG

    Alexander Sulfrian



  • medhode wird gesucht, L und l is freilich was anderes, ich hab nur L draus gemacht, das man es nicht mit 1 (eins) verwechselt, und hab eins vergessen 😉

    btw: Spielst du omega-day? oder hast den Communicator nur so gemacht, gefällt mir. Nur kommt, wenn ich auf Syncronisieren drück, das die Daten nicht abgeholt werden konnten 😞



  • weis denn keiner mehr was?



  • Zeig doch erstmal deinen aktuellen Versuch mt SubString.
    Die AnsiString-Klasse verfügt übrigens noch über haufenweise anderer äusserst nützlicher Methoden.



  • Hi,

    also zuerst mal **sollte** AnsiString funktionieren (hab' hier keine IDE)...
    ok wenn ich Dich richtig verstanden habe, möchtest Du hinter dem A 3 Zeichen einfügen:

    int pos;
    
    for (int i = 1; i < Memo1->Lines->Count; i++)
    {
        pos = Memo1->Lines->Strings[i].AnsiPos("A");
        if (pos == 1)
            Memo1->Lines->Strings[i] = Memo1->Lines->Strings[i}.Insert("xXx", pos + 1);
    }
    

    Schau Dir unbedingt mal die Funktionen von AnsiString an. z.B. die oben verwendeten AnsiPos(), Insert(), aber auch SubString() oder Delete(). AnsiString ist eine sehr flexible und mächtige Klasse. Die mußt Du beherrschen.

    Falls es tatsächlich in TMemo nur Strings und keine AnsiStrings sein sollten (ich verwende immer TRichEdit, kann mehr), verwendest Du statt .AnsiPos() eben .Pos().

    Joe_M.



  • Vielen Dank für das Unterlaufen unserer pädagogischen Bemühungen.



  • Ups, sorry... aber sein Versuch mit den if's sah so erbarmungswürdig aus. 🙂

    Aber wenn es nicht gewünscht ist, werde ich es in Zukunft unterlassen, so direkte Hilfe zu geben.

    Joe_M.



  • Joe_M. schrieb:

    sein Versuch mit den if's sah so erbarmungswürdig aus

    Einen mehr oder weniger erbarmungswürdigen SubString-Versuch hättest du doch noch abwarten können. 😉



  • ne, ich hab ein Log von einem Programm, das z.B. so aussieht:

    HJ - jhlajsfhljsdhflf
    AB - jhjkhjahsfhlsfCDE123
    HJ - hasfhsfddfh

    aus diesem soll er die Zeilen suchen, die mit AB anfangen, und die nächsten drei Buchstaben die auf CDE in dieser Zeile folgen ausgeben.

    SubString hab ich nix gefunden. 😞


Anmelden zum Antworten