pitek3010 napisał(a):Np. Jestem w 20 a ten tekst jest 250 jest on podświetlony ale sam muszę go szukać.
StringGrid1->TopRow = 250; // Poczytaj w helpie.
Oraz mam problem z obsługą wyjątków.
Po podaniu nazwy pliku w polu Edit która nie istnieje chciałbym aby wyświetlała mi się informacja którą sam zdefiniuję a nie błąd systemowy.
if(FileExists("nazwa pliku") == true) ShowMessage("Plik istnieje");
else ShowMessage("Brak pliku");
void __fastcall Szukaj(String findText, TStringGrid *Tabela)
{
static int x = 0;
statit int y = 0;
LAB_1:
for(int i = x; i < Tabela->ColCount; x++)
{
for(int j = y; j < Tabela->RowCount; j++)
{
String tekst = Tabela->Cells[i][j].Trim();
if(tekst.LowerCase() == findText.Trim().LowerCase())
{
StringGrid1->Col = i;
StringGrid1->Row = j;
x = i;
y = j
return;
}
}
}
int idx = Application->MessageBox( ("W tabeli ie odnaleziono tekstu \"" + findText + "\". Czy chcesz przeszukać tabelę od początku?").c_str(),
"Wyszukiwanie", MB_YESNO | MB_ICONQUESTION);
x = 0;
y = 0;
if(idx == ID_YES) goto LAB_1;
}
//-----------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String fText = "poszukiwany tekst";
Szukaj(fText, StringGrid1);
}
//------------------------------------------------------------------------
void __fastcall Szukaj(String findText, TStringGrid *Tabela)
{
...
LAB_1:
...
if(idx == ID_YES) goto LAB_1;
}
void __fastcall Szukaj(String findText, TStringGrid *Tabela)
{
...
do
{
...
}
while(idx == ID_YES);
}
void __fastcall Szukaj(String findText, TStringGrid *Tabela)
{
static int x = 1;
static int y = 1;
static String memText = "";
if(memText.Trim().LowerCase() != findText.Trim().LowerCase())
{
x = 1;
y = 1;
}
LAB_1:
for(int i = y; i < Tabela->RowCount; i++)
{
for(int j = x; j < Tabela->ColCount; j++)
{
String tekst = Tabela->Cells[i][j].Trim();
Tabela->Col = j;
Tabela->Row = i;
if(tekst.LowerCase() == findText.Trim().LowerCase())
{
Tabela->Col = j;
Tabela->Row = i;
if(j < Tabela->ColCount) x = j + 1; else x = 1;
if(i < Tabela->RowCount) y = i; else y = 1;
memText = findText;
return;
}
}
x = 1;
}
int idx = Application->MessageBox( ("W tabeli ie odnaleziono tekstu \"" + findText + "\". Czy chcesz przeszukać tabelę od początku?").c_str(),
"Wyszukiwanie", MB_YESNO | MB_ICONQUESTION);
x = 1;
y = 1;
if(idx == ID_YES) goto LAB_1;// Szukaj(findText, Tabela);
}
//-----------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String fText = "poszukiwany tekst";
Szukaj(fText, StringGrid1);
}
//------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall Szukaj(String findText, TStringGrid *Tabela)
{
static int x = 1;
static int y = 1;
static String memText = "";
if(memText.Trim().LowerCase() != findText.Trim().LowerCase())
{
x = 1;
y = 1;
}
for(int i = y; i < Tabela->RowCount; i++)
{
for(int j = x; j < Tabela->ColCount; j++)
{
String tekst = Tabela->Cells[j][i].Trim();
Tabela->Col = j;
Tabela->Row = i;
if(tekst.LowerCase() == findText.Trim().LowerCase())
{
Tabela->Col = j;
Tabela->Row = i;
if(j < Tabela->ColCount) x = j + 1; else x = 1;
if(i < Tabela->RowCount) y = i; else y = 1;
memText = findText;
return;
}
}
x = 1;
}
int idx = Application->MessageBox( ("W tabeli ie odnaleziono tekstu \"" + findText + "\". Czy chcesz przeszukać tabelę od początku?").c_str(),
"Wyszukiwanie", MB_YESNO | MB_ICONQUESTION);
x = 1;
y = 1;
if(idx == ID_YES) Szukaj(findText, Tabela);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String fText = Edit1->Text;
Szukaj(fText, StringGrid1);
}
//---------------------------------------------------------------------------
W podanym przeze mnie kodzie, nie da się zastosować rozwiązania podanego przez polymorphism, gdyż komunikat byłby wyświetlany przed każdym rozpoczęciem wyszukiwania [...]
Z pętlą while nie będzie działał prawidłowo, sam zdecyduj co wolisz przestarzała i niezalecaną funkcję goto, czy też wywołanie rekurencyjne.
Cyfrowy Baron napisał(a):Jeżeli funkcja wykryje, że poszukiwany tekst się zmieni to funkcja rozpoczyna wyszukiwanie od początku.
Cyfrowy Baron napisał(a):To co proponujesz niepotrzebnie skomplikuje wszystko.
Cyfrowy Baron napisał(a):Najlepiej byłoby stworzyć nowy komponent w oparciu TStringGrid i zawrzeć w nim funkcję wyszukiwania.
Cyfrowy Baron napisał(a):N
Twój pomysł mnie zainteresował, ale oczekiwałbym czegoś więcej, czyli kompletnego kodu, a nie tylko nagłówka funkcji - jeżeli nie stanowi to problemu...
#include <algorithm>
const int OZNACZA_ZE_NIE_ZNALEZIONO = -1, OD_POCZATKU = -1;
const AnsiString fText = "poszukiwany tekst";
//---------------------------------------------------------------------------
TPoint Szukaj(TStringGrid *SGrid, const AnsiString & szukTxt,
const TPoint startPoz = TPoint(OD_POCZATKU, OD_POCZATKU),
bool ZacznijSzukOdNastZaStartPoz = true);
//---------------------------------------------------------------------------
TPoint Szukaj(TStringGrid *SGrid, const AnsiString & szukTxt, const TPoint startPoz,
bool ZacznijSzukOdNastZaStartPoz)
{
int start_c = (ZacznijSzukOdNastZaStartPoz) ? startPoz.x+1: startPoz.x;
start_c = std::max(SGrid->FixedCols, start_c);
int start_r = std::max(SGrid->FixedRows, int(startPoz.y));
for (int r = start_r; r < SGrid->RowCount; ++r)
{
for (int c = start_c; c < SGrid->ColCount; ++c)
{
const AnsiString TxtZKom = SGrid->Cells[c][r];
if (AnsiSameText(szukTxt, TxtZKom)) // opcja AnsiSameStr
{
SGrid->Col = c ; // opcja
SGrid->Row = r ; //
return TPoint(c,r);
}
}
start_c = SGrid->FixedCols; // opcja
}
return TPoint(OZNACZA_ZE_NIE_ZNALEZIONO,OZNACZA_ZE_NIE_ZNALEZIONO);
}
//---------------------------------------------------------------------------
TPoint start(OD_POCZATKU,OD_POCZATKU), znaleziono(0,0);
const char * nie_znal_ani_razu = "Tekst \"%s\" nie został odnaleziony. ";
const char * dotarlem_do_konca = "Dotarłem do końca tabeli.";
//---------------------------------------------------------------------------
void __fastcall TForm3::btnSzukajClick(TObject *Sender)
{
znaleziono = Szukaj(StringGrid1, fText, start);
if (znaleziono.x != OZNACZA_ZE_NIE_ZNALEZIONO)
{
//....
}
else
{
AnsiString msg;
if ((start.x == OD_POCZATKU) && (start.y == OD_POCZATKU))
{
msg.sprintf(nie_znal_ani_razu, fText.c_str());
}
msg += dotarlem_do_konca;
Application->MessageBox(msg.c_str(), "Info...", MB_ICONINFORMATION);
}
start = znaleziono;
}
//---------------------------------------------------------------------------
Właściwie to nie wiem ta funkcja ma dokładnie robić.
Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości