Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2022, 16:22   #1
Dromedeon
 
Регистрация: 09.01.2022
Сообщений: 5
Печаль delphi, игра "установи все флажки"

Суть программы:
1. После запуска программы в окне изображаются пять сброшенных флажков.
2. Щелкать разрешено только на сброшенных флажках. Щелчок на установленном флажке не действует.
3. При установке какого-то флажка меняется состояние двух следующих флажков. При этом сброшенные флажки устанавливаются, а установленные - сбрасываются.
4. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в строке заголовка.

Не могу реализовать 3 пункт. После нажатия на первый CheckBox программа вылетает с ошибкой:
List index out of bounds (1636035).

По нажатию на 2-5 CheckBox ошибок не выдает, но 3 пункт не выполняется.

Код:
unit Unit16;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm16 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form16: TForm16;

implementation

{$R *.dfm}
  var s:boolean;
procedure TForm16.CheckBox1Click(Sender: TObject);
var Index, i, num : Integer;
var e: Boolean;
begin
if s then Exit;
s := True;
for Index:=  0 to 4 do
if Sender = Controls[i] then break;
if not (Controls[Index] as TCheckBox).Checked
then (Controls[Index] as TCheckBox).Checked := True
else
begin
num := Index + 1;
if Index = 4 then num := 0;

//(Controls[num] as TCheckBox).Checked := not (Controls[num] as CheckBox1).Checked;

num := num + 1; if Index = 3 then num := 0;
//(Controls[num] as TCheckBox).Checked := not (Controls[num] as CheckBox1).checked;
end;
e := True;
for i := 0 to 4 do
e := e and (Controls[i] as TCheckBox).Checked;

if e then
for i := 0 to 4 do
begin
(Controls[i] as TCheckBox).Caption := 'Победа!';
(Controls[i] as TCheckBox).Enabled := False;
end;
s := False;
end;


procedure TForm16.FormCreate(Sender: TObject);
begin
s := False;
end;

end.

Последний раз редактировалось BDA; 09.01.2022 в 19:34. Причина: Соблюдение правил форума
Dromedeon вне форума Ответить с цитированием
Старый 09.01.2022, 21:25   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    Label1: TLabel;
    procedure CheckBox1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  checkboxes: array of TCheckBox;
  s: boolean;

implementation

{$R *.dfm}

procedure TForm1.CheckBox1Click(Sender: TObject);
var
  i: Integer;
  e: Boolean;
begin
  if s then
    Exit;
  s := True;

  if not (Sender as TCheckBox).Checked then
  begin
    (Sender as TCheckBox).Checked := True;
    s := False;
    exit;
  end;

  for i := 0 to 4 do
    if checkboxes[i] = Sender then
      Break;

  i := (i + 1) mod 5;
  checkboxes[i].Checked := not checkboxes[i].Checked;
  i := (i + 1) mod 5;
  checkboxes[i].Checked := not checkboxes[i].Checked;

  e := True;
  for i := 0 to 4 do
    e := e and checkboxes[i].Checked;

  if e then
    for i := 0 to 4 do
    begin
      checkboxes[i].Caption := 'Победа!';
      checkboxes[i].Enabled := False;
    end;

  s := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  s := False;

  SetLength(checkboxes, 5);
  checkboxes[0] := CheckBox1;
  checkboxes[1] := CheckBox2;
  checkboxes[2] := CheckBox3;
  checkboxes[3] := CheckBox4;
  checkboxes[4] := CheckBox5;
end;

end.
Не забудьте назначить обработчик CheckBox1Click на все чекбоксы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.01.2022, 08:50   #3
Dromedeon
 
Регистрация: 09.01.2022
Сообщений: 5
По умолчанию

Спасибо за помощь! Теперь программа правильно работает
Dromedeon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 2010, ADO: Флажки в колонках с логическим типом данных grh БД в Delphi 3 26.09.2014 13:12
Задача по Delphi (Буксировка и сброс объекта, флажки) marrika_snz Помощь студентам 1 04.04.2013 18:11
почему wiindows 7 флажки загрузки подтупливают goluzov Свободное общение 1 27.03.2012 02:33
Радиокпонка. флажки vesada Помощь студентам 3 12.10.2010 08:11
Флажки на весь столбец Talisman Microsoft Office Excel 12 02.01.2008 19:20