Belirli Sayıda CheckBox Seçimine İzin Verme

YoRuMSuZ

Biz işimize bakalım...
Form üzerinde bir çok (Örneğin 10 adet) CheckBox bileşeni olduğunu varsayalım ve bunlardan sadece 3 tanesi seçildiğinde diğerlerinin seçilmesinin önüne geçelim. (Seçeneğe bağlı raporlama işlemlerinde çok işe yarayan bir özellik)

1. Yöntem:​

3 adet ChecBox seçilince "En çok 3 alan seçebilirsiniz!" şeklinde uyarı versin ve daha fazla seçim yapılmasının önüne geçilsin.

CheckBox1 OnClick yordamına şu kodları ekleyin.

Kod:
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 TCheckBox(Sender).Tag := 1;
  TCheckBox(Sender).Checked := False;
  ShowMessage('En çok 3 alan seçebilirsiniz!');
end
else
  Inc(Sayac);
end
else
  TCheckBox(Sender).Tag := 0;
end;

Daha sonra bu kodu diğer ChecBox bileşenlerinin OnClik yordamlarını "CheckBox1Click" olarak işaretleyin.

Kodları ekledikten sonra form üzerindeki CheckBox bileşenlerine tıkladığınızda 3'ten fazla seçim yapmanızın önüne geçilecektir.

checkbox-secimi.webp
 

2. Yöntem​

Yine üstteki gibi en çok 3 alan seçimine izin verilecek ancak bu kez uyarı yerine diğer ChecBox'ların Enabled özellikleri False olarak görüntülenecek.

CheckBox1 OnClick yordamına şu kodları ekleyi ve yukarıdaki kodları uyguladığımız gibi diğer ChecBox bileşenlerinin OnClik yordamlarını "CheckBox1Click" olarak işaretleyin.

Kod:
procedure TForm1.CheckBox1Click(Sender: TObject);
Const
{$J+} Sayac: Integer = 0; {$J-}
begin
  If TCheckBox(Sender).Checked then
  begin
    Inc(Sayac);
    if Sayac = 3 then
    begin
      // Tüm checkbox'ları kontrol et
      for var i := 0 to ComponentCount - 1 do
      begin
        if Components[i] is TCheckBox then
        begin
          // Seçili olmayanları devre dışı bırak
          if not TCheckBox(Components[i]).Checked then
            TCheckBox(Components[i]).Enabled := False;
        end;
      end;
    end;
  end
else // Checkbox seçimi kaldırıldığında
begin
  Dec(Sayac);
  if Sayac < 3 then
  begin
    // Tüm checkbox'ları tekrar aktif et
    for var i := 0 to ComponentCount - 1 do
    begin
      if Components[i] is TCheckBox then
        TCheckBox(Components[i]).Enabled := True;
    end;
  end;
end;
end;

checkbox-enable-false.webp
 

3. Yöntem​

Bu yöntem de 2. yöntemle aynı sonucu üretiyor. Aynı işlemleri tekrarlıyoruz.

Kod:
procedure TForm1.CheckBox1Click(Sender: TObject);
const
  MAX_SECIM = 3;
var
  Sayac, i: Integer;
  MesajGosterildi: Boolean;
begin
  Sayac := 0;
  MesajGosterildi := False;

  // Seçili CheckBox'ları say
  for i := 1 to 10 do
    if FindComponent('CheckBox' + IntToStr(i)) is TCheckBox then
      if TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Checked then
        Inc(Sayac);

  // Eğer 3 seçim yapıldıysa, diğer CheckBox'ları pasif yap
  if Sayac >= MAX_SECIM then
  begin
    for i := 1 to 10 do
      if FindComponent('CheckBox' + IntToStr(i)) is TCheckBox then
        if not TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Checked then
          TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Enabled := False;

    // Sadece ilk defa mesajı gösterelim
    if not MesajGosterildi then
    begin
      // ShowMessage('En fazla 3 seçenek seçebilirsiniz!');
      MesajGosterildi := True;
    end;
  end
  else
  begin
    // Eğer 3'ten az seçim varsa tüm checkbox'ları tekrar aktif et
    for i := 1 to 10 do
      if FindComponent('CheckBox' + IntToStr(i)) is TCheckBox then
        TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Enabled := True;
  end;
end;
 

4. Yöntem​

Bir üstteki yöntemle aynı olmasına rağmen bu kez CheckBox1 onclik yordamına yazmak yerine;

type alanına şu satırı ekleyelim: procedure CheckBoxClick(Sender: TObject);

Daha sonra forma şu kodları ekleyelim:

Kod:
procedure TForm1.CheckBoxClick(Sender: TObject);
const
  MAX_SECIM = 3;
var
  Sayac, i: Integer;
  MesajGosterildi: Boolean;
begin
  Sayac := 0;
  MesajGosterildi := False;

  // Seçili CheckBox'ları say
  for i := 1 to 10 do
    if FindComponent('CheckBox' + IntToStr(i)) is TCheckBox then
      if TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Checked then
        Inc(Sayac);

  // Eğer 3 seçim yapıldıysa, diğer CheckBox'ları pasif yap
  if Sayac >= MAX_SECIM then
  begin
    for i := 1 to 10 do
      if FindComponent('CheckBox' + IntToStr(i)) is TCheckBox then
        if not TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Checked then
          TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Enabled := False;

    // Sadece ilk defa mesajı gösterelim
    if not MesajGosterildi then
    begin
      ShowMessage('En fazla 3 seçenek seçebilirsiniz!');
      MesajGosterildi := True;
    end;
  end
  else
  begin
    // Eğer 3'ten az seçim varsa tüm checkbox'ları tekrar aktif et
    for i := 1 to 10 do
      if FindComponent('CheckBox' + IntToStr(i)) is TCheckBox then
        TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Enabled := True;
  end;
end;

Daha sonra FormCreate alanına alttaki kodları ekleyelim. Şöyle görünecek
Kod:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 1 to 10 do
    if FindComponent('CheckBox' + IntToStr(i)) is TCheckBox then
      TCheckBox(FindComponent('CheckBox' + IntToStr(i))).OnClick := CheckBoxClick;
end;

Sonuç 3. yöntemle aynı olacak...
 


Mesajınızı yazın...
Geri
Top