Jeżeli komponent ma funkcje i zmienne zadeklarowane jako prywatne to raczej ich nie zmienisz.
Sam proponujesz aby funkcja korzystała z zmiennych globalnych.
Tylko tam gdzie to jest już absolutnie niezbędne.
Twoja funkcja może działać niewłaściwie gdy najpierw poszukamy tekstu w StringGrid1 potem w StringGrid2.
To prawda, ale i to można poprawić zapamiętując nazwę, podobnie jak to jest z poszukiwanym tekstem:
- Kod: Zaznacz cały
static String memGrid = "";
if(memGrid != Tabela->Name)
{
x = 1;
y = 1;
}
/* [...} */
if(tekst.LowerCase() == findText.Trim().LowerCase())
{
Tabela->Col = j;
Tabela->Row = i;
if(j < Tabela->ColCount) x = j + 1; else x = 0;
if(i < Tabela->RowCount) y = i; else y = 0;
memText = findText;
memGrid = Tabela->Name;
return;
}
Ja się z Tobą nie sprzeczam o to który kod jest lepszy, tylko wskazuję wady i zalety jednego i drugiego.
Problem rozwiązuje nowy komponent zawierający zhermetyzowane funkcje. Funkcje i zmienne zdefiniowane w klasie komponentu niezależnie od tego czy są globalne czy lokalne są funkcjami tej klasy, poza tym znika problem:
Twoja funkcja może działać niewłaściwie gdy najpierw poszukamy tekstu w StringGrid1 potem w StringGrid2.
gdyż wywoływana jest konkretna funkcja będąca elementem konkretnego obiektu.
Przy okazji okazało się, że kod z pętlą while nie działa prawidłowo,niezależnie czy
while(idx == ID_NO);, czy też
while(idx == ID_YES); nie będę się zagłębiał w istotę problemu, jeżeli ktoś nie wierzy niech przetestuje przykład z pętlą wprowadzając do tabeli kilka takich samych tekstów i wyszukując je z dojściem do końca i pojawieniem się komunikatu. Jeżeli wybierzemy tak, to funkcja rozpocznie wyszukiwanie od początku, ale nie po zamknięciu komunikatu, lecz po ponownym wybraniu funkcji, ale jeżeli wybierzemy nie to dalsze wyszukiwanie nie będzie już możliwe, gdyż komunikat będzie pojawiał się cały czas dla while(idx == ID_NO);, dla while(idx == ID_YES); jest dokładnie na odwrót. Po wyświetleniu komunikatu z pytaniem i wybraniu tak powinno nastąpić automatyczne przejście do początku tabeli i wyszukanie pierwszego tekstu, ale tak się nie dzieje, funkcja kończy działanie.