Forum MOJA PASJA - PROGRAMOWANIE Strona Główna
http://www.programuj.com
  WikiWiki  FAQFAQ    SzukajSzukaj    UżytkownicyUżytkownicy    GrupyGrupy   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 




Ostatnie wystąpienie ciągu znaków w polu Memo


 
Napisz nowy temat   Odpowiedz do tematu    Forum MOJA PASJA - PROGRAMOWANIE Strona Główna -> Borland C++ Builder
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
ADIOP



Dołączył: 16 Sie 2016
Posty: 4

Post Zacytuj zaznaczone Odpowiedz z cytatem OCEŃ POST
Ostatnio piszę program, w ramach którego mam zamiar zrobić konsolę komend (coś jak wiersz polecenia Windowsa Wink) i nie mogę znaleźć w c++ Builderze odpowiedniej funkcji do wyszukania ostatniego wystąpienia ciągu znaków w polu Memo, oto kod funkcji sprawdzającej jedną komendę (nie działa po ponownym wpisaniu komendy):
c++:

int lastIndexed=-1;
//....
void __fastcall TForm4::ConsoleMemoKeyPress(TObject *Sender, char &Key)
{

      if(Key==VK_RETURN)
      {
       int pos = ConsoleMemo->Lines->IndexOf("/exit");

       if(pos >= 0 && pos != lastIndexed)
       {
         lastIndexed = pos;
         Form4->Close();
         //ConsoleMemo->Lines->Append("WYKONANA KOMENDA EXIT");
       }
      else
      ConsoleMemo->Lines->Add("Nie znam takiej komendy!");
      }
}


A przy okazji, jeśli ktoś wie dlaczego w mojej funkcji nie mogę użyć ConsoleMemo to niech pisze. Chodzi o to, że w funkcji SprawdzKomende() w tym pliku nie mogę użyć nazwy ConsoleMemo, bo program uznaje ją za niezdefiniowaną Sad .

Myślę, że pomocna byłaby możliwość wyszukiwania od konkretnej pozycji w polu.

PS Jeśli ktoś zna sposób na sprawdzenie długości (liczby zajętych wierszy) pola Memo- to też proszę o radę. Smile


Ostatnio zmieniony przez ADIOP dnia Wto Sie 16, 2016 7:04 pm, w całości zmieniany 2 razy
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Albert Rosenfield
programista


Dołączył: 26 Kwi 2007
Posty: 2418
Skąd: olsztyn

Post Zacytuj zaznaczone Odpowiedz z cytatem OCEŃ POST
Abstrahując od głównego problemu. Popraw tego koszmarnego ifa na:
c++:
int pos = ConsoleMemo->Lines->IndexOf("/exit");

if(pos >= 0 && pos != lastIndexed)
{
        lastIndexed = pos;
        Form4->Close();
        //ConsoleMemo->Lines->Append("WYKONANA KOMENDA EXIT");
}
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
ADIOP



Dołączył: 16 Sie 2016
Posty: 4

Post Zacytuj zaznaczone Odpowiedz z cytatem OCEŃ POST
Dzięki za podpowiedź, faktycznie trochę za dużo w tym if-ie napisałem...
W sumie to myślałem o czymś podobnym, ale tak pochłonęły mnie poszukiwania rozwiązania głównego problemu, że zapomniałem poprawić (czytaj: skrócić i zoptymalizować) kod.
Bądź co bądź dzięki! Very Happy
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Albert Rosenfield
programista


Dołączył: 26 Kwi 2007
Posty: 2418
Skąd: olsztyn

Post Zacytuj zaznaczone Odpowiedz z cytatem OCEŃ POST
Wracając do głównego problemu. Pisząc o "ostatnim wystąpienia ciągu znaków w polu Memo", masz na myśli ostatnią linię wprowadzoną do kontrolki?
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
ADIOP



Dołączył: 16 Sie 2016
Posty: 4

Post Zacytuj zaznaczone Odpowiedz z cytatem OCEŃ POST
Nie do końca.
Chodzi mi o indeks ostatniego wystąpienia, czyli, jeśli mamy taką sytuację:

1> /costam
2> Nie znam takiej komendy!
3> /test
4> TEST
5> /test
6> TEST
7> /costam
8> Nie znam takiej komendy!

To po wyszukaniu "/test" ma mi podać numer linii (względnie pozycję w całym tekście) w której ostatni raz ciąg wystąpił, czyli 5 (albo 45 jeśli chodzi o pozycję- uwzględniłem znaki niedrukowane).
Ewentualnie może podać ile linii do tyłu to się stało- 4.
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Albert Rosenfield
programista


Dołączył: 26 Kwi 2007
Posty: 2418
Skąd: olsztyn

Post Zacytuj zaznaczone Odpowiedz z cytatem OCEŃ POST
No a tak:
c++:
int line_i = ConsoleMemo->Lines->Count - 1;

while(line_i >= 0)
{
        String str_line = ConsoleMemo->Lines->Strings[ line_i ];
       
        /* tu sprawdzasz, czy linia 'str_line' zawiera szukaną komendę */       
       
        if(/* jeśli zawiera */) break;
       
        --line_i;
}

?
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
ADIOP



Dołączył: 16 Sie 2016
Posty: 4

Post Zacytuj zaznaczone Odpowiedz z cytatem OCEŃ POST
To może być to. Smile Sprawdzę i się odezwę.
Dzięki.
Powrót do góry
Ogląda profil użytkownika Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum MOJA PASJA - PROGRAMOWANIE Strona Główna -> Borland C++ Builder Wszystkie czasy w strefie CET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


hosting sponsorowany przez hosted.pl
Powered by phpBB © 2001, 2002 phpBB Group