CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - wyszukiwanie tekstu

wyszukiwanie tekstu

dział ogólny

wyszukiwanie tekstu

Nowy postprzez Agnieszka16 » sobota, 7 maja 2011, 15:00

Mam prośbę, piszę program który wyszukuje tekst i oto jego kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TSearchTypes st;

 String fText = Edit1->Text.Trim().LowerCase();

 if(RichEdit1->SelLength)
  RichEdit1->SelStart += 1;

 int fPos = RichEdit1->FindText(fText, RichEdit1->SelStart, RichEdit1->Text.LowerCase().Length(), st);
 RichEdit1->SelStart = fPos;
 RichEdit1->SelLength = fText.Length();
 RichEdit1->SetFocus();

 if(fPos != -1)
 {
  RichEdit1->SelStart = fPos;
  RichEdit1->SelLength = fText.Length();
 }
 else
 {
  MessageBox(NULL, "Przeszukano cały dokument", "Zakończono wyszukiwanie", MB_OK);
  RichEdit1->SelStart = 0;
 }
}



Ale ten program wyszukuje tylko jedno słowo a mi chodzi o coś innego.
Na przykład wpisuję w komponencie RichEdit liczby na przykład:

KOD text:     UKRYJ  
5, 15, 25, 34, 65, 67, 71
4, 12, 15, 18, 25, 28, 31


i teraz w komponencie TEdit wpisuję liczby do wyszukania na przykład: 12, 25, 31
I po naciśnięciu komponentu TButton program mi wyszuka wiersz w którym występują te liczby.
Proszę o wyrozumiałość gdyż jestem zielona i dopiero zaczyna przygodę z programowaniem.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: wyszukiwanie tekstu

Nowy postprzez Cyfrowy Baron » sobota, 7 maja 2011, 15:59

Tutaj standardowe wyszukiwanie na nic się nie zda. Najpierw ustalmy dlaczego używasz obiektu typu TRichEdit skoro liczby są przechowywane na liście. Czy to musi być TRichEdit, czy też użyłaś go by ułatwić sobie wyszukiwanie?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: wyszukiwanie tekstu

Nowy postprzez Agnieszka16 » sobota, 7 maja 2011, 16:39

Użyłam go dla ułatwienia wyszukiwania.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: wyszukiwanie tekstu

Nowy postprzez Agnieszka16 » sobota, 7 maja 2011, 16:50

A jakiego komponentu powinnam użyć?
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: wyszukiwanie tekstu

Nowy postprzez Cyfrowy Baron » sobota, 7 maja 2011, 18:15

Agnieszka16 napisał(a):A jakiego komponentu powinnam użyć?


Może to być TRichEdit, ale skoro to zwykła lista, to lepiej użyć TListBox:

KOD cpp:     UKRYJ  
#include <vector.h> /* koniecznie dodać w sekcji include */

int SearchNumbers(TStrings *List, String Text)
{
  Text += ",";

  vector<String> Numbers;

  int p = -1;
  do
  {
   p = Text.Pos(",");
   if(p == 0) break;

   String sSeg = Text.SubString(1, p - 1).Trim();
   if(!sSeg.IsEmpty()) Numbers.push_back(sSeg);

   Text = Text.Delete(1, p + 1);

  }while(p > 0);

  int nCount = Numbers.size(), lCount = List->Count;

  int l = 0;
  do
  {
        p = 0;
        String sLine = List->Strings[l];

        for(int n = 0; n < nCount; n++)
        {

         String searchNumber = Numbers[n];
         int s = sLine.Pos(searchNumber);

         if(s > 0) p++; else break;

         if(p == nCount) return l;
        }

        l++;
  }while(l < lCount);

 return -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int index = SearchNumbers(ListBox1->Items, Edit1->Text);

 if(index < 0) ShowMessage("Niczego nie znaleziono");
 else ListBox1->ItemIndex = index;
}
//---------------------------------------------------------------------------


Dla RichEdit wywołanie będzie wyglądało tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int index = SearchNumbers(RichEdit1->Lines, Edit2->Text);

 if(index < 0) ShowMessage("Niczego nie znaleziono");
 else
 {
  RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, index, 0);
  RichEdit1->SelLength = RichEdit1->Lines->Strings[index].Length();
  RichEdit1->Perform(EM_SCROLLCARET, 0, 0);
  RichEdit1->SetFocus();
 }

}



Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: wyszukiwanie tekstu

Nowy postprzez Agnieszka16 » sobota, 7 maja 2011, 19:01

To działa, dziękuję Cyfrowy Baronie.
Ostatnio edytowano niedziela, 8 maja 2011, 08:16 przez Cyfrowy Baron, łącznie edytowano 1 raz
Powód: Tak naprawdę to nie naywam się Cyfrowy Baron, więc nie ma powodu by zwracać sie do mnie per Pan. Do podziękowań jest specjalna ikona w nagłówku postu.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: wyszukiwanie tekstu

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 14:33

Panie Baronie a jak zrobić żeby ten program przeszukiwał wszystkie wystąpienia w dokumencie do końca? Bo próbuję ale mi się nie udaje.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: wyszukiwanie tekstu

Nowy postprzez Cyfrowy Baron » niedziela, 8 maja 2011, 14:50

Jeżeli ma to być realizowane na jakiejś liście wizualnej, to można to zrobić tylko na liście obsługującej MultiSelect, czyli wielokrotne zaznaczanie. W takiej sytuacji w grę wchodzi tylko ListBox. By można było zaznaczać wiele pozycji na liście musisz ustawić właściwość MultiSelect obiektu ListBox1 na true. Reszta kodu niewiele się zmieni. Trochę się dziwię, że sama nie byłaś w stanie tego zrobić:

KOD cpp:     UKRYJ  
void __fastcall SearchNumbers(TListBox *List, String Text)
{
  List->ClearSelection();
  Text += ",";

  vector<String> Numbers;

  int p = -1;
  do
  {
   p = Text.Pos(",");
   if(p == 0) break;

   String sSeg = Text.SubString(1, p - 1).Trim();
   if(!sSeg.IsEmpty()) Numbers.push_back(sSeg);

   Text = Text.Delete(1, p + 1);

  }while(p > 0);

  int nCount = Numbers.size(), lCount = List->Items->Count;

  int l = 0;
  do
  {
        p = 0;
        String sLine = List->Items->Strings[l];

        for(int n = 0; n < nCount; n++)
        {

         String searchNumber = Numbers[n];
         int s = sLine.Pos(searchNumber);

         if(s > 0) p++; else break;

         if(p == nCount) List->Selected[l] = true;
        }

        l++;
  }while(l < lCount);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 SearchNumbers(ListBox1, Edit1->Text);

 if(ListBox1->ItemIndex < 0) ShowMessage("Niczego nie znaleziono");
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: wyszukiwanie tekstu

Nowy postprzez Agnieszka16 » niedziela, 8 maja 2011, 15:15

Dziękuje, działa.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości