Advertisement
Guest User

Szukanie

a guest
Dec 21st, 2014
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.94 KB | None | 0 0
  1. //---------------------------------------------------------------------------
  2.  
  3. #include <vcl.h>
  4. #pragma hdrstop
  5.  
  6. #include "Unit3.h"
  7. #include "Unit1.h"
  8. //---------------------------------------------------------------------------
  9. #pragma package(smart_init)
  10. #pragma resource "*.dfm"
  11.  
  12. int pos; //pozycja wyszukiwania, bedzie potrzebna
  13.  
  14. char konwersjaNaChar(AnsiString zmienna)
  15. {
  16.         //potrzebna do porownania konwersja na char - funkcja przyjmuje ansistringa jako argument (jest to zawsze ansistring o dlugosci 1)
  17.         //nastepnie funkcja zwraca tego ansistringa (pierwszy znak w tym ansistringu, chociaz przy ansistringach o dlugosci 1 jest to bez znaczenia)
  18.         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
  19.         return tablica[0];
  20. }
  21.  
  22. bool porownanie(TCheckBox *wielkoscLiter, AnsiString ansistring1, AnsiString ansistring2)
  23. {
  24.     char pTekst = konwersjaNaChar(ansistring1);
  25.     char szukFraza = konwersjaNaChar(ansistring2); //ta odrobina konwersji byla potrzebna, zeby wszystko dzialalo poprawnie - ta funkcja potrzebuje charow do poprawnego dzialania
  26.  
  27.  
  28.     if(wielkoscLiter->Checked == false)//jesli checkbox "rozrozniaj wielkosc liter" nie jest zaznaczony
  29.     {
  30.         if(szukFraza >= 65 && szukFraza <= 90)//w tych granicach sa duze litery
  31.         {
  32.                 if(pTekst == szukFraza || pTekst == szukFraza + 32)
  33.                 {
  34.                         //jesli ma nie zwracac uwagi na wielkosc liter, to niech instrukcja warunkowa bedzie spelniona gdy:
  35.                         //dany znak z tekstu odpowiada znakowi z szukanej frazy,
  36.                         //lub danemu znakowi z szukanej frazy powiekszonemu o 32, bo taka jest dokladnie roznica miedzy malymi a duzymi literami w ASCII
  37.                         return true;//jak sie zgadza to returnuje true
  38.                 }
  39.                 else
  40.                 {
  41.                         return false;//jak sie nie zgadza to returnuje false
  42.                 }
  43.         }
  44.         else if(szukFraza >= 97 && szukFraza <= 122)//w tych granicach sa male litery
  45.         {
  46.                 if(pTekst == szukFraza || pTekst == szukFraza - 32)
  47.                 {
  48.                         //jesli ma nie zwracac uwagi na wielkosc liter, to niech instrukcja warunkowa bedzie spelniona gdy:
  49.                         //dany znak z tekstu odpowiada znakowi z szukanej frazy,
  50.                         //lub danemu znakowi z szukanej frazy pomniejszonemu o 32, bo taka jest dokladnie roznica miedzy malymi a duzymi literami w ASCII
  51.                         return true;//jak sie zgadza to returnuje true
  52.                 }
  53.                 else
  54.                 {
  55.                         return false;//jak sie nie zgadza to returnuje false
  56.                 }
  57.         }
  58.         else //w przypadku znakow nie bedacych literami
  59.         {
  60.                 if(pTekst == szukFraza)//tutaj nie ma podzialu na duze i male litery bo to wkoncu znaki specjalne, wiec gitara gra
  61.                 {
  62.                         return true;
  63.                 }
  64.                 else
  65.                 {
  66.                         return false;
  67.                 }
  68.         }
  69.  
  70.         //wymyslic jeszcze jakies gowno dla polskich znakow, koniecznie
  71.  
  72.     }
  73.     else//jesli checkbox "rozrozniaj wielkosc liter" jest zaznaczony
  74.     {
  75.                 if(pTekst == szukFraza)//tutaj rozroznia wielkosc liter, wiec wszystko jest proste bo duze i male litery maja rozne kody ASCII
  76.                 {
  77.                         return true;
  78.                 }
  79.                 else
  80.                 {
  81.                         return false;
  82.                 }
  83.     }
  84. }
  85.  
  86. void zaznaczenie(TMemo *tresc, int start, int meta)
  87. {
  88.         tresc->Perform(EM_SETSEL, start, meta);
  89.         tresc->SetFocus();
  90.         //tutaj trzeba jeszcze sprawic, by okno glowne nie stawalo sie aktywne, tylko zeby szukajka pozostala aktywna a zaznaczenie pojawialo sie w oknie glownym
  91.         //ANY IDEAS?
  92.  
  93.         //bardzo ci dziekuje http://programowanie.cal.pl/cyfbar/richedit.html , buziaczki <3
  94. }
  95.  
  96. int szukaj(AnsiString pTekst, AnsiString szukFraza, TLabel *Label, TCheckBox *wielkoscLiter, int a = 1)
  97. {
  98.         //MAGIC! DO NOT TOUCH!
  99.         //nie wiedzialem jak sie wziac za wyszukiwanie frazy w Memo, wiec postanowilem sam napisac funkcje - jestem w koncu mistrzem programowania :D
  100.         //pTekst - przeszukiwany tekst w polu memo; szukFraza - szukana fraza czyli tekst ktory chcemy odnalezc, wpisane w polu edit
  101.         //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 ;<
  102.         //wielkoscLiter to checkbox "rozrozniaj wielkosc liter", posluzy do oprogramowania tej opcji by wyszukiwalo tak jak powinno
  103.         //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
  104.         //funkcja bedzie zwracala wartosc pozycji, czyli a - zeby potem moc latwo zaprogramowac button "nastepny".
  105.  
  106.         if(szukFraza.Length()==0)
  107.         {
  108.                 return 1;//jesli pole szukaj jest puste, to niech zakonczy dzialanie zwracajac domyslna wartosc a
  109.         }
  110.  
  111.         int isTrue = 0; //jesli litera w wyszukiwanej frazie sie zgadza z litera w przeszukiwanym tekscie, nastapi inkrementacja zmiennej.
  112.         //Potem sie porowna jej wartosc z dlugoscia szukanej frazy i w ten sposob rozpoznamy, czy zostala ona znaleziona
  113.  
  114.         int pozycja;//pozycja pierwszego znaku w szukanym tekscie
  115.         int koniecZaznaczenia;//potrzebne do funkcji void zaznaczenie, bedzie to pozycja ostatniego znaku w zaznaczeniu
  116.  
  117.         bool ifFind = false; //zmienna boolowska mowiaca czy fraza zostala znaleziona, domyslnie ma byc zainicjowana jako false, zostanie zmieniona gdy fraze znajdzie
  118.  
  119.         for(int b = 1; a <= pTekst.Length(); a++) //w przeciwienstwie do zwyklego stringa, ansi string indeksuje sie od 1 a nie od 0
  120.         //a dotyczy przeszukiwanego tekstu, b dotyczy szukanej frazy, zmienne te sluza do okreslania pozycji
  121.         //a ile nerwow i wulgarnych okreslen pewnego zawodu padlo z moich ust zanim sie o tym dowiedzialem :D
  122.         {
  123.                 if(porownanie(wielkoscLiter, pTekst[a], szukFraza[b]))
  124.                 {
  125.                         isTrue++; //wspomniana wczesniej inkrementacja zmiennej
  126.                         b++;//inkrementuje b - musze to zrobic tutaj, no po prostu zeby dzialalo, LOL
  127.  
  128.                         if(isTrue == szukFraza.Length())
  129.                         {
  130.                                 pozycja = a - szukFraza.Length(); //zapisuje pozycje, na ktorej znaleziono poczatek szukanego tekstu
  131.                                 koniecZaznaczenia = pozycja + szukFraza.Length();
  132.                                 zaznaczenie(Form1->tresc, pozycja, koniecZaznaczenia);
  133.                                 ifFind = true; //przekazywanie do zmiennej ifFind informacji, ze znaleziono
  134.                                 break; //przerwanie petli
  135.                         }
  136.                 }
  137.                 else
  138.                 {
  139.                         isTrue = 0; //jesli znaki sie nie zgadzaja, to ta zmienna jest zerowana
  140.                         b = 1; // to tez resetujemy do wartosci poczatkowej
  141.                 }
  142.         }
  143.  
  144.         switch(ifFind)
  145.         {
  146.         case false:
  147.                 Label->Visible=true;//jesli nie znaleziono szukanego tekstu, to parametr visible labela z tekstem "Nie znaleziono" zmienia się na true i tekst sie pojawia
  148.                 a = 0; //jesli nie znaleziono, to przyda sie przywrocenie a do domyslnej wartosci zeby potem dalo sie wrocic na poczatek po kliknieciu "nastepny"
  149.                 //musi byc 0 a nie 1 bo funkcja onclick buttona bierze parametr a + 1, a 0 + 1 = 1
  150.                 break;
  151.         case true:
  152.                 Label->Visible=false;//jesli znaleziono szukany tekst, to parametr jest false i nie widac tekstu "Nie znaleziono"
  153.                 break;
  154.         }
  155.  
  156.         return a;//zwracanie a
  157. }
  158.  
  159. TForm3 *Form3;
  160. //---------------------------------------------------------------------------
  161. __fastcall TForm3::TForm3(TComponent* Owner)
  162.         : TForm(Owner)
  163. {
  164. }
  165. //---------------------------------------------------------------------------
  166.  
  167. void __fastcall TForm3::Edit1Change(TObject *Sender)
  168. {
  169.         pos = szukaj(Form1->tresc->Text, Form3->Edit1->Text, Form3->Label2, Form3->CheckBox1);//wywolanie opcji szukania, a pos bedzie potrzebne do buttona "nastepny"
  170. }
  171. //---------------------------------------------------------------------------
  172.  
  173.  
  174.  
  175. void __fastcall TForm3::Button1Click(TObject *Sender)
  176. {
  177.         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
  178. }
  179. //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement