Zeile aus memo suchen



  • 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. 😞



  • Also mit Joe's .Pos Einsatz und SubString solltest du es eigentlich hinkriegen.

    PS: SubString
    Die Methode SubString gibt den angegebenen Teilstring in einem AnsiString-Objekt zurück.

    AnsiString __fastcall SubString(int index, int count) const;

    Beschreibung

    Es wird ein neues AnsiString-Objekt zurückgegeben, das einen Teilstring des AnsiString-Objekts enthält. Der Teilstring enthält die in count angegebene Anzahl von Zeichen und beginnt an der mit index festgelegten Position.

    Das steht so in der Hilfe. 🙂
    Vielleicht solltest du die Hilfe installieren wenn du das nicht gefunden hast. :p



  • noch mal ganz deutlich zusammengefaßt: Such in der Online-Hilfe nach 'AnsiString' und schau Dir die Methoden von AnsiString an. Dort findest Du auch die von uns gezeigten Methoden.



  • Hi Jan!

    Das durchlaufen des Memos hast du ja scheinbar schon gefressen...

    Probier das doch nun mal so:
    String zeile = Memoxyz->Lines->Strings[i];

    Dann steht in der Variable "zeile" doch der Inhalt von Zeile i drin, oder?

    Dieses Objekt "zeile" hat dann doch eine Funktion, die da lautet "Pos()". Mit .Pos("CDE") kriegst du dann also raus, an welcher Stelle sich CDE befindet. Wenn sich CDE gar nicht darin befindet, gibt Pos 0 zurück!

    Und den Rest musst du dann eben mit .SubString() machen. Der erste Parameter von SubString gibt an, ab wann du die Zeichen haben möchtest, der zweite gibt an, wie viele Zeichen du haben willst.
    Dafür brauchst du wohl auch noch die Funktion .Length() - die nämlich gibt dir die Länge des Strings zurück!

    Nochmal ein kleiner Denkanstoss:

    A  B     -     j  h  j  k  h  j  a  h  s  f  h  l  s  f  C  D  E  1  2  3 
    1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
                                                             |       |      |
                                Gibt die Funktion Pos() zurück       |      |
                                                                     |---v--|
                                                                         |  |
                               Das hier musst du dir mit SubString rausholen|
                                                                            |
                                        Und das hier gibt dir Length() zurück
    

    So, und nun sieh dir mal deine Zeichenkette mal näher an und kombiniere das ganze mit den 3 Funktionen Pos() SubString() und Length()

    HTH!

    tschüss
    Robert



  • danke, ich glaub ich habs gerafft, echt gut erklärt 🙂


Anmelden zum Antworten