Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Косяк при создании форм [D6, WinME]


SPeller ©   (2002-05-05 05:54:00) 

Такой вот косяк в Дельфях. В модуле проекта в зависимости от передаваемых программе параметров выбираю как она дальше будет работать и какие формы создавать:

tm:=uppercase(paramstr(1));
if (tm="/C")or(tm="C")or(tm="-C") then
Application.CreateForm(TfrmConfig, frmConfig)
else begin
Application.CreateForm(TfrmOpen, frmOpen);
Application.CreateForm(TfrmTest, frmTest);
Application.CreateForm(TfrmEnd, frmEnd);
end;

Но. Если так сделать, то проект перестаёт запускаться вообще(!), хотя с успехом компилируется (Ctrl+F9) и выполняется. При попытке закрыть страницу с модулем вылазит
Error in module ***: Call to Application.CreateForm is missing or incorrect.
Закрыть проект можно только на File -> Close All. То же самое если открывать проект. Вылазит эта мессага и проект не загружается.
Однако опять же это можно преодолеть если сделать так:

tm:=uppercase(paramstr(1));
if (tm="/C")or(tm="C")or(tm="-C") then
Application.CreateForm(TfrmConfig, frmConfig);
if not((tm="/C")or(tm="C")or(tm="-C")) then begin
Application.CreateForm(TfrmOpen, frmOpen);
Application.CreateForm(TfrmTest, frmTest);
Application.CreateForm(TfrmEnd, frmEnd);
end;

Фактически никакой разницы в этих вариантах нет, алгоритм работы один и тот же, первый даже лучше с точки зрения написания кода, но вот Дельфям первый не нравится хоть убей.
Что это за нафиг и можно ли как-нибудь справиться с этим ??


Севостьянов Игорь   (2002-05-07 13:23:00) [1]

Вот тебе рабочий пример...
Причем не забудь в Project Options указать на закладке Forms
AutoCreate forms: frmConfig и ничего более...
Нужен код пришлю пиши на мыло...

program UniTest;
{$MAXSTACKSIZE 2000000}
{$X+}

uses
Forms,
SysUtils,
Windows,
Controls,
FileCtrl,
mfrmOpen in "mfrmOpen.pas" {frmOpen},
mfrmTest in "mfrmTest.pas" {frmTest},
mfrmEnd in "mfrmEnd.pas" {frmEnd},
mfrmConfig in "mfrmConfig.pas" {frmConfig};

{$R *.RES}

const
UT_TestFolder = "Testing";
UT_TestImgFolder = "Images";
var
AppPath, tm: string;

begin
SetPriorityClass(GetCurrentProcess, RealTime_Priority_Class);
Screen.Cursor := crAppStart;
AppPath := ExtractFilePath(Application.ExeName);
ForceDirectories(AppPath+"\"+UT_TestFolder);
ForceDirectories(AppPath+"\"+UT_TestImgFolder);
Application.Initialize;
tm := UpperCase(ParamStr(1));

if (tm = "/C") or (tm = "C") or (tm = "-C") then
begin
Application.CreateForm(TfrmConfig, frmConfig);
end
else
begin
Application.CreateForm(TfrmOpen, frmOpen);
Application.CreateForm(TfrmTest, frmTest);
Application.CreateForm(TfrmEnd, frmEnd);
end;
Application.HintPause := 300;
Application.HintHidePause := 20000;
SetPriorityClass(GetCurrentProcess, Normal_Priority_Class);
Screen.Cursor := crDefault;
Application.Run;

end.


KSergey   (2002-05-06 10:20:00) [2]

Попробуйте убрать AutoCreate формы в св-свойствах проекта. Может в этом дело? Может это место дельфя не может корректно обработать?


SPeller   (2002-05-05 11:28:00) [3]

Вот полностью код модуля:


program UniTest;

uses
Forms,
sysutils,
Windows,
controls,
utconst in "UTConst.pas",
UTFuncs in "UTFuncs.pas",
UTFileFuncs in "UTFileFuncs.pas",
mfrmOpen in "mfrmOpen.pas" {frmOpen},
mfrmTest in "mfrmTest.pas" {frmTest},
mLED in "mLED.pas",
mfrmend in "mfrmend.pas" {frmEnd},
mfrmconfig in "mfrmconfig.pas" {frmConfig},
strfuncs in "strfuncs.pas";

{$R *.res}
var tm:string;

begin
{$MAXSTACKSIZE 2000000}
{$X+}

setpriorityclass(getcurrentprocess,realtime_priority_class);
screen.Cursor:=crappstart;
apppath:=extractfilepath(application.exename);
tm:=ut_testfolder;
if not directoryexists(apppath+tm)then createdirectory(pchar(apppath+tm),nil);
tm:=ut_testfolder+"\"+ut_testimgfolder;
if not directoryexists(apppath+tm)then createdirectory(pchar(apppath+tm),nil);
Application.Initialize;

tm:=uppercase(paramstr(1));
if (tm="/C")or(tm="C")or(tm="-C") then begin
Application.CreateForm(TfrmConfig, frmConfig)
end else begin
Application.CreateForm(TfrmOpen, frmOpen);
Application.CreateForm(TfrmTest, frmTest);
Application.CreateForm(TfrmEnd, frmEnd);
end;
screen.Cursor:=crdefault;
application.HintPause:=300;
application.HintHidePause:=20000;
setpriorityclass(getcurrentprocess,normal_priority_class);
Application.Run;

end.


Ну не хотит он работать как надо.


SeF   (2002-05-05 08:29:00) [4]

не знаю что у тебя но:

program Project1;

uses
Forms,sysutils,
Unit1 in "Unit1.pas" {Form1},
Unit2 in "Unit2.pas" {Form2},
Unit3 in "Unit3.pas" {Form3},
Unit4 in "Unit4.pas" {Form4};

{$R *.res}

var
tm:string;

begin
Application.Initialize;
tm:=uppercase(paramstr(1));
if (tm="/C")or(tm="C")or(tm="-C")then
Application.CreateForm(TForm1, Form1)
else
begin
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm4, Form4);
end;
Application.Run;
end.

Замечательно скомпилился и выполнился..........
"истина где-то рядом..."


Наверх

Титульная страница Поиск, карта сайта Написать письмо