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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2019, 11:54   #1
Pervozurg
 
Регистрация: 08.11.2018
Сообщений: 7
По умолчанию В модальной форме не могу изменить заголовок окна

Есть форма, которую я запускаю в модальном режиме. В тексте пишу
Form10.Caption:='Ввод данных';
а название не меняется. Почему?

А если пишу
If Form10.Active then Label1.Caption:='Активно';
вообще выдаёт ошибку "Active Inaccessible value ..."

Последний раз редактировалось Pervozurg; 31.01.2019 в 12:17.
Pervozurg вне форума Ответить с цитированием
Старый 31.01.2019, 11:56   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А где пишешь? Код
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.01.2019, 12:35   #3
Pervozurg
 
Регистрация: 08.11.2018
Сообщений: 7
По умолчанию

Delphi 7
Пока не перевёл в модальные всё работало
Переводил по причине необходимость пробрасывать входные данные в другие формы и получать от них результат.
Нашёл http://www.delphisources.ru/pages/fa...s_to_form.html такой вариант, но пошли проблемы с работой уже отлаженных форм.
В окне переменных при отладке Form10.Active выдаёт Inaccessible value естественно при активной Form10. Родительская Form1 выдаёт как положено Form1.Active - True естественно при активной Form1.

Последний раз редактировалось Pervozurg; 31.01.2019 в 12:50.
Pervozurg вне форума Ответить с цитированием
Старый 31.01.2019, 13:44   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Form10.Caption:='Ввод данных';
а название не меняется. Почему?
Цитата:
Пока не перевёл в модальные всё работало
Цитата:
Весь фокус в том что код после ShowModal будет работать только ПОСЛЕ показа и после закрытия.
http://www.programmersforum.ru/showt...ight=showmodal
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 31.01.2019, 13:51   #5
Pervozurg
 
Регистрация: 08.11.2018
Сообщений: 7
По умолчанию

При выполнении ShowModal открывается Form10. И при выполнении её кода полезли ошибки.
После ShowModal всё выполняется корректно.

Раньше она открывалась
Application.CreateForm(TForm10, Form10);
и всё нормально работало, а сейчас через ShowModal в ней происходят ошибки. Через Show она открывается, прогоняет FormCreate и сразу закрывается.

Последний раз редактировалось Pervozurg; 31.01.2019 в 14:06.
Pervozurg вне форума Ответить с цитированием
Старый 31.01.2019, 14:28   #6
Pervozurg
 
Регистрация: 08.11.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Pervozurg Посмотреть сообщение
Form10.Caption:='Ввод данных';
меняется на
Код:
Caption:='Ввод данных';
а
Цитата:
Сообщение от Pervozurg Посмотреть сообщение
If Form10.Active then Label1.Caption:='Активно';
меняется на
Код:
If Active then Label1.Caption:='Активно';
и ... всё снова работает. Почему?!!!

Предполагаю, т.к. форма открывается кодом
Код:
function ExecuteDialog(FormClass: TExecFormClass;
  var Data): Boolean;
begin
  with FormClass.Create(Application) do
  try
    SetData(Data);
    Result := ShowModal = mrOK;
    if Result then
      GetData(Data);
  finally
    Release;
  end;
end;
with и делает такую "шутку"

Последний раз редактировалось Pervozurg; 31.01.2019 в 14:55.
Pervozurg вне форума Ответить с цитированием
Старый 31.01.2019, 15:03   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
with и делает такую "шутку"
Нет. Скорее Handle окна еще не инициализировано. Обращение к Active его инициализирует
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.01.2019 в 15:06.
Аватар вне форума Ответить с цитированием
Старый 31.01.2019, 16:44   #8
Pervozurg
 
Регистрация: 08.11.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Обращение к Active его инициализирует
Пробовал. Не помогло.
Pervozurg вне форума Ответить с цитированием
Старый 31.01.2019, 16:55   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Раньше она открывалась
Application.CreateForm(TForm10, Form10);
А теперь как ?
так? (это единственный приведенный код).
Код:
 with FormClass.Create(Application) do
и где здесь задание Form10?
тода уж
Код:
form10:=FormClass.Create(Application);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 31.01.2019 в 16:57.
evg_m вне форума Ответить с цитированием
Старый 01.02.2019, 08:57   #10
Pervozurg
 
Регистрация: 08.11.2018
Сообщений: 7
По умолчанию

В начале Form10 была обычной формой и вызывалась
Код:
Application.CreateForm(TForm10, Form10);
По мере написания кода программы встала необходимость пробрасывать в эту форму данные и получать данные в ответ.

Цитата:
Сообщение от Pervozurg Посмотреть сообщение
Нашёл http://www.delphisources.ru/pages/fa...s_to_form.html такой вариант, но пошли проблемы с работой уже отлаженных форм.
Суть данного кода в том, что создаётся новый класс TExecForm вместо TForm в классе прописываются методы SetData и GetData для обмена данными между формами. Описание класса, методов и функция ExecuteDialog в модуле ExecFrms.
Код:
unit ExecFrms;
interface
uses Forms, Controls;
type
  TExecForm = class(TForm)
  public
    procedure GetData(var Data); virtual; abstract;
    procedure SetData(var Data); virtual; abstract;
  end;
  TExecFormClass = class of TExecForm;

function ExecuteDialog(FormClass: TExecFormClass;
  var Data): Boolean;

implementation

function ExecuteDialog(FormClass: TExecFormClass;
  var Data): Boolean;
begin
  with FormClass.Create(Application) do
  try
    SetData(Data);
    Result := ShowModal = mrOK;
    if Result then
      GetData(Data);
  finally
    Release;
  end;
end;

end.
Эта функция часть подключаемого модуля. В ней новая форма вызывается модально. Я думал что дело в этом.
В тексте программы Form10 вызывается так:
Код:
if ExecuteDialog(TForm10 , Data) then
  begin
    ...
  end;
Суть проблемы заключалась в том, что в запускаемой форме перестали работать методы и свойства вызываемые
Код:
Form10.Caption:='Ввод данных';
которые до этого благополучно работали. В окне переменных Form10.Active выдавал Inaccessible value.
Решение свелось к тому, что пришлось убрать все префиксы "Form10." Новый вид кода стал таким:
Код:
Caption:='Ввод данных';
и программа снова заработала. В окне переменных Active (вместо Form10.Active) стал выдавать True.
Вот я и предполагаю что
Цитата:
Сообщение от Pervozurg Посмотреть сообщение
with и делает такую "шутку"
так как в конечном счёте Form10 вызывается строчкой
Код:
Result := ShowModal = mrOK;
которая находится внутри with . Возможно я не прав, но другого объяснения у меня нет.

Последний раз редактировалось Pervozurg; 01.02.2019 в 09:31.
Pervozurg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как при активной модальной форме разрешить доступ к другой форме Lingri1 Компоненты Delphi 14 01.03.2018 05:22
Не дать скрыться модальной форме по кнопке "Свернуть все окна" Conejo Общие вопросы Delphi 6 07.04.2016 02:22
[Delphi XE5 Android] Изменить заголовок окна MessageDlg UKRtortik Общие вопросы Delphi 6 28.05.2014 16:27
Липкое окно. Не могу изменить ширину прилипшего окна. artemavd Общие вопросы Delphi 2 23.07.2012 01:04
Изменить заголовок окна в консольном приложении interfeys Общие вопросы C/C++ 10 01.01.2011 15:24