Strona 2 z 2

Re: Wyszukiwanie tekstu w tabeli StringGrid.

Nowy postNapisane: niedziela, 18 października 2009, 12:43
przez Witold
Cyfrowy Baron napisał(a):Hermetyzacja funkcji ma tą zaletę, że to funkcja zapamiętuje wszystkie ustawienia, więc to rozwiązanie jest najbliższe rozwiązanie ze stworzeniem nowego komponentu.

MSZ nie bardzo, stan zmiennych obiektu łatwo zmienić z zewnątrz (gdy jest stosowny interfejs). Stan zmiennych statycznych w funkcji z zewnątrz, nie bardzo. Sam proponujesz aby funkcja korzystała z zmiennych globalnych. U mnie zmienne globalne są tylko dla przykładu i są podawane jak argument funkcji (sama funkcja nie jest od nich uzależniona).

Pisząc „oprócz tekstu może zmienić się jeszcze zmienić TStringGrid na którym szuka się tekstu”, chodziło mi że w programie może być StringGrid1 i StringGrid2, Twoja funkcja może działać niewłaściwie gdy najpierw poszukamy tekstu w StringGrid1 potem w StringGrid2.

Cyfrowy Baron napisał(a):Zmienna fText nie powinna chyba być typu const.

To tylko do testów, dodawanie const do obiektów które się nie zmieniają ułatwia wyłapywanie głupich błędów, a ja robię takich sporo.

Re: Wyszukiwanie tekstu w tabeli StringGrid.

Nowy postNapisane: niedziela, 18 października 2009, 17:02
przez Cyfrowy Baron
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.

Re: Wyszukiwanie tekstu w tabeli StringGrid.

Nowy postNapisane: poniedziałek, 19 października 2009, 11:39
przez Witold
Cyfrowy Baron napisał(a):Jeżeli komponent ma funkcje i zmienne zadeklarowane jako prywatne to raczej ich nie zmienisz.

Pisałem gdy jest odpowiedni interfejs, inaczej - tylko wtedy gdy to ma sens. W przypadku parametru: miejsca od którego ma się rozpocząć szukanie, dostęp do niego ma dla mnie sens, tego bym nie chował.

Cyfrowy Baron napisał(a):Ja się z Tobą nie sprzeczam o to który kod jest lepszy, tylko wskazuję wady i zalety jednego i drugiego.

O tak jak ja. Zresztą bez dokładnej wiedzy co ta funkcja ma robić to nie jest łatwe, teraz napisałbym to inaczej.

Cyfrowy Baron napisał(a):Przy okazji okazało się, że kod z pętlą while nie działa prawidłowo...


W tym kodzie z pętlą, który podałeś wcześniej ,umieściłeś while(…) , przed ustawieniem zmiennych na x = 1; y = 1; w kodzie z goto masz ustawienie zmiennych x=1;y=1 potem goto.

Kod: Zaznacz cały
  //...
   }
   while(idx == ID_NO);

   x = 1;
   y = 1;
}


Kod: Zaznacz cały
           //...
            x = 1;
            y = 1;

           if(idx == ID_YES) goto LAB_1;// Szukaj(findText, Tabela);
        }