Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #pragma hdrstop
- #include "Unit3.h"
- #include "Unit1.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma resource "*.dfm"
- int pos; //pozycja wyszukiwania, bedzie potrzebna
- char konwersjaNaChar(AnsiString zmienna)
- {
- //potrzebna do porownania konwersja na char - funkcja przyjmuje ansistringa jako argument (jest to zawsze ansistring o dlugosci 1)
- //nastepnie funkcja zwraca tego ansistringa (pierwszy znak w tym ansistringu, chociaz przy ansistringach o dlugosci 1 jest to bez znaczenia)
- char* tablica = zmienna.c_str();//nie da sie (albo o czyms nie wiem) zamienic ansistringa o dlugosci 1 na chara, wiec funkcja zamienia ansistringa na tablice charow i zwraca pierwszy element
- return tablica[0];
- }
- bool porownanie(TCheckBox *wielkoscLiter, AnsiString ansistring1, AnsiString ansistring2)
- {
- char pTekst = konwersjaNaChar(ansistring1);
- char szukFraza = konwersjaNaChar(ansistring2); //ta odrobina konwersji byla potrzebna, zeby wszystko dzialalo poprawnie - ta funkcja potrzebuje charow do poprawnego dzialania
- if(wielkoscLiter->Checked == false)//jesli checkbox "rozrozniaj wielkosc liter" nie jest zaznaczony
- {
- if(szukFraza >= 65 && szukFraza <= 90)//w tych granicach sa duze litery
- {
- if(pTekst == szukFraza || pTekst == szukFraza + 32)
- {
- //jesli ma nie zwracac uwagi na wielkosc liter, to niech instrukcja warunkowa bedzie spelniona gdy:
- //dany znak z tekstu odpowiada znakowi z szukanej frazy,
- //lub danemu znakowi z szukanej frazy powiekszonemu o 32, bo taka jest dokladnie roznica miedzy malymi a duzymi literami w ASCII
- return true;//jak sie zgadza to returnuje true
- }
- else
- {
- return false;//jak sie nie zgadza to returnuje false
- }
- }
- else if(szukFraza >= 97 && szukFraza <= 122)//w tych granicach sa male litery
- {
- if(pTekst == szukFraza || pTekst == szukFraza - 32)
- {
- //jesli ma nie zwracac uwagi na wielkosc liter, to niech instrukcja warunkowa bedzie spelniona gdy:
- //dany znak z tekstu odpowiada znakowi z szukanej frazy,
- //lub danemu znakowi z szukanej frazy pomniejszonemu o 32, bo taka jest dokladnie roznica miedzy malymi a duzymi literami w ASCII
- return true;//jak sie zgadza to returnuje true
- }
- else
- {
- return false;//jak sie nie zgadza to returnuje false
- }
- }
- else //w przypadku znakow nie bedacych literami
- {
- if(pTekst == szukFraza)//tutaj nie ma podzialu na duze i male litery bo to wkoncu znaki specjalne, wiec gitara gra
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- //wymyslic jeszcze jakies gowno dla polskich znakow, koniecznie
- }
- else//jesli checkbox "rozrozniaj wielkosc liter" jest zaznaczony
- {
- if(pTekst == szukFraza)//tutaj rozroznia wielkosc liter, wiec wszystko jest proste bo duze i male litery maja rozne kody ASCII
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- }
- void zaznaczenie(TMemo *tresc, int start, int meta)
- {
- tresc->Perform(EM_SETSEL, start, meta);
- tresc->SetFocus();
- //tutaj trzeba jeszcze sprawic, by okno glowne nie stawalo sie aktywne, tylko zeby szukajka pozostala aktywna a zaznaczenie pojawialo sie w oknie glownym
- //ANY IDEAS?
- //bardzo ci dziekuje http://programowanie.cal.pl/cyfbar/richedit.html , buziaczki <3
- }
- int szukaj(AnsiString pTekst, AnsiString szukFraza, TLabel *Label, TCheckBox *wielkoscLiter, int a = 1)
- {
- //MAGIC! DO NOT TOUCH!
- //nie wiedzialem jak sie wziac za wyszukiwanie frazy w Memo, wiec postanowilem sam napisac funkcje - jestem w koncu mistrzem programowania :D
- //pTekst - przeszukiwany tekst w polu memo; szukFraza - szukana fraza czyli tekst ktory chcemy odnalezc, wpisane w polu edit
- //Label - to label z tekstem NIE ZNALEZIONO pojawiajacy sie pod polem edit gdy nie znaleziono tekstu - no bo wyskakujace okienka sa glupie, lepszy jest taki nienachalny label ;<
- //wielkoscLiter to checkbox "rozrozniaj wielkosc liter", posluzy do oprogramowania tej opcji by wyszukiwalo tak jak powinno
- //a to zmienna potrzebna do ustalania pozycji, niech ma domyslna wartosc 1, bo ansi stringi sa indeksowane od 1 i oznacza to przeszukiwanie od poczatku
- //funkcja bedzie zwracala wartosc pozycji, czyli a - zeby potem moc latwo zaprogramowac button "nastepny".
- if(szukFraza.Length()==0)
- {
- return 1;//jesli pole szukaj jest puste, to niech zakonczy dzialanie zwracajac domyslna wartosc a
- }
- int isTrue = 0; //jesli litera w wyszukiwanej frazie sie zgadza z litera w przeszukiwanym tekscie, nastapi inkrementacja zmiennej.
- //Potem sie porowna jej wartosc z dlugoscia szukanej frazy i w ten sposob rozpoznamy, czy zostala ona znaleziona
- int pozycja;//pozycja pierwszego znaku w szukanym tekscie
- int koniecZaznaczenia;//potrzebne do funkcji void zaznaczenie, bedzie to pozycja ostatniego znaku w zaznaczeniu
- bool ifFind = false; //zmienna boolowska mowiaca czy fraza zostala znaleziona, domyslnie ma byc zainicjowana jako false, zostanie zmieniona gdy fraze znajdzie
- for(int b = 1; a <= pTekst.Length(); a++) //w przeciwienstwie do zwyklego stringa, ansi string indeksuje sie od 1 a nie od 0
- //a dotyczy przeszukiwanego tekstu, b dotyczy szukanej frazy, zmienne te sluza do okreslania pozycji
- //a ile nerwow i wulgarnych okreslen pewnego zawodu padlo z moich ust zanim sie o tym dowiedzialem :D
- {
- if(porownanie(wielkoscLiter, pTekst[a], szukFraza[b]))
- {
- isTrue++; //wspomniana wczesniej inkrementacja zmiennej
- b++;//inkrementuje b - musze to zrobic tutaj, no po prostu zeby dzialalo, LOL
- if(isTrue == szukFraza.Length())
- {
- pozycja = a - szukFraza.Length(); //zapisuje pozycje, na ktorej znaleziono poczatek szukanego tekstu
- koniecZaznaczenia = pozycja + szukFraza.Length();
- zaznaczenie(Form1->tresc, pozycja, koniecZaznaczenia);
- ifFind = true; //przekazywanie do zmiennej ifFind informacji, ze znaleziono
- break; //przerwanie petli
- }
- }
- else
- {
- isTrue = 0; //jesli znaki sie nie zgadzaja, to ta zmienna jest zerowana
- b = 1; // to tez resetujemy do wartosci poczatkowej
- }
- }
- switch(ifFind)
- {
- case false:
- Label->Visible=true;//jesli nie znaleziono szukanego tekstu, to parametr visible labela z tekstem "Nie znaleziono" zmienia się na true i tekst sie pojawia
- a = 0; //jesli nie znaleziono, to przyda sie przywrocenie a do domyslnej wartosci zeby potem dalo sie wrocic na poczatek po kliknieciu "nastepny"
- //musi byc 0 a nie 1 bo funkcja onclick buttona bierze parametr a + 1, a 0 + 1 = 1
- break;
- case true:
- Label->Visible=false;//jesli znaleziono szukany tekst, to parametr jest false i nie widac tekstu "Nie znaleziono"
- break;
- }
- return a;//zwracanie a
- }
- TForm3 *Form3;
- //---------------------------------------------------------------------------
- __fastcall TForm3::TForm3(TComponent* Owner)
- : TForm(Owner)
- {
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm3::Edit1Change(TObject *Sender)
- {
- pos = szukaj(Form1->tresc->Text, Form3->Edit1->Text, Form3->Label2, Form3->CheckBox1);//wywolanie opcji szukania, a pos bedzie potrzebne do buttona "nastepny"
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm3::Button1Click(TObject *Sender)
- {
- pos = szukaj(Form1->tresc->Text, Form3->Edit1->Text, Form3->Label2, Form3->CheckBox1, pos + 1);//szukanie dalej, czyli opcja szukania od pozycji a + 1 w naszej funkcji
- }
- //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement