Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.27;
Скачать: CL | DM;

Вниз

Где написать код, чтобы он выполнился после загрузки программы   Найти похожие ветки 

 
alex-drob   (2008-06-03 02:44) [0]

Просле загрузки программы нужно проверить введены настройки или нет, есле при onCreate главной формы, то нельзя вызвать сразу другую с настройками! Как сделать? Я думал писать это в onCreate формы которая будет последняя грузиться, но тогда главная форма будет отображаться до  считывания настроек. Как вобще это обычно делают?


 
engine ©   (2008-06-03 02:50) [1]

А вы сразу все формы создаете?
Можно в dpr проекта всё проверить, создать форму с настройками, показать её, после выполнения настроек, показать главную форму и т.д.


 
alex-drob   (2008-06-03 02:55) [2]

Не сразу, но просто хотелось узнать как обычно делают. Я просто только начал писать програму и по этому не хотелось бы потом весь код переписыват!
А можно при создании главной формы, если настроек нет, то создать другую форму прям в onCreate главной формы?


 
engine ©   (2008-06-03 02:57) [3]

Создавай )


 
alex-drob   (2008-06-03 02:58) [4]

Ну я спрашиваю потому, что както что то такое делал, сразу всё работало, а потом при закрытии формы с настройками AV вылетать стала


 
engine ©   (2008-06-03 03:03) [5]

Ну и чё? Нашел ошибку?


 
alex-drob   (2008-06-03 03:16) [6]

нет! я просто выкинул всё из oncreate и поменял порядок загрузки форм, первая создавалась с настройками, а потом главная!


 
Германн ©   (2008-06-03 03:22) [7]


> Где написать код, чтобы он выполнился после загрузки программы
>
> alex-drob   (03.06.08 02:44)
>
> Просле загрузки программы нужно проверить введены настройки
> или нет, есле при onCreate главной формы, то нельзя вызвать
> сразу другую с настройками! Как сделать?

Сразу хотел сказать, что пить надо меньше!
Не. Скорее надо меньше курить.


 
^-k2-^ ©   (2008-06-03 03:34) [8]

удобнее настройки завернуть в класс с методом считывания из внешнего файла, класс создавать до форм, ну и так далее
"по-моему так"


 
KSergey ©   (2008-06-03 07:10) [9]

Да тут уж не до классов.... тут бы форму создать...

> alex-drob   (03.06.08 02:44)  
> есле при onCreate главной формы, то нельзя вызвать
> сразу другую с настройками!

Не правда.
По поводу AV - ищите ошибку в программе.


 
uw ©   (2008-06-03 07:41) [10]

 TMainForm = class(TForm)
 private
 public
   constructor Create(AOwner: TComponent); override;
 end;
...
constructor TMainForm.Create(AOwner: TComponent);
begin
 TryToDoWhatYouWant;
 inherited;
end;


 
AndreyV ©   (2008-06-03 09:44) [11]

Ещё можно послать сообщение из конструктора главной формы самому себе и обработать его уже после всех инициализаций.


 
^-k2-^ ©   (2008-06-03 11:49) [12]

KSergey ©   (03.06.08 07:10) [9]
форма тоже класс :) только страшнее :о)


 
KSergey ©   (2008-06-03 12:00) [13]

> ^-k2-^ ©   (03.06.08 11:49) [12]
> KSergey ©   (03.06.08 07:10) [9]
> форма тоже класс :) только страшнее :о)

Я понимаю, только оно как-то это... само по себе хотя бы как-то возникает :)


 
андр.   (2008-06-04 08:22) [14]


> alex-drob   (03.06.08 03:16) [6]

Главная как раз токи та, которая создается первой.


 
андр.   (2008-06-04 08:30) [15]


> uw ©   (03.06.08 07:41) [10]
>  TMainForm = class(TForm)
>  private
>  public
>    constructor Create(AOwner: TComponent); override;
>  end;
> ...
> constructor TMainForm.Create(AOwner: TComponent);
> begin
>  TryToDoWhatYouWant;
>  inherited;
> end;


Может ты хотел сказать:

> constructor TMainForm.Create(AOwner: TComponent);
> begin
>  inherited Create(AOwner);
>  TryToDoWhatYouWant;
> end;


?


 
brother ©   (2008-06-04 12:12) [16]


> > constructor TMainForm.Create(AOwner: TComponent);> begin>
>  inherited Create(AOwner);>  TryToDoWhatYouWant;> end;

нет именно до создания формы...

> constructor TMainForm.Create(AOwner: TComponent);begin  TryToDoWhatYouWant;
>   inherited;end;


 
андр.   (2008-06-04 12:15) [17]


> brother ©   (04.06.08 12:12) [16]

Ну как ты можеш использовать метод(ы) TryToDoWhatYouWant объекта если ты его еще не создал, а вернее перекрыл метод создания своим методом.

Помоему всеже:

> constructor TMainForm.Create(AOwner: TComponent);begin  TryToDoWhatYouWant;
>   inherited;end;


Будет ошибка...


 
uw ©   (2008-06-05 00:18) [18]

андр.   (04.06.08 08:30) [15]
Может ты хотел сказать:

Нет, именно так, как я написал. Метод TryToDoWhatYouWant может быть даже виртуальным. Это в C++ проблемы, а в Delphi все в порядке.


 
Юрий Зотов ©   (2008-06-05 10:40) [19]

> uw ©   (05.06.08 00:18) [18]

Метод TryToDoWhatYouWant выполняется ДО загрузки DFM. Если в нем есть настройки формы, то при последующей загрузке DFM эти настройки могут полететь. Если в нем нужны обращения к компонентам формы, то их еще не существует.

Если же вызвать метод TryToDoWhatYouWant ПОСЛЕ inherited (то есть, ПОСЛЕ загрузки DFM), то в нем можно делать любые настройки (которые уже не полетят) и можно обращаться к компонентам формы. С другой стороны, форма при этом еще не видна, поэтому в методе TryToDoWhatYouWant можно создать и модально показать ту самую настроечную форму, о которой мечтает автор.

Что же лучше?


 
андр.   (2008-06-05 13:01) [20]


> Юрий Зотов ©   (05.06.08 10:40) [19]

Верно ! Согласен...


 
uw ©   (2008-06-05 13:09) [21]

Юрий Зотов ©   (05.06.08 10:40) [19]

Все так. Я как-то не въехал, что речь идет о форме настроек. Почудилось, что настройки нужно откуда-то загрузить до события OnCreate.


 
uw ©   (2008-06-05 13:14) [22]

Впрочем, в каком порядке ни вызывай - все равно получится до события OnCreate :-)


 
Тын-Дын ©   (2008-06-05 14:16) [23]


> alex-drob   (03.06.08 02:44)  
> Просле загрузки программы нужно проверить введены настройки
> или нет


Что ты понимаешь под загрузкой программы?
После загрузки главной формы программа может ещё продолжать загружаться. Например, может идти подключение к БД, чтение отттуда и пр.


 
Тын-Дын ©   (2008-06-05 14:27) [24]

Вот вариант:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   Finit: Boolean;
   { Private declarations }
 public
   procedure Idle(Sender: Tobject; var Done: Boolean);
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 FInit := True;
 Application.OnIdle := Idle;
end;

procedure TForm1.Idle(Sender: Tobject; var Done: Boolean);
begin
 if FInit then
 begin
   MessageBox(0,"ok","ok",MB_OK);
   Finit := False;
 end;
end;

end.


 
KSergey ©   (2008-06-05 14:52) [25]

> Тын-Дын ©   (05.06.08 14:27) [24]

Держите меня семеро....


 
KSergey ©   (2008-06-05 14:53) [26]

> Тын-Дын ©   (05.06.08 14:27) [24]

А попроще - никак?


 
Тын-Дын ©   (2008-06-05 14:56) [27]


> KSergey ©   (05.06.08 14:52) [25]
> > Тын-Дын ©   (05.06.08 14:27) [24]
>
> Держите меня семеро....


Что тебя так удивляет?


> KSergey ©   (05.06.08 14:53) [26]
> > Тын-Дын ©   (05.06.08 14:27) [24]
>
> А попроще - никак?


Попроще по сравнению с чем?


 
MsGuns ©   (2008-06-05 15:22) [28]

>Попроще по сравнению с чем?

По сравнению с "простым" OnCreate или OnShow  (с флажком дабы только один раз) главной формы если надо поднять настройки для всех автосоздаваемых модулей.


 
Тын-Дын ©   (2008-06-05 16:15) [29]


> MsGuns ©   (05.06.08 15:22) [28]
> >Попроще по сравнению с чем?
>
> По сравнению с "простым" OnCreate или OnShow  (с флажком
> дабы только один раз) главной формы если надо поднять настройки
> для всех автосоздаваемых модулей.


OnShow вроде подходит. Просто OnIdle имеет ещё некоторые полезные свойства.


 
uw ©   (2008-06-07 23:54) [30]

андр.   (05.06.08 13:01) [20]
> Юрий Зотов ©   (05.06.08 10:40) [19]
Верно ! Согласен...


Все-таки я приведу пример, а то могут сформироваться предрассудки :-)

Предположим, что мы хотим, чтобы пользователь зарегистрировался (или аутентифицировался) до появления главной формы. Если регистрация проходит успешно (регистрационный диалог возвращает mrOk), то отображаем главную форму, если нет - завершаем приложение, не открывая главную форму. Делаем так:

constructor TMainForm.Create(AOwner: TComponent);
begin
 ReportMemoryLeaksOnShutdown := True;

 Application.CreateForm(TfmPswd, fmPswd);
 if fmPswd.ShowModal <> mrOk then
 else begin
   Application.Terminate;
   Free; // Это чтобы ReportMemoryLeaks был счастлив
   Exit;
 end;

 inherited;
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
//  ReportMemoryLeaksOnShutdown := True;
 FUserID := fmPswd.GetUserID;  // Форма fmPswd хоть и закрыта, но все еще
                                           // жива, поэтому берем из нее все, что нужно
 fmPswd.Free;  // А теперь освобождаемся от нее
end;


 
uw ©   (2008-06-07 23:56) [31]

else там лишнее.


 
uw ©   (2008-06-08 00:14) [32]

Лучше еще раз написать, а то сплошь неточности:

constructor TfmMain.Create(AOwner: TComponent);
begin
 ReportMemoryLeaksOnShutdown := True;

 Application.CreateForm(TfmPswd, fmPswd);
 if fmPswd.ShowModal <> mrOk then begin
   Application.Terminate;
   Free; // Это чтобы ReportMemoryLeaks был счастлив
   Exit;
 end;

 inherited;
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
//  ReportMemoryLeaksOnShutdown := True;
 FUserID := fmPswd.GetUserID;  // Форма fmPswd хоть и закрыта, но все еще
                                          // жива, поэтому берем из нее все, что нужно
 fmPswd.Free;  // А теперь освобождаемся от нее
end;



Страницы: 1 вся ветка

Текущий архив: 2008.07.27;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.016 c
15-1213379049
@!!ex
2008-06-13 21:44
2008.07.27
Подскажите IDE для C++ под Linux


15-1213006023
@!!ex
2008-06-09 14:07
2008.07.27
У меня есть матричный принтер...


2-1214388914
Light-blr
2008-06-25 14:15
2008.07.27
Как отобразить на форме картинку в формате gif?


2-1214305065
Jimmy
2008-06-24 14:57
2008.07.27
Сочетания без повторений


15-1212840446
Vlad Oshin
2008-06-07 16:07
2008.07.27
как работает и почему такой ответ