RodioButton tworzony dynamicznie - jak zezwolić na zaznaczenie kilku naraz?

0

Witam
Czy możliwe jest po dynamicznym utworzeniu obiektów RadioButton ustawienie ich tak np. na formie czy panelu, żeby jednocześnie można zaznaczyć kilka z nich.
Załóżmy że mam fragment kodu, którym tworze RadioButtony dynamicznie na panelu:

...
var
  Form1: TForm1;
  P1 : array [0..10] of TRadioButton;

....

procedure TForm1.FormCreate(Sender: TObject);
var i,j: integer;
begin
  for i:=0 to 10 do begin
    P1[i]:=TRadioButton.Create(Self);
    P1[i].Parent:=Panel1;
    P1[i].Top:=220-i*20;
    P1[i].Left:=20;
    P1[i].Caption:=inttostr(i);
  end;
end;

Co poustawiać żeby dało się je zaznaczać każdy z osobna tak jakby były umieszczone na osobnych panelach?

Czy po prostu nie bawić się w takie pierdoły i łatwiej utworzyć sobie do każdego GruopBox?

2

Chyba będziesz musiał faktycznie użyć GroupBoxa. Ale tak w ogóle to przeczysz przeznaczeniu komponentów. TRadioButton, to nie tylko wizualne "widzimisię" twórców systemu. Jego zadaniem jest bycie reprezentacją wyboru jedenej z wielu opcji. Jeżeli chcesz zaznaczać kilka tych samych, to do tego celu służy TCheckBox.

0

W zasadzie nie chodzi oto czy są tworzone dynamicznie czy nie. Wystarczy, że mają wspólnego parenta.

0
olesio napisał(a):

Ale tak w ogóle to przeczysz przeznaczeniu komponentów. TRadioButton, to nie tylko wizualne "widzimisię" twórców systemu. Jego zadaniem jest bycie reprezentacją wyboru jedenej z wielu opcji. Jeżeli chcesz zaznaczać kilka tych samych, to do tego celu służy TCheckBox.

A mnie się właśnie wizualnie podoba RadioButton i zamierzam go wykorzystać tak jak ja chce, a nie tak jak założył sobie "wielki brat" :)
Po to są programiści, żeby zmieniać to co im się nie podoba i zrobić coś po swojemu, nie ?

3

Niby tak, ale standardy od X lat są tak przyjęte i powinno się tego trzymać. Użytkownicy od lat oczekują po radiobutona działania wywłaszczającego. Zmieniając tą zasadę wprowadzasz bałagan.

0

Zrób sobie jaja z Windows i zrób ChceckBox'y i później nadaj im odpowiedni styl wtedy będą się zachowywać jak ChceckBox (wielokrotne zaznaczanie) a wyglądać jak RadioButton :) :

var
  i, style: Integer;
begin
  for i:=Low(P1) to High(P1) do
  begin
    P1[i]:= TCheckBox.Create(Self);
    P1[i].Parent:= Panel1;
    P1[i].Top:=220-i*20;
    P1[i].Left:=20;
    P1[i].Caption:=inttostr(i);
    style:= GetWindowLong(P1[i].Handle, GWL_STYLE);
    style:= style and (not BS_3STATE) or BS_RADIOBUTTON;
    SetWindowLong(P1[i].Handle, GWL_STYLE, style);
    InvalidateRgn(P1[i].Handle, 0, True);
  end;
end;

EDIT
Trick nie działa jak sie stosuje style wizualne dostępne w nowych Delphi (wtedy rysowane są normalne CheckBox'y)

0

Dobry pomysł aczkolwiek poszukuje czegoś jeszcze innego.
Chciałbym wygląd i działanie RadioButton (zaznaczam raz i jest zaznaczone a jak klikam drugi raz to nadal jest zaznaczone) i częściowo CheckBox (z możliwością wielu zaznaczeń, a nie tylko jeden z grupy).

Z tym zaznaczanie to po prostu nie chce mi się bawić w dodatkowe procedurki żeby Checkbox był ciągle zaznaczony to akurat potrafię zrobić ale nie o takie rozwiązanie mi chodzi.

Image2.png

1

@elTwardy - zbyt wielkiego wyboru nie masz; Nawet gdybyś chciał przechowywać aktualne stany zaznaczenia przycisków to przy ich ustawianiu po kliknięciu w dany przycisk zapętlisz program; A musiałbyś to robić, dlatego że te komponenty są tak skonstruowane, że po zaznaczeniu jednego, wszystkie zawarte w komponencie-rodzicu zostają odznaczone;

Najlepszym rozwiązaniem było by skorzystanie z komponentów klasy TCheckBox, dlatego że one nie będą "przeszkadzać" - możesz je zaznaczać jak Ci pasuje; @kAzek podał fajne rozwiązanie, bo dla użytkownika nie ma znaczenia co jest w środku - ważne, że widzi radioprzyciski; Tyle tylko, że musisz sprawdzić pod Lazarusem czy będzie to działać;

Nieco za bardzo kombinujesz - RadioButton został stworzony do innych rzeczy, dlatego obchodzenie jego funkcjonalności nie jest dobrym pomysłem.

0
elTwardy napisał(a):

Z tym zaznaczanie to po prostu nie chce mi się bawić w dodatkowe procedurki żeby Checkbox był ciągle zaznaczony to akurat potrafię zrobić ale nie o takie rozwiązanie mi chodzi.

No dodatkowego kodu jest bardzo wiele, bo kilka linijek trzeba w pętli przypisać wszystkim tą samą orocedurę zdarzenia onClick:

P1[i].OnClick:= CheckBoxClick;

a jej kod też jest bardzo długi:

procedure TForm1.CheckBoxClick(Sender: TObject);
begin
  TCheckBox(Sender).Checked:= True;
end;

Nie rozumiem chcesz całkowicie niestandardowego działania kontrolki bez napisania linijki kodu? Chciałeś wszystko sobie naklikać w Obiekt Inspektorze? Takie rzeczy to tylko w erze.

0

@elTwardy - jeśli koniecznie potrzebujesz zmienić funkcjonalność tego komponentu, to zbuduj swój komponent na bazie tego istniejącego; Przyjrzyj się dokładniej chronionej metodzie ApplyChanges i usuń z niej pętlę przeszukującą Parent pod kątem innych komponentów tej samej klasy; Sprawdź też co jeszcze trzeba zmienić, aby działało tak, jak tego chcesz.

2

Jeśli koniecznie się uparłeś tak zrobić, to może zrób Buttona do wpisywania tekstu, zakładki w roli buttonów, a richedit w roli comboboksa.

I będą wszyscy szczęśliwi, a program będzie tak intuicyjny że hej.

Tylko że to się wtedy nazywa „gra przygodowa”.

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