radiogroup itemindex krótsza wersja?

0

Witam.

Pisze sobie programik coś w stylu ankiety. Mam 3 groupboxy i wszędzie takie same odpowiedzi. Za każdą odpowiedź w zależności czy jest to a b czy c są jakieś punkty. W przycisku liczenia mam taki kod, który liczy punkty i tutaj odczuwam lekki niesmak, bo pewnie da sie to jakoś krócej zrobić, ale nie wiem jak.
Kod:

case Pytanie1.ItemIndex of
    0: Punkty := Punkty + 1;
    1: Punkty := Punkty + 2;
    2: Punkty := Punkty + 3;
  end;
case Pytanie2.ItemIndex of
    0: Punkty := Punkty + 1;
    1: Punkty := Punkty + 2;
    2: Punkty := Punkty + 3;
  end;
case Pytanie3.ItemIndex of
    0: Punkty := Punkty + 1;
    1: Punkty := Punkty + 2;
    2: Punkty := Punkty + 3;
  end;

I ten kod tak sie dalej dłuży jeżeli chce zrobić więcej pytań... Jak widać zmienia się tylko nazwa komponentu radiogroup. Czy da sie to jakoś krócej napisać? Myślałem o pętli, ale nie wiem jak sie za to zabrać.

0

No przede wszystkim to można dać
Punkty:=Punkty+PytanieX.ItemIndex+1;

A poza tym możesz użyć components ale w tym celu to już trzeba wiedzieć na czym klasy polegają, a ty chyba nie wiesz, więc czekaj aż ci ktoś gotowca da.

0

... więc niech będzie gotowiec. Czemu nie

Punkty:= 0;
for i:= 0 to ControlCount - 1 do
  if Controls[i] is TRadioGroup
  then Inc(Punkty, (Controls[i] as TRadioGroup).ItemIndex + 1);
0

Chodzi o to, że musze do każdej odpowiedzi przypisywać punkty, bo jak mam np. a - 5, b - 4, c - 3 to tego tak nie moge zrobić. Oczywiście przyda sie, ale ogólnie nie o to mi chodziło - to był tylko przykład.

0

To użyj rozwiązania simplexa + tablicę z punktacją...

0

Dzięki za pomoc.

0

Problemem początkujących programistów jest to, że najwyraźniej w dupie mają regułę DRY... Ostatnio też był tu temat odnośnie gry w kółko i krzyżyk, gdzie formatując kod do postaci czytelnej dla człowieka zrobiło się ponad 1000 linii; Nie dziwiłbym się gdyby nie fakt, że można było go skrócić do 200 linii, dzięki zastosowaniu macierzy i patrzeniu na to, co się powtarza i co można skrócić; U Ciebie jest tak samo, masz powtarzające się instrukcje wyboru, nazwy kontrolek i ich indeksy oraz wartości punktacji; Cały ten kod (i jego dalszą część):

case Pytanie1.ItemIndex of
  0: Punkty := Punkty + 1;
  1: Punkty := Punkty + 2;
  2: Punkty := Punkty + 3;
end;

case Pytanie2.ItemIndex of
  0: Punkty := Punkty + 1;
  1: Punkty := Punkty + 2;
  2: Punkty := Punkty + 3;
end;

case Pytanie3.ItemIndex of
  0: Punkty := Punkty + 1;
  1: Punkty := Punkty + 2;
  2: Punkty := Punkty + 3;
end;

można skrócić do takiej postaci:

var
  Punkty, I: Word;
begin
  Punkty := 0;

  for I := 1 to 3 do
    Inc(Punkty, TRadioGroup(FindComponent('Pytanie' + IntToStr(I))).ItemIndex + 1);
end;

i to cała filozofia; Ty dla 10 pytań musisałbyś napisać 10 warunków, czyli 50 linii, a mój kod nie zmieniłby się prawie w ogóle, tyle, że zamiast 3 w liczniku pętli było by 10;

Jeśli natomiast będziesz chciał zrobić mieszane odpowiedzi:

Pytanie Odpowiedź Punkty
1 a) 1
b) 3
c) 2
2 a) 3
b) 1
c) 2
3 a) 2
b) 1
c) 3
zrób macierz statyczną i podczas sumowania punktów dodaj odpowiednią wartość z macierzy:
const
  { TPunkty: array [Pytanie, Odpowiedź] of Zakres_Punktów }
  TPunkty: array [0 .. 2, 0 .. 2] of 1 .. 3 = ((1, 3, 2),
                                               (3, 1, 2),
                                               (2, 1, 3));
var
  Punkty, I: Word;
begin
  Punkty := 0;

  { DLA 3 PYTAŃ }
  for I := 0 to 2 do
    Inc(Punkty,
        TPunkty[I][TRadioGroup(FindComponent('Punkty' +
                                              IntToStr(I + 1))).ItemIndex]);
  { DURNE FORMATOWANIE BO NIE MIEŚCI SIĘ W JEDNEJ LINII NA FORUM... }
end;

To wszystko; w intrukcji IntToStr(I + 1) dodane jest 1, bo indeksujesz kontrolki od 1, a nie od 0; Powinieneś nazwy kontrolek ustawić od 0 (Pytanie0, Pytanie1...), wtedy do I nie będziesz musiał nic dodawać;

Jeżeli będziesz chciał zmienić punktację wystarczy, że zmienisz wartości jedynie w macierzy TPunkty i ich zakres;

0

Dzięki wielkie za pomoc. Kurcze teraz patrze jakie to łatwe, a na to nie wpadłem. Na prawde jestem Ci winny piwo. :d

1 użytkowników online, w tym zalogowanych: 0, gości: 1