Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.007 c
15-1212840446
Vlad Oshin
2008-06-07 16:07
2008.07.27
как работает и почему такой ответ


2-1214313276
implementation
2008-06-24 17:14
2008.07.27
Двойной клик по фиксированной ячейке в TStringGrid.


15-1212761210
Ega23
2008-06-06 18:06
2008.07.27
Не дать организьму умереть от обезвоживания?


13-1120618997
Skyle
2005-07-06 07:03
2008.07.27
Web Service, DCOM сервер и многия клиенты


6-1190980794
HaJik
2007-09-28 15:59
2008.07.27
IndyTCPClien Заменить сообщение об ошибке.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский