Arkadaşlar
Örneğin 5 adet CheckBox'tan herhangi iki tanesi seçildiğinde seçilmeyen 3 tenesinin False olmasını nasıl sağlayabilirim?
İlginize şimdiden teşekkürler
Belli Sayıda CheckBox Seçince Diğerleri False
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
bu işini görür sanırım
Kod: Tümünü seç
var
Form1: TForm1;
a:array [1..3] of integer;
degisiyor:Boolean;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
a[1]:=-1;
a[2]:=-1;
a[3]:=-1;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
var i,z:byte;
begin
if degisiyor then exit;
degisiyor:=True;
for i:=1 to 3 do
if a[i]=-1 then break;
if i>3 Then
Begin
// daha önce işaretlimi değilmi ?
for z:=1 to 3 do
if (Sender as TCheckBox).ComponentIndex=a[z] then break;
if z<4 then
a[z]:=-1
else
Begin
(Form1.Components[a[1]] as TCheckBox).Checked:=False;
a[1]:=a[2];
a[2]:=a[3];
a[3]:=(Sender as TCheckBox).ComponentIndex;
End;
End
else
a[i]:=(Sender as TCheckBox).ComponentIndex;
degisiyor:=false;
end;
Merhaba...
- @cuneyt22, yaklaşım güzel... Her check sonrası yeni bir checkbox denetimi serbest bırakılır şeklinde anladım ama seçenek sıralı olacağından kullanıcıyı kısıtlar...
- @onselder, yaklaşım doğru fakat uyarıdan önce o checkbox da işaretlenmiş olur. Ek bir operasyonla check'i kaldırman lazım.
- @ovural, yaklaşımın güzel, 3 sayacını geçtiğin işaretleniyor, ilk işaretlenenin işareti kaldırılıyor.
- Başka bir bakış açısı ile örneklemek ve bir konuyu açıklamak istedim... Bu konu CONST ifadesinin işlevi hakkında...
- Const ifadesinin anlamı Constant yani sabittir. Sabit demek ilk bakışta değişmez demek gibi bir anlam doğuruyor ama aslında her zaman ilk değer verildiğine işarettir.
- Biz şu opsiyonumuzu kullandık. Procedure ilk çalıştığı zaman ilk değer alacak ama bir sonraki seferlerde, ilk değer alımı yapılmayıp, en son bırakılan değeri kullanmasını sağlıycaz... En son değeri sabitliycez...
- Bu işlem için hangi değişken(leri) kullanmak istersek onu {$J..} ile blokluyoruz...
- Bu sayede bu procedure her çalıştığında eski değeri korunmuş oluyor. Yani sabit demek, eski değeri koruma (sabitleme) anlamında sabit. Daha fazla kafa karıştırmayayım, koda geçeyim...
- Burada bir sayacımız var. Bunu sabitleyip ilk değer olarak 0 veriyoruz. Eğer varsayılan kadar CheckBox'un işaretliyse o sayıyı ilk değer olarak vermelisin. Yani program çalıştığında 3 tane işaretli ise bu sayaca 3 ver ki iş görsün.
- Kontrol edeceğin ilk CheckBox'un OnClick olayına aşağıdakini istisnasız aynen yaz.
- Form üzerinde kontrol etmek istediğin başka kaç tane CheckBox daha varsa bunların her birinin OnClick olaylarındaki açılır liste kutusunu açıp, bu ilk oluşturduğunun (örneğin CheckBox1Click) procedure adını seç.
- Bu işlem artık otomatik kendi kendine oldu, başka kod yazmana gerek yok. Artık CheckBox sayılmayacak yapılan işlem sayılacak...
- @cuneyt22, yaklaşım güzel... Her check sonrası yeni bir checkbox denetimi serbest bırakılır şeklinde anladım ama seçenek sıralı olacağından kullanıcıyı kısıtlar...
- @onselder, yaklaşım doğru fakat uyarıdan önce o checkbox da işaretlenmiş olur. Ek bir operasyonla check'i kaldırman lazım.
- @ovural, yaklaşımın güzel, 3 sayacını geçtiğin işaretleniyor, ilk işaretlenenin işareti kaldırılıyor.
- Başka bir bakış açısı ile örneklemek ve bir konuyu açıklamak istedim... Bu konu CONST ifadesinin işlevi hakkında...
- Const ifadesinin anlamı Constant yani sabittir. Sabit demek ilk bakışta değişmez demek gibi bir anlam doğuruyor ama aslında her zaman ilk değer verildiğine işarettir.
- Biz şu opsiyonumuzu kullandık. Procedure ilk çalıştığı zaman ilk değer alacak ama bir sonraki seferlerde, ilk değer alımı yapılmayıp, en son bırakılan değeri kullanmasını sağlıycaz... En son değeri sabitliycez...
- Bu işlem için hangi değişken(leri) kullanmak istersek onu {$J..} ile blokluyoruz...
- Bu sayede bu procedure her çalıştığında eski değeri korunmuş oluyor. Yani sabit demek, eski değeri koruma (sabitleme) anlamında sabit. Daha fazla kafa karıştırmayayım, koda geçeyim...
- Burada bir sayacımız var. Bunu sabitleyip ilk değer olarak 0 veriyoruz. Eğer varsayılan kadar CheckBox'un işaretliyse o sayıyı ilk değer olarak vermelisin. Yani program çalıştığında 3 tane işaretli ise bu sayaca 3 ver ki iş görsün.
- Kontrol edeceğin ilk CheckBox'un OnClick olayına aşağıdakini istisnasız aynen yaz.
- Form üzerinde kontrol etmek istediğin başka kaç tane CheckBox daha varsa bunların her birinin OnClick olaylarındaki açılır liste kutusunu açıp, bu ilk oluşturduğunun (örneğin CheckBox1Click) procedure adını seç.
- Bu işlem artık otomatik kendi kendine oldu, başka kod yazmana gerek yok. Artık CheckBox sayılmayacak yapılan işlem sayılacak...
Kod: Tümünü seç
procedure TForm1.CheckBox1Click(Sender: TObject);
Const
{$J+} Sayac : Integer = 0; {$J-}
begin
If TCheckBox(sender).Tag = 0 then
begin
If NOT TCheckBox(sender).Checked
then Dec(Sayac)
else If Sayac = 3 then
begin
// Kendi kendini de tetikleyeceğinden
// kontrol koyduk ki, sadece kullanıcı
// Check ettiğinde değerlendirilsin...
TCheckBox(sender).Tag := 1;
TCheckBox(sender).Checked := False;
end
else Inc(Sayac);
end
else TCheckBox(sender).Tag := 0;
end;