Wyszukiwanie tekstu w tabeli StringGrid.

dział ogólny

Re: Wyszukiwanie tekstu w tabeli StringGrid.

Nowy postprzez Witold » niedziela, 18 października 2009, 12:43

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.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Wyszukiwanie tekstu w tabeli StringGrid.

Nowy postprzez Cyfrowy Baron » niedziela, 18 października 2009, 17:02

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.
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
    NieznanyNieznana

Re: Wyszukiwanie tekstu w tabeli StringGrid.

Nowy postprzez Witold » poniedziałek, 19 października 2009, 11:39

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);
        } 
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Poprzednia strona

  • 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 38 gości

cron