Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 23.09.2013
Сообщений: 20

Переменная цикла в процедуре

05.04.2016, 23:11. Показов 3738. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. При написании программы возник вопрос. Допустим, что у нас есть цикл с переменной i, которая увеличивается от 1 до 10. Внутри цикла мы вызываем какую-то процедуру. Так вот, как в процедуру добавить эту переменную i, чтобы ее значение в процедуре соответствовало значению цикла!? При этом процедура не простая. Она вызывается по клику на кнопку (windows.form).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.04.2016, 23:11
Ответы с готовыми решениями:

Сделать так, чтобы в процедуре переменная *а* не меняла значение
var a:Integer ; function b (a:Integer ):Integer ; begin b:= a mod 2 end; procedure output; begin while a<>0 do ...

Переменная цикла For должна описываться в том же цикле, что и цикл for
В чём проблема? uses crt; Type Circle = record x,y,r:real; end; massiv=array of Circle; var...

Переменная цикла for должна описываться в том же блоке, что и цикл for
всем доброго времени суток) у меня такая проблема на вот этой строчке for i:=1 to n-1 do выдает ошибку "Переменная цикла for...

6
 Аватар для Cyber_Monster_
148 / 129 / 155
Регистрация: 22.03.2016
Сообщений: 502
05.04.2016, 23:14
Либо надо добавить ее в параметр подпрограммы, либо вызывайте, как глобальную переменную.
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
05.04.2016, 23:18
Цитата Сообщение от Zerrox Посмотреть сообщение
При этом процедура не простая. Она вызывается по клику на кнопку (windows.form).
Процедура отдельно вызывается или цикл с процедурой?
Pascal
1
2
3
4
5
6
7
8
9
10
...
procedure ppp(const ii:integer);
begin
...
end;
...
begin
for i:=1 to 10 do
  ppp(i);
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
05.04.2016, 23:22
Цитата Сообщение от capricornus CF Посмотреть сообщение
Процедура отдельно вызывается
Имеется в виду, что заголовок процедуры обработчика строго задан, и менять его нельзя.

Настораживает другое: почему обработчик нажатия на кнопку вызывается в цикле, а не сделано как положено: вынести нужную обработку в дополнительный метод, и из обработчика нажатия вызывать этот метод, а там, где нужно напрямую - вызывать напрямую. В таком случае заголовок доп. метода не будет фиксированным, и туда можно будет передать параметр.
1
0 / 0 / 0
Регистрация: 23.09.2013
Сообщений: 20
06.04.2016, 11:39  [ТС]
Итак. Сначала следует сказать, что это моя первая "настоящая" программа, так что я не сильно во всем понимаю (но надо же с чнгото начинать...). Есть массив из textbox-ов. Параметры каждого бокса (положение на форме, размер и т. Д.) Задаются в цикле, так как количество боксов на форме меняется в зависимости от заданных с клавиатуры переменных. Количество форм также задается, поэтому все это происходит еще в одном цикле. На каждой форме есть определенное количество боксов, которые надо заполнить, нажать на кнопку и форма закроется. Данные из боксов сохранятся. Цикл форм пойдет дальше, и откроется новая форма. При этом все данные из боксов необходимо записать. Для каждой формы используется один и тот же массив боксов. Поэтому при следующем шаге цикла массив перезаписывается. Все сохранения данных необходимо произвести в процедуре, которая закрывает текущую форму. Такова моя логика. Можете предложить другой способ. Это не принципиально... Попытаюсь добавить код программы.

Добавлено через 18 минут
Pascal
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
73
74
75
76
77
78
79
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
Program Math;
Uses System, System.Windows.Forms, System.Drawing;
Var AForm : Array [1..14] of Form;
       SS, TS : Integer;
       Mg : Array [1..15] of Button;
       Mv : Array [2..15] of Button;
       SaveK : Array [1..14] of String;
       SaveA : Array [1..14] of String;
       W : Array [1..14,1..14] of TextBox;
       ANextButton : Button;
       
Procedure ANext(sender: System.Object; e: System.EventArgs);
Begin
  ((sender as Button).Parent as Form).Close;
End;
       
Begin
  Readln(TS);
  For var i := 1 to TS do Readln(SaveA[i]);
  Writeln('--------------------------');
  Readln(SS);
  For var i := 1 to SS do Readln(SaveK[i]);
  For var i := 1 to SS do
  Begin
    AForm[i] := new Form;
    AForm[i].Text := '';
    AForm[i].ShowIcon := false;
    AForm[i].MaximizeBox := false;
    AForm[i].ClientSize  := New System.Drawing.Size(44 * (TS + 1),(44 * (TS + 1)) + 22);
    AForm[i].StartPosition := System.Windows.Forms.FormStartPosition.CenterScreen;
    For var i1 := 1 to TS+1 do 
    Begin
      Mg[i1] := new Button;
      Mg[i1].Width := 44;
      Mg[i1].Height := 44;
      Mg[i1].Left := 44 * (i1 - 1);
      Mg[i1].Top := 0;
      Mg[i1].BackColor := System.Drawing.SystemColors.GradientActiveCaption;
      Mg[1].Text := SaveK[i];
      If i1 > 1 then Mg[i1].Text := SaveA[i1 - 1];
      AForm[i].Controls.Add(Mg[i1]);
    End;
    For var i1 := 2 to TS+1 do 
    Begin
      Mv[i1] := new Button;
      Mv[i1].Width := 44;
      Mv[i1].Height := 44;
      Mv[i1].Left := 0;
      Mv[i1].Top := 44 * (i1 - 1);
      Mv[i1].BackColor := System.Drawing.SystemColors.GradientActiveCaption;
      Mv[i1].Text := SaveA[i1-1];
      AForm[i].Controls.Add(Mv[i1]);
    End;
    For var i1 := 1 to TS do For var i2 := 1 to TS do
    Begin
      W[i1,i2] := new TextBox;
      W[i1,i2].Font := new System.Drawing.Font('Times New Roman', 24, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
      W[i1,i2].Width := 44;
      W[i1,i2].Height := 44;
      If i1 = i2 then W[i1,i2].Text := '1';
      W[i1,i2].Top := 44 * i1;
      W[i1,i2].Left := 44 * i2;
      W[i1,i2].TextAlign := System.Windows.Forms.HorizontalAlignment.Center;
      AForm[i].Controls.Add(W[i1,i2]);
    End;
    ANextButton := new Button;
    ANextButton.Width := 44 * (TS + 1);
    ANextButton.Left := 0;
    ANextButton.Top := 44 * (TS + 1);
    ANextButton.Font := New System.Drawing.Font('Times New Roman', 11, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
    ANextButton.Text := 'Продолжить';
    ANextButton.Click += ANext;
    AForm[i].Controls.Add(ANextButton);
    Application.Run(AForm[i]);
  End;
End.
Если можете, покажите, как сохранить данные в переменную. Интересно как сделаете это вы. Скажите также можно ли сделать кубический массив? Я не пробовал конечно...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
06.04.2016, 14:12
Ну и где тут связь с изначальным вопросом? Что нужно передать в обработчик нажатия-то?

Добавлено через 51 секунду
Цитата Сообщение от Zerrox Посмотреть сообщение
как сохранить данные в переменную
Какие данные и в какую переменную? Попонятнее объяснить никак нельзя?
1
0 / 0 / 0
Регистрация: 23.09.2013
Сообщений: 20
06.04.2016, 15:49  [ТС]
Кликните здесь для просмотра всего текста
Вопрос не один.
Главный: У нас есть цикл с переменной i и массив форм. Они связаны (параметры очередной формы (положение, текст, а также все размещённые на форме кнопки и текстбоксы) задаются в следующем шаге цикла). В каждой форме есть одна и та же кнопка ANextButton, которая отвечает за закрытие открытой формы. Она активируется по клику. Для это существует строка: ANextButton.Click += ANext. Вот так работает программа.

Следующий шаг состоит в том, чтобы сохранить все введённые значения. Это можно сделать только в процедуре (в будущем будет добавлено ограничение: если во всех текстбоксах есть текст, то вызывается процедура ANextButton.Click += ANext.). Для этого я хочу дописать процедуру вот так:
Pascal
1
2
3
4
5
Procedure ANext(sender: System.Object; e: System.EventArgs);
Begin
  For var i1 := 1 to TS do For var i2 := 1 to TS do Ach[i,i1,i2] := W[i1,i2].Text;
  ((sender as Button).Parent as Form).Close;
End;
Здесь у Ach есть переменная i. Значение этой переменной должно соответствовать значению шага цикла (Если переменная изменяется от 1 до 10, и в данный момент её значение равно 3, то в процедуре она также должна быть равна 3). Тогда по идее, всё должно получиться =)

Второй вопрос: можно ли вообще использовать массив с 3-я переменными (Ach[i,i1,i2])...

Если же нельзя, то подскажите как это сделать по другому...

Вроде бы всё. Если что-то не понятно - спрашивайте.

Добавлено через 6 минут
Цитата Сообщение от volvo Посмотреть сообщение
Что нужно передать в обработчик нажатия-то?
Значение переменной цикла - i.
Цитата Сообщение от volvo Посмотреть сообщение
Какие данные и в какую переменную?
Данные массива W[i1,i2].Text в строковый массив Ach[i,i1,i2].


Добавлено через 30 минут
Мда... Бывает и такое... Задал i, как глобальную переменную, дописал в процедуре:
Pascal
1
For var i1 := 1 to TS do For var i2 := 1 to TS do Ach[i,i1,i2] := W[i1,i2].Text;
Вот и всё. Спасибо, volvo, что заставил меня подумать. Это собственно и требовалось =)

Возможно, при написании этой программы, я снова где-нибудь запутаюсь, но зато буду знать, что мне всегда здесь помогут.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2016, 15:49
Помогаю со студенческими работами здесь

Выдает ошибку :Переменная цикла for должна описываться в том же блоке, что и цикл for
program Ford_Bellman; uses crt; const inf=100000; Vmax=1000; Emax=Vmax*(Vmax-1) div 2; type Edges=record u, v, w: integer; ...

Переменная моего типа не видна в процедуре
Type goods=record department, number, price:integer; nameTag:string; end; fileOfGoods = file of goods; var...

Переменная S в процедуре не меняет значения
Ввел вот такую простейшую прогочку Var A:integer; S:string; Procedure Chainsaw (S:string); Var A:integer; Begin ...

Переменная не известна в созданной процедуре(
Доброго времени суток! Помогите ,пожалуйста, кто может! опыта работы с классами и созданиями процедур совсем нет. был написан вот такой код...

Выход из цикла for по процедуре Break
Здравствуйте, помогите, пожалста, найти ошибку: Имеется программа просмотра файлов в Delphi, т.е. можно открыть, закрыть, сохранить...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru