1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23

Головоломка для начинающих "Все пять"

27.11.2015, 10:30. Показов 8361. Ответов 18
Метки нет (Все метки)

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

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

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

Помогите решить проблему пожалуйста!

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  s: Boolean;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  s:= False;
end;
 
procedure TForm1.CheckBox1Click(Sender: TObject);
  var Index, i, num: Integer;
      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 TCheckBox).Checked;
   num:= num + 1;
  if Index = 3 then
    num:= 0;
   (Controls[num] as TCheckBox).Checked:= not(Controls[num] as TCheckBox).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;  
 
end.
Вложения
Тип файла: zip Практическая работа 19-.zip (201.6 Кб, 116 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2015, 10:30
Ответы с готовыми решениями:

Игра-головоломка на знание C# / C# для начинающих
Не втыкаю, как сделать 2.02. Если кто-нибудь знает, прошу помочь. Спасибо.

В одномерном массиве все отрицательные элементы увеличить в пять раз, а все
В одномерном массиве все отрицательные элементы увеличить в пять раз, а все положительные элементы уменьшить в два раза.

Найти для каждого студента средний бал за все пять лет и год, когда бал был максимальным
Имеются сведения по студентам: студент, бал в расчете на одного человека за каждый год из последних 5-ти лет. Найти для каждого студента...

18
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.11.2015, 10:43
Цитата Сообщение от grave1blade Посмотреть сообщение
По нажатию на 2-5 CheckBox ошибок не выдает
хотел надурить нас? не выдает, потому что к ним не привязаны обработчики нажатия
0
1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23
27.11.2015, 10:48  [ТС]
Да сделал обработчик события через Events и добавил на все CheckBox. Теперь выдает ошибку при выборе любого CheckBox'a.
Ошибка:
List index out of bounds (1636035).
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.11.2015, 10:56
сейчас сделаю правильно...
0
1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23
27.11.2015, 11:08  [ТС]
Я пробовал не ссылаться на первую процедуру, а прописать для каждого, но также error
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.11.2015, 11:10
Лучший ответ Сообщение было отмечено grave1blade как решение

Решение

непонятна конечная цель. если нужно установить все пять флажков, то этого невозможно достичь при заланных условиях. протестируй экзешник, так нужно?
Вложения
Тип файла: zip Project1.zip (544.3 Кб, 279 просмотров)
1
1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23
27.11.2015, 11:17  [ТС]
Да именно! Только не выдается что победа и не идет счет. Думаю что это поправить смогу самостоятельно. В чём была моя ошибка?
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.11.2015, 11:20
Лучший ответ Сообщение было отмечено grave1blade как решение

Решение

Цитата Сообщение от grave1blade Посмотреть сообщение
Только не выдается что победа и не идет счет
потому что я не сделал, ибо непонятен алгоритм подсчета и определения "победы".
Цитата Сообщение от grave1blade Посмотреть сообщение
В чём была моя ошибка?
не знаю, я код переделал
скажу сразу, код топорный, "по быстрячку". единственный плюс - высокая наглядность за счет использования массива флажков
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    procedure FormShow(Sender: TObject);
    procedure CheckBoxesClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  cb: array[0..4] of TCheckBox;  // массив флажков
  // также установить свойство Tag каждого флажка равным индексу
  manualClick: boolean = true;
 
implementation
 
{$R *.dfm}
 
// процедура навешена на все флажки
procedure TForm1.CheckBoxesClick(Sender: TObject);
var
  i,f: byte;
begin
  if not manualClick then Exit;  // проверка, чтобы щелчок был мышью,
  // во избежание срабатывания события при программной установке флажка
  manualClick:= false;
  // выполнится только в том случае, если свойство Enabled = true
  // при установке флажка свойство Enabled присваивается false,
  // при сбросе = true
  with TCheckBox(Sender) do
  begin
    Enabled:= false;
    f:= Tag;    // читаю индекс флажка, на котором произошло событие
    // НЕ ЗАБЫТЬ УСТАНОВИТЬ ТЭГИ ДЛЯ ВСЕХ ФЛАЖКОВ!!!!
    for i:= 0 to 1 do
    // вычисление индексов следующих двух флажков и обработка их состояния
    begin
      Inc(f);
      if f > 4 then f:= 0;
      cb[f].Checked:= not cb[f].Checked;
      cb[f].Enabled:= not cb[f].Enabled;
    end;
  end;
  manualClick:= true;
end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
  cb[0]:= CheckBox1;
  cb[1]:= CheckBox2;
  cb[2]:= CheckBox3;
  cb[3]:= CheckBox4;
  cb[4]:= CheckBox5;
end;
 
end.
1
1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23
27.11.2015, 11:50  [ТС]
Спасибо большое!

Добавлено через 27 минут
Что-то не могу понять почему ошибка выскакивает
[cut
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.11.2015, 11:52
grave1blade, картинки на форум загружай.
0
1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23
27.11.2015, 11:55  [ТС]
Правильно надеюсь?
Миниатюры
Головоломка для начинающих "Все пять"  
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.11.2015, 11:56
это сделал?
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.FormShow(Sender: TObject);
begin
  cb[0]:= CheckBox1;
  cb[1]:= CheckBox2;
  cb[2]:= CheckBox3;
  cb[3]:= CheckBox4;
  cb[4]:= CheckBox5;
end;
0
1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23
27.11.2015, 11:59  [ТС]
да сделал, тэги добавил от 0-4 на чекбоксы
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.11.2015, 12:12
ну не знаю. проверяй все внимательно

Добавлено через 27 секунд
Цитата Сообщение от grave1blade Посмотреть сообщение
тэги добавил
а массив заполнил?
0
1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23
27.11.2015, 12:20  [ТС]
Delphi
1
2
3
4
var
  Form1: TForm1;
  cb: array[0..4] of TCheckBox;
  manualClick: boolean = true;
если вот это, то да
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.11.2015, 12:54
вот ты непонятливый. это ОБЪЯВЛЕНИЕ массива. ты его ЗАПОЛНИЛ? присвоил его элементам ссылки на чекбоксы в событии OnShow?
1
1 / 1 / 0
Регистрация: 20.10.2015
Сообщений: 23
27.11.2015, 13:20  [ТС]
Сорян) сразу не дошло что на форме нужно было ссылаться, спасибо! все работает
0
0 / 0 / 0
Регистрация: 13.03.2020
Сообщений: 3
13.03.2020, 13:16
можно посмотреть как написан у вас
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
13.03.2020, 13:26
Рабочий код в посте #8. Смотри
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2020, 13:26
Помогаю со студенческими работами здесь

как ввести readln(f,u) для 30 чисел чтобы не вставлять 30 строк. И как вывести в мемо все числа в 2 столбика по пять?
у меня файл с температурой за месяц (30 отсчётов) и вывести в мемо все числа в 2 столбика по пять. как сделать чтобы можно было readln...

ГоЛоволомка с косяком библиотеки RFID для RC522 (для проффесионалов)
Есть RFID RC522 решил ее покаыварять на стабильность работы. Все подключил все с виду работает. Карты читает, пишет...все с виду хорошо, и...

Все отрицательные элементы массива увеличить в пять раз, все положительные элементы уменьшить в два раза
1 Ввести одномерный массив поэлементно с помощью клавиатуры или получить его, используя генератор случайных чисел. Одномерный массив может...

В одномерном массиве все отрицательные элементы увеличить в пять раз, а все положительные элементы уменьшить в два раза.
В одномерном массиве все отрицательные элементы увеличить в пять раз, а все положительные элементы уменьшить в два раза. спасибо.

В одномерном массиве все отрицательные элементы увеличить в пять раз, а все положительные элементы уменьшить в два раза
В одномерном массиве все отрицательные элементы увеличить в пять раз, а все положительные элементы уменьшить в два раза


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru