Jak odczytać stan wielu checkboxów w pętli?

Jak odczytać stan wielu checkboxów w pętli?
B0
  • Rejestracja:około 2 lata
  • Ostatnio:około 2 lata
  • Postów:4
0

Mam powiedzmy 100 checkbox, chciałbym odczytać je w pętli, ale nie mam pojęcia jak to zrobić.
coś w ten deseń

Kopiuj
for i:=1 to 100 do
  if  checkbox[i.]checked then ilosc:=ilosc+1;

no i ten zapis checkbox[i.]checked jest niepoprawny, nie wiem jak powinno być ok.
Proszę o pomoc

edytowany 1x, ostatnio: cerrato
I1
  • Rejestracja:około 10 lat
  • Ostatnio:39 minut
  • Postów:166
2

Zapewne zaczynasz przygodę z Delphi, ChatGPT pomoże Ci w wielu przypadkach:
screenshot-20230212201602.png
https://chat.openai.com/chat

Poza tym do tylu CheckBoxów, polecam komponent CheckListBox:
https://www.delphipower.xyz/guide_7/using_a_checklistbox_component.html

B0
  • Rejestracja:około 2 lata
  • Ostatnio:około 2 lata
  • Postów:4
1

Dziękuję za pomoc. Nie wpadłem, żeby zapytać o pomoc AI.
Jest w kodzie jeden błąd

jest c: TControl a ma być c : TComponent;

Widać jeszcze AI nie zastąpi chwilowo człowieka ;)

edytowany 2x, ostatnio: cerrato
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około godziny
  • Lokalizacja:Gorlice
2

@Baczek007 nie tu jest błąd. Przecież TCheckBox to TControl więc nie wiem po co iterować po wszystkich komponentach jak można tylko po kontrolkach. Błędem w tym kodzie jest użycie ComponentCount zamiast ControlCount. Oczywiście trzeba też pobierać kontrolki a więc Controls[i] a nie Components[i].


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
B0
  • Rejestracja:około 2 lata
  • Ostatnio:około 2 lata
  • Postów:4
0

Kompilator nie chciał tego przepuścić, po zmianie, o której pisałem poszło.
Muszę się jeszcze dużo nauczyć. Ostatnio programowałem w pascalu wiele lat temu.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
5
kAzek napisał(a):

Przecież TCheckBox to TControl więc nie wiem po co iterować po wszystkich komponentach jak można tylko po kontrolkach. Błędem w tym kodzie jest użycie ComponentCount zamiast ControlCount. Oczywiście trzeba też pobierać kontrolki a więc Controls[i] a nie Components[i].

Nie do tego te dwie listy służą. Nie chodzi o to z której klasy dany komponent dziedziczy, a o to, gdzie znajduje się dany komponent (w czym jest osadzony) i kto odpowiada za jego automatyczne zwolnienie, a więc o Parent i Owner.

W dużym skrócie:

  • Foo.Controls — zawiera listę komponentów, dla których Foo jest parentem. Z listy tej korzystamy wtedy, gdy chcemy uzyskać referencje wszystkich komponentów, które są osadzone wewnątrz Foo i jest to osadzenie pierwszego poziomu.

    Jeśli np. formularz zawiera GroupBox, a w nim znajduje się Button, to lista Controls formularza będzie zawierać GroupBox (pierwszy poziom osadzenia), ale nie będzie zawierać Button (drugi poziom osadzenia). Aby uzyskać dostęp do Button, trzeba wejść w listę GroupBox.Controls.

  • Foo.Components — zawiera listę komponentów, dla których Foo jest ownerem. Z tej listy korzystamy wtedy, gdy chcemy mieć dostęp do wszsytkich komponentów zwalnianych automatycznie przez Foo. najczęściej używa się tej listy do iterowania po wszystkich komponentach formularza, bez względu na to czy i gdzie są osadzone.

    Jeśli np. formularz zawiera GroupBox, a w nim znajduje się Button, to lista Components formularza będzie zawierać referencje do GroupBox i Button (poziom osadzenia nie ma znaczenia). Natomiast lista GroupBox.Components będzie pusta, nieważne ile komponentów jest w nim osadzonych. W przypadku tworzenia formularzy w designerze, obiekt formularza będzie wyłącznym ownerem wszystkich wyklikanych komponentów.



Przykładowy formularz:

screenshot-20230213121754.png

Drzewo osadzenia komponentów formularza:

Kopiuj
Form1
  GroupBox1
    CheckBox1
    CheckBox2
    CheckBox3
  GroupBox2
    Button1
    Button2
    GroupBox3
      Button3

Zawartość list Controls i Components formularza i komponentów okienkowych:

Kopiuj
Form1.Controls        GroupBox1, GroupBox2
Form1.Components      GroupBox1, CheckBox1, CheckBox2, CheckBox3, GroupBox2, Button1, Button2, GroupBox3, Button3 // cała zawartość formularza

GroupBox1.Controls    CheckBox1, CheckBox2, CheckBox3
GroupBox1.Components  // nic

GroupBox2.Controls    Button1, Button2, GroupBox3
GroupBox2.Components  // nic

GroupBox3.Controls    Button3
GroupBox3.Components  // nic


Dla checkboxów i przycisków, listy Controls również są dostępne, jednak będą one puste, dlatego że nie obsługują osadzania w sobie subkomponentów. Aby osadzanie było możliwe, w do zbioru flag z pola TControl.FControlStyle należy dodać flagę csAcceptsControls, a ta jest usuwana ze zbioru w konstruktorach klas komponentów, które mają osadzania nie obsługiwać (czyli np. w TCheckBox i TButton).

Myślę, że teraz wszystko powinno być jasne. ;)


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 15x, ostatnio: flowCRANE
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:18 dni
0

Obejrzyj TJvgCheckListBox z biblioteki Jedy
https://sourceforge.net/projects/jvcl/


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
2

Panowie, ale OP nie pisał, że wszystkie te checkboxy są zgrupowane i osadzone w tym samym komponencie. Nie wiemy o nich praktycznie nic, ani o ich rodzicach, ani o sferze wizualnej, więc póki OP nie doprecyzuje, to pozostaje co najwyżej gdybać.

BTW: w Lazarusie jest kontrolka TCheckGroup, czyli TGroupBox z osadzonymi TCheckBox, jakby co.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.