С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 190
1

Инициализация и первый запуск программы

02.11.2023, 10:14. Показов 428. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста по некоторым вопросам.
Имеется вот такой код-последовательность запуска Unitov

1. Я так понял CreateForm который идет первым после Application.Initialize; считается главной формой? Пробовал менять местами формы в результате получаю что появляються другие формы, даже те что скрыты перваночально и при их закрытии закрывается приложение.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program InfoMix;
 
uses
  Vcl.Forms,
  DataModule1 in 'DataModule1.pas' {DM1: TDataModule},
  MyClasses in 'MyClasses.pas',
  Unit1 in 'Unit1.pas' {FormMain},
  Unit2 in 'Unit2.pas' {FormAuthorization},
  Unit3 in 'Unit3.pas' {FormSotrudnik};
 
{$R *.res}
 
begin
  Application.Initialize;
  Application.CreateForm(TDM1, DM1);
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TFormMain, FormMain);
  Application.CreateForm(TFormAuthorization, FormAuthorization);
  Application.CreateForm(TFormSotrudnik, FormSotrudnik);
  Application.Run;
end.
2. У меня возникла проблемка. Когда у меня возникает событие показа основной формы procedure TFormMain.FormShow(Sender: TObject); в нем я вызываю вызов формы авторизации FormAuthorization.ShowModal;.
Проблема получается потому что FormAuthorization еще не была создана, события FormAuthorization.OnCreate - еще не было.

Соответвенно я пробовал Application.CreateForm(TFormAuthorization, FormAuthorization); поставить выше Application.CreateForm(TFormMain, FormMain); но получил то что при закрытии формы авторизации закрывается вся программа.

Конечно можно FormAuthorization.ShowModal; убрать из события показа основной формы и оставить только по клику в главном меню. Но хотелось бы все же при первом запуске сразу пользователю предложить авторизоваться, чтобы он не лез в меню.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2023, 10:14
Ответы с готовыми решениями:

Первый запуск программы.
Доброго времени суток всем! При первом запуске программы заставляет выбрать путь вручную к папке с...

Первый запуск программы с БД
import pickle db_file_name='database.dat' def open_database(db_file_name=db_file_name):...

Первый запуск программы
Добрый день! имею такой код в файле Discrim.javapackage com.example.discrim; import...

Первый запуск программы
Подскажите, пожалуйста, как грамотнее реализовать первый запуск программы? У меня есть БД, в...

9
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,991
02.11.2023, 10:30 2
Цитата Сообщение от S0563506 Посмотреть сообщение
CreateForm который идет первым после Application.Initialize; считается главной формой?
Да.

Цитата Сообщение от S0563506 Посмотреть сообщение
Проблема получается потому что FormAuthorization еще не была создана, события FormAuthorization.OnCreate - еще не было.
Нет. Сначала идёт создание всех форм, затем показ главной и тех, у которых Visible = true. То есть, на событии TFormMain.FormShow(Sender: TObject); формы уже созданы.
0
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
02.11.2023, 10:48 3
Убирайте все формы, кроме главной и датамодуля, из автосоздаваемых и создавайте экземпляр нужной формы динамически в требуемый момент.
0
Злостный нарушитель
9593 / 5189 / 1182
Регистрация: 12.03.2015
Сообщений: 24,507
02.11.2023, 11:07 4
Цитата Сообщение от S0563506 Посмотреть сообщение
получаю что появляються
Цитата Сообщение от S0563506 Посмотреть сообщение
скрыты перваночально
Цитата Сообщение от S0563506 Посмотреть сообщение
в нем я вызываю вызов
Цитата Сообщение от S0563506 Посмотреть сообщение
У меня возникла проблемка. Когда у меня возникает событие показа основной формы procedure TFormMain.FormShow(Sender: TObject); в нем я вызываю вызов формы авторизации FormAuthorization.ShowModal;.
Авторизацию оформи в виде функции в модуле Unit2.pas вот так примерно:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
  FormAuthorization: TFormAuthorization;
 
function LoginUser: Boolean;
 
implementation 
 
function LoginUser: Boolean;
begin
  var dlg:= TFormAuthorization.Create(Application);
  try
    result:= dlg.ShowModal() = mrOK;
  finally
    dlg.Free();
  end;
end;
Вызывай эту функцию откуда хочешь. Форму авторизации выкинь из автосоздаваемых.
1
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
02.11.2023, 11:09 5
Цитата Сообщение от S0563506 Посмотреть сообщение
procedure TFormMain.FormShow(Sender: TObject);
Срабатывает каждый раз при отображении, например, при развороте свернутого окна. Туда что-то писать хорошо для модальных окон, которые закрываются с 2 результатами OK\отмена.

Можно окно логина или сплеш-скрин из дата-модуля показать, но потом убить. Я так делаю, т. к. у меня для коннекта к базе отображается небольшой сплеш-скрин, просто для информативности и эстетики, а потом в функции коннекта и уничтожается.

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
function TDM.Connect(Silent:Boolean=False): Boolean;
begin
FDCon.Connected:=False;
SQLConSettings.FillFireDACConnection(FDCon);
try
if not Silent then
  begin
  if not Assigned(fmConnection) then
    begin
    fmConnection:=TfmConnection.Create(Application);
    fmConnection.Caption:='Здесь задать окошку подкл. заголовок';
    end;
  fmConnection.Show;
  fmConnection.Refresh;//Обязательно, иначе не отрисует.
  end;
try
FDCon.Connected:=true;
except
if not Silent then raise;
end;
finally
Result:=FDCon.Connected;
if Assigned(fmConnection) then
  begin
  fmConnection.Hide;
  fmConnection.Free;
  fmConnection:=nil;
  end;
end;
end;
Но из onMainForm.Create проще.
0
5868 / 4596 / 1448
Регистрация: 14.04.2014
Сообщений: 20,392
Записей в блоге: 20
02.11.2023, 11:22 6
раз
https://www.cyberforum.ru/blog... g4873.html
два
https://www.cyberforum.ru/blog... g4874.html
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 190
02.11.2023, 14:12  [ТС] 7
Насчет всего того массива информации что мне тут показали, я почитаю, особенно про возврат всей инфы из окон и обработку в основной форме, но это наверное уже в другой версии программы, надо ходя бы эту до ума довести, чтобы хоть как то функциклировала.

У меня сейчас данные изменяються или добавляються в БД по нажатию кнопки "Добавить" в форме добавления сотрудника. Это несколько разгружает код основной формы т.к. весь код по обработки введенных данных и занесением его в БД находиться в тех окнах что были открыты для этого действия.


Цитата Сообщение от AzAtom Посмотреть сообщение
Нет. Сначала идёт создание всех форм, затем показ главной и тех, у которых Visible = true.
Я проверял ставя ShowMesage в событиях показа и создания форм.
Проверил еще раз. Вот текущая последовательность.

Delphi
1
2
3
4
5
6
7
8
9
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TFormMain, FormMain);
  Application.CreateForm(TDM1, DM1);
  Application.CreateForm(TFormAuthorization, FormAuthorization);
  Application.CreateForm(TFormSotrudnik, FormSotrudnik);
  Application.Run;
end.
Имеется событие показа вкладки в основной форме, эта вкладка открыта сразу же, так если событие идет перед показом основной формы, если быть более точным, ну ил совпадет с ним для простоты:

Delphi
1
2
3
4
5
procedure TFormMain.TabSotrudnikShow(Sender: TObject);
begin
  ShowMessage('2');
  DBGridCenter.DataSource := DM1.DSSotrudnik;
end;
Здесь происходит ошибка когда я пытаюсь DBGridCenter.DataSource присвоить значение DM1.DSSotrudnik потому как события создания формы ДатаМодуля еще не было.

Delphi
1
2
3
4
procedure TDM1.DataModuleCreate(Sender: TObject);
begin
  ShowMessage('1'); //Да я для этого добавил  Vcl.Dialogs но тоже самое из другими окнами к которым я пытаюсь обратиться из Show форм
end;
Ожидалось что сначала будет показано 1 потом 2.
Но по факту показано 2 потом ошибка, потом жмем продолжить, получаем сообщение 1.

Тоже самое было когда я пытался при событии показа основной формы показать форму авторизации, если проставить ShowMessage то тоже можно убедиться что событие создание формы авторизации произойдет после показа основной формы.
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
02.11.2023, 14:34 8
Цитата Сообщение от S0563506 Посмотреть сообщение
т.к. весь код по обработки введенных данных и занесением его в БД находиться в тех окнах что были открыты для этого действия.
Я тоже так делаю. По простому шаблону. В onShow формы редактирования отрабатывает Insert или Edit, кнопка OK вызывает функцию Save с нужным набором возможных возвратов, в ней Post, кнопка Отмены Close. В onFormClose DataSet.Cancel

В public поля формы главная форма писать может.

Схема видимости. fmMain<->DataModule (взаимная видимость нужна иногда, либо надо из него убирать всё, что может дергать UI главной формы, например, отобразить на главной форме, число записей БД, после операции с датасетом но тогда смысл дата-модуля во многом пропадает) Common.pas видят все, кому надо, он никого, DataModule видят все, кому надо работать с БД, fmMain, как вызывающая прочие формы, видит их все, они ее не видят. Остальные .pas, если они есть, видны только тем, кому положено.

В главной форме акшены редактирования могут выглядеть как-то так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TfmMain.acNewExecute(Sender: TObject);
begin
Edit(mdNew);
end;
 
procedure TfmMain.acEditExecute(Sender: TObject);
begin
Edit(mdEdit);
end;
 
procedure TfmMain.Edit(Mode: Integer);
begin
if not Assigned(fmEdit) then fmEdit:=TfmEdit.Create(Application);
fmEdit.Mode:=Mode;
fmEdit.ShowModal;
//Тут можно что-то взять из fmEdit, если нужно. Или иные действия выполнить
end;
0
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,991
02.11.2023, 14:36 9
Цитата Сообщение от S0563506 Посмотреть сообщение
Ожидалось что сначала будет показано 1 потом 2.
Но по факту показано 2 потом ошибка, потом жмем продолжить, получаем сообщение 1.
Сделай у главной формы Visible = false и попробуй.


Проверка порядка событий
Беру 2 формы. Form1 главная. У Form1.Visible = false;, а у Form2.Visible = true;. Тогда, события идут так:
Form1 Create
Form2 Create
Form2 Show
Form1 Show.

Теперь у обоих форм Visible = true. Тогда события идут так:
Form1 Create
Form1 Show
Form2 Create
Form2 Show.
0
пофигист широкого профиля
4753 / 3190 / 860
Регистрация: 15.07.2013
Сообщений: 18,475
02.11.2023, 14:38 10
Цитата Сообщение от S0563506 Посмотреть сообщение
потому как события создания формы ДатаМодуля еще не было.
Датамодуль можно создавать самым первым. Он главной формой не станет.
1
02.11.2023, 14:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2023, 14:38
Помогаю со студенческими работами здесь

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

Инициализация и запуск операционной системы.
Задания: 1. Дана матрица MхN. Найти сумму элементов каждой строки; найти минимальный элемент в...

Запуск студией и запуск самой виндой. Разница работы программы
Итак, проблема такова: есть проект, который замечательно работает при нажатии F5 в студии. При...

Инициализация программы
Pl/sql developer. Имеется скрипт, не сложный(чистое заполнение бд), но очень объемный(330т. строк...

Первый запуск.
Есть плата stm32F401c-disco. Скачал с сайта ST STM32F401-Dyscovery_FW_V1.0.0. Вроде как это...

Первый запуск
Еле скомпилировал приложение (тестовый вариант...) Кнопка, при нажатии выводит сообщение: &quot;Привет...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru