Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Famous_47
1 / 1 / 1
Регистрация: 13.11.2015
Сообщений: 59

Изменить значение переменной из другой формы

01.12.2016, 20:47. Показов 2854. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Что-то я запутался, в первой форме существует переменная ff, которая представляет собой заданное время.
При необходимом условии, по таймеру, (между заданным и текущим временем разница = 5 минут) появляется вторая форма, в которой есть кнопки, по нажатии которых происходит изменение кое-каких визуальных параметров и, самое важное, изменяться должна переменная ff, т.е. заданное время. (Всё это есть - грубо говоря, таймер отключения ПК).

Пробовал уже и include, и extern...
Без всего этого - ругается, что не знает такой переменной;
при extern переменных: Cannot covert 'AnsiString to int';
при include unit1.cpp запускается и работает, но при обработке события по нажатию кнопки на второй форме получаю ошибку Access vioalation...

В первой форме:
C++
1
2
3
hours=StrToInt(Ini->ReadString("Time selected", "Hours", 0));
mins=StrToInt(Ini->ReadString("Time selected", "Minutes", 0));
ff = FormatDateTime("h:mm",StrToDateTime(IntToStr(hours)+":"+IntToStr(mins)));
Во второй форме:
C++
1
2
3
hours=StrToInt(Form1->Label1->Caption);
mins=StrToInt(Form1->Label2->Caption);
ff = FormatDateTime("h:mm",StrToDateTime(IntToStr(hours)+":"+IntToStr(mins)));
Может ли это быть связано с тем, что вторая форма создается следующим образом?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
AnsiString minsnow = Now().FormatString("nn");
  if ((FloatToStr(MinutesBetween(ff, ss)+1)==5) && (minsnow<mins))
  {
  Form1->Timer2->Enabled=false;
  //ShowMessage("5 minutes left");
  TrayIcon1->Restore();
  Form2 = new TForm2(this);
  Form2->WindowState=wsNormal;
  Form2->ShowModal();
  delete Form2;
  }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.12.2016, 20:47
Ответы с готовыми решениями:

Изменить значение переменной другой формы
У меня есть на Form1 переменная i:=0, ка мне сделать чтобы когда я нажал на кнопку в Form2 эта переменная стала i:=1 ? Подскажите...

Как из одной формы изменить значение переменной в другой форме?
Есть несколько форм. При открытии формы 6,7 или 8, появляется вопрос с тремя вариантами ответа, и при нажатии неправильного ответа,...

Нажатием кнопки изменить значение переменной в другой форме
Есть две формы Form1 и Form2. В форме Form1 есть кнопка, в которой хранится переменная &quot;a&quot; и при нажатии на нее, появляется...

8
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
02.12.2016, 15:11
Доброго, где и как вы объявляете эту переменную?
0
 Аватар для Famous_47
1 / 1 / 1
Регистрация: 13.11.2015
Сообщений: 59
02.12.2016, 19:21  [ТС]
Как обычно, глобально в первой форме, сразу после include'ов.
C++
1
2
3
4
5
6
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma link "trayicon"
#pragma resource "*.dfm"
AnsiString ss;
AnsiString ff;
Раньше было достаточно использовать extern... Почитал по похожим темам, нашел совет типа:
Нужно объявить переменную x как член класса формы Form1 (в public), и обращаться к ней из Form2 как Form1->x.
Сделал в Unit1.h:
C++
1
2
3
4
5
6
void __fastcall Button7Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
AnsiString ff;
        __fastcall TForm1(TComponent* Owner);
};
И обращение во второй форме:
C++
1
Form1->ff = FormatDateTime("h:mm",StrToDateTime(IntToStr(hours)+":"+IntToStr(mins)));
Результат - ошибка "Access violation at address ...". Не может ли это быть связано с тем, что при создании второй формы код написан следующим образом?
C++
1
2
3
4
Form2 = new TForm2(this);
  Form2->WindowState=wsNormal;
  Form2->ShowModal();
  delete Form2;
Решил поэксперементировать с динамикой, и не уверен, правильно ли это, но правда без delete Form2; - тоже самое
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
02.12.2016, 20:37
Выложите полный код нажатия кнопки на второй форме
0
 Аватар для Famous_47
1 / 1 / 1
Регистрация: 13.11.2015
Сообщений: 59
02.12.2016, 22:16  [ТС]
C++
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
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Form1->Label2->Caption=StrToInt(Form1->Label2->Caption)+30;
 
if (StrToInt(Form1->Label2->Caption) >= 60)
{
Form1->Label1->Caption=StrToInt(Form1->Label1->Caption)+1;
Form1->Label2->Caption=fabs(60-StrToInt(Form1->Label2->Caption));
    if (StrToInt(Form1->Label2->Caption) < 10)
    {
    Form1->Label2->Caption="0"+Form1->Label2->Caption;
    }
}
  if (StrToInt(Form1->Label1->Caption) < 10)
   {
   Form1->Label1->Caption="0"+Form1->Label1->Caption;
   }
     if (StrToInt(Form1->Label1->Caption) >= 24)
     {
     Form1->UpDown1->Position=0;
     Form1->Label1->Caption="00";
     }
Form1->UpDown1->Position=StrToInt(Form1->Label1->Caption);
Form1->UpDown2->Position=StrToInt(Form1->Label2->Caption);
hours=StrToInt(Form1->Label1->Caption);
mins=StrToInt(Form1->Label2->Caption);
Form1->ff = FormatDateTime("h:mm",StrToDateTime(IntToStr(hours)+":"+IntToStr(mins)));
 
approved=1;
Form1->Timer2->Enabled=false;
Form1->Timer3->Enabled=true;
 
 if (Form1->CheckBox3->Checked==true)
 {
 Form1->TrayIcon1->Minimize();
 }
ModalResult = mrOk;
Form2->Close();
}
//---------------------------------------------------------------------------
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
02.12.2016, 22:40
Цитата Сообщение от Famous_47 Посмотреть сообщение
Form2->Close();
Поменяете на Form2 на this

Добавлено через 12 минут
и да вызывать по другому, так:
C++
1
2
3
4
  TForm2 *f= new TForm2(this);
  f->WindowState=wsNormal;
  f->ShowModal();
  delete f;
Добавлено через 40 секунд
Вы удаляли статичную форму в итоге, от этого и ошибка была.
0
 Аватар для Famous_47
1 / 1 / 1
Регистрация: 13.11.2015
Сообщений: 59
02.12.2016, 23:43  [ТС]
C++
1
2
3
4
  TForm2 *f= new TForm2(this);
  f->WindowState=wsNormal;
  f->ShowModal();
  delete f;
и в обработчике кнопки на второй форме:
C++
1
this->Close();
Всё равно та же ошибка
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
02.12.2016, 23:52
Цитата Сообщение от Dinkin Посмотреть сообщение
delete f;
Уберите это, но вместо этого в событие закрытие формы 2, напишите это

C++
1
Action = caFree;
1
 Аватар для Famous_47
1 / 1 / 1
Регистрация: 13.11.2015
Сообщений: 59
03.12.2016, 12:25  [ТС]
Тоже самое. Попробовал уйти от динамического создания второй формы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
AnsiString minsnow = Now().FormatString("nn");
Memo1->Lines->Add(mins);
Memo1->Lines->Add(minsnow);
  if ((FloatToStr(MinutesBetween(ff, ss)+1)==5) && (minsnow<mins))
  {
  Form1->Timer2->Enabled=false;
  TrayIcon1->Restore();
  Form2->WindowState=wsNormal;
  Form2->Show();
  Form2->Visible=true;
  /*TForm2 *f= new TForm2(this);
  f->WindowState=wsNormal;
  f->ShowModal();*/
  //delete f;
  }
}
и обработчик кнопки во второй форме:

C++
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
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Form1->Label2->Caption=StrToInt(Form1->Label2->Caption)+30;
if (StrToInt(Form1->Label2->Caption) >= 60)
{
Form1->Label1->Caption=StrToInt(Form1->Label1->Caption)+1;
Form1->Label2->Caption=fabs(60-StrToInt(Form1->Label2->Caption));
    if (StrToInt(Form1->Label2->Caption) < 10)
   {
   Form1->Label2->Caption="0"+Form1->Label2->Caption;
   }
}
  if (StrToInt(Form1->Label1->Caption) < 10)
   {
   Form1->Label1->Caption="0"+Form1->Label1->Caption;
   }
     if (StrToInt(Form1->Label1->Caption) >= 24)
     {
     Form1->UpDown1->Position=0;
     Form1->Label1->Caption="00";
     }
Form1->UpDown1->Position=StrToInt(Form1->Label1->Caption);
Form1->UpDown2->Position=StrToInt(Form1->Label2->Caption);
hours=StrToInt(Form1->Label1->Caption);
mins=StrToInt(Form1->Label2->Caption);
Form1->ff = FormatDateTime("h:mm",StrToDateTime(IntToStr(hours)+":"+IntToStr(mins)));
 
approved=1;
Form1->Timer2->Enabled=false;
Form1->Timer3->Enabled=true;
 
if (Form1->CheckBox3->Checked==true)
{
Form1->TrayIcon1->Minimize();
}
Form2->Visible=false;
//ModalResult = mrOk;
//this->Close();
}
При этом в project->options перевел вторую форму в auto-create forms. Ошибка с памятью всё равно осталась, видимо это не в динамическом создании/удалении ошибка?

Добавлено через 20 минут
--- Методом исключения нашел, что при попытке
C++
1
2
3
Form1->Timer1->Enabled=false;
//или
Form1->CheckBox1->Checked=false;
Появляется ошибка Access violation...

Добавлено через 6 минут
--- Кажется нашел, в чем была проблема, зачем-то когда пытался получить доступ к переменным первой формы, прописал во втором юните include "Unit1.cpp", в принципе работало но не правильно, закомментировал, получил сначала abnormal process termination, но теперь обработчики кнопок второй формы работают корректно!

Спасибо большое, прошу прощения что потратил время, на своей же глупости и невнимательности!

И еще, подскажите, пожалуйста, есть ли смысл всё-таки делать вторую форму динамической?

Добавлено через 10 минут
Вывод из всего этого: для использования переменной из первой формы во второй - достаточно использовать extern. Для того, чтобы из второй формы можно было одинаково пользоваться, изменять переменную и снова использовать ее новое значение в первой форме необходимо, как писали в похожей теме:
объявить переменную x как член класса формы Form1 (в public), и обращаться к ней из Form2 как Form1->x.
т.е. в Unit1.h объявить переменную глобально.

И не подключать include "Unit1.cpp" т.к. это безсмысленно и, как я понимаю, абсолютно не правильно.
(исправьте, если не прав)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2016, 12:25
Помогаю со студенческими работами здесь

Не передаётся значение переменной из другой формы
При нажатии кнопки должен записываться результат ответа, ответы отмечаю по радиокнопкам. if (metroRadioButton2.Checked) ...

И снова глобальная переменная в js. Как изменить значение глобальной переменной в одной функции и увидеть это значение в другой функции?
Это учебное задание. Помогите, пожалуйста, разобраться почему func1 видит какую-то новую переменную t вместо window.t? Пробовала...

Получить значение переменной одной формы в другой форме (Delphi 6)
ребят, тупая запарка.... как перенести значение x1(unit1) в x2(unit2)???

Как взять значение переменной из другой формы или другого элемента?
Как взять значение переменной из другой формы или другого элемента?

Передача значения переменной одной формы в описание переменной другой
Всем привет. Не могу найти решение проблемы. На первой форме имеется глобальная переменная kol, которая содержит в себе число. на второй...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru