Przypisywanie tej samej wartości

dział ogólny

Przypisywanie tej samej wartości

Nowy postprzez Michal-S2 » poniedziaÅ‚ek, 21 wrzeÅ›nia 2009, 22:13

Witam,

Czym można zastąpić kod np.
Kod: Zaznacz cały
      FirstBlack->Checked = false;
      FirstBrown->Checked = false;
      FirstRed->Checked = false;
      FirstOrange->Checked = false;
      FirstYellow->Checked = false;
      FirstGreen->Checked = false;
      FirstBlue->Checked = false;
      FirstViollet->Checked = false;
      FirstGray->Checked = false;
      FirstWhite->Checked = false;

?
Myślałem że może dać by to w tablię, a potem przez pętle przypisywać Checked = false, ale nie wiem czy to dobry pomysł....
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Przypisywanie tej samej wartości

Nowy postprzez banita » poniedziaÅ‚ek, 21 wrzeÅ›nia 2009, 22:20

tablica to jedeno rozwiazanie ale zwazywszy na to iz bcb udostepnia funkcje findcomponent to kiepskie rozwaizanie.
zainteresuj sie owa funkcja, opis znajdziesz w serwisie CB.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Przypisywanie tej samej wartości

Nowy postprzez Witold » poniedziaÅ‚ek, 21 wrzeÅ›nia 2009, 23:33

banita napisał(a): iz bcb udostepnia funkcje findcomponent to kiepskie rozwaizanie.

W jaki sposób można przypisać .Checked = false to komponentów o różnych nazwach przy pomocy findcomponent ?
Czemu wersja z findcomponent ma być lepsza od tej z tablicą, wydajność?, kod będzie lepszej jakości ?
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: Przypisywanie tej samej wartości

Nowy postprzez Cyfrowy Baron » wtorek, 22 wrzeÅ›nia 2009, 08:21

To da się zrobić i nie potrzeba do tego tablicy, ani funkcji FindComponent. Wystarczy posłużyć się funkcją ClassNameIs, która sprawdza nazwę klasy komponentu i zwraca wartość typu true lub false. Trzeba również skorzystać z klasy TComponent do tymczasowego przechowywania nazwy komponentu wyliczanego na formularzu. Do wyliczania komponentów należy posłużyć się właściwościami samego formularza: ComponentCount - zwraca liczę komponentów na formularzu, oraz Components - zwraca uchwyt do komponentu. Potem wystarczy posłużyć się rzutowaniem polimorficznym do zmiany dowolnej wartości wybranego komponentu w oparciu o jego klasę.

W przykładzie znajduje się funkcja, która pobiera jeden argument typu bool i w zależności od jego wartości odpowiednio ustawia właściwość Checked wszystkich komponentów typu TCheckBox na formularzu.

plik nagłówkowy np. Unit1.h
Kod: Zaznacz cały
private:
        void CheckBoxState(bool state);


plik źródłowy np. Unit1.cpp
Kod: Zaznacz cały
//---------------------------------------------------------------------------
void TForm1::CheckBoxState(bool state)
{
  TComponent *Temp;
  int count = this->ComponentCount - 1;
  for(int i = count; i > 0; i--)
  {
    Temp = this->Components[i];

    if(Temp->ClassNameIs("TCheckBox"))
    {
     reinterpret_cast<TCheckBox *>(Temp)->Checked = state;
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  CheckBoxState(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  CheckBoxState(false);
}
//---------------------------------------------------------------------------
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: Przypisywanie tej samej wartości

Nowy postprzez Michal-S2 » wtorek, 22 wrzeÅ›nia 2009, 16:57

Cyfrowy Baronie, mała poprawka do Twojego kodu. Zamiast:
Kod: Zaznacz cały
  TComponent *Temp;
  int count = this->ComponentCount - 1;
  for(int i = count; i > 0; i--)
  {
   Temp = this->Components[i];

   if(Temp->ClassNameIs("TCheckBox"))
   {
    reinterpret_cast<TCheckBox *>(Temp)->Checked = state;
   }
  }

(testowane na Turbo C++)
powinno być:
Kod: Zaznacz cały
  TComponent *Temp;
  int count = this->ComponentCount - 1;
  for(int i = count; i > -1; i--)
  {
   Temp = this->Components[i];

   if(Temp->ClassNameIs("TCheckBox"))
   {
    reinterpret_cast<TCheckBox *>(Temp)->Checked = state;
   }
  }

Ponieważ gdy jest tak jak Ty napisałeś to w pierwszym komponencie (CheckBox1) nie można tym kodem zmienić wartości na true lub false.
Czy takie coś się stało dlatego, bo komponenty są numerowane od 0?
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Przypisywanie tej samej wartości

Nowy postprzez Cyfrowy Baron » wtorek, 22 wrzeÅ›nia 2009, 18:12

Zgadza się. Drobne przeoczenie. Można też tak:

Kod: Zaznacz cały
  for(int i = count; i >= 0; i--)
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


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 5 gości