Форум: "Прочее";
Текущий архив: 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.009 c