![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк при запуске откомпиленного проекта [D7, WinXP]
ZevSS © (2007-04-04 22:24:00)Глюк какой-то хитрый у меня в программе. Программа: клиент БД на MSSQL Server 2000 + ADO. Компилю проект на своем компе. Запускаю готовый exe'шник на своем компе - все Ok. Переношу этот exe'шник на другой комп и при загрузке вылетает ошибка "Runtime error 216" и, естественно, приложение не запускается. НО! Если откомпилить проект на этом компе (где экзшник вылетает с ошибкой), то все работает на этом компе нормуль. Что это такое? Использую Delphi 7, компоненты ADO. Кроме стандартных компонентов использую EhLib 3.6 и JEDI Vcl. HELP!
ZevSS (2007-04-08 13:16:00) [1]Удалено модератором
Примечание: Задай вопрос в отдельной ветке
Loginov Dmitry (2007-04-07 14:03:00) [2]> Так вот этот экзешник А запускается на всех компах к которым
> я получил доступ. В чем был глюк я не пойму.
А отладчик на что?
ZevSS (2007-04-07 13:58:00) [3]Немного мы ушли, имхо, от обсуждения коренного вопроса.
1. Как тут уже заметили, все что у меня создается в дпр-е - это действительно датамодули, кроме frmMain (она же основная форма приложения).
2. Приложение еще далеко не закончено, поэтому "Error server connection" на данном этапе вполне меня устраивает. Позже будет естественно исправлено.
А теперь вернусь к коренному вопросу: Взял я свой исходный код и откомпилил его на компьютере (А), где exe-шник, созданный на моем компьютере вылетал с ошибкой. Так вот этот экзешник А запускается на всех компах к которым я получил доступ. В чем был глюк я не пойму.
sniknik (2007-04-06 17:19:00) [4]> автоматом создаются не формы, а датамодули
опс... ну, это не очевидно/легко пропустить по подобным названиям, я думал формы. (кстати в [4] судя по TDM.... тоже датамодули)
_Аноним (2007-04-06 17:14:00) [5]
> except
> ShowMessage('Error Server Connection!');
> Application.Terminate;
> end;
Вот это великолепно.
Следующим вопросом будет:
"У меня программа при старте вываливается с ошибкой "'Error Server Connection!", как бы мне понять, в чем именно дело"?
А вот никак при таком раскладе
Игорь Шевченко (2007-04-06 17:04:00) [6]sniknik © (06.04.07 13:41) [12]
Германн © (06.04.07 13:19) [11]
Ежели кто посмотрит внимательно, автоматом создаются не формы, а датамодули. На экране они не отображатся, хлеба не просят, а созданными вначале работы им надо быть по консепции...
sniknik (2007-04-06 13:41:00) [7]> ну посмотри еще:
а я обычно пишу так ...
uses .....
begin
Application.Initialize;
Application.CreateForm(TdmData, dmData); //считаем что датамодуль используется в форме с логином
with TdlgConnect.Create(nil) do
try
if dlgConnect.ShowModa <> mrOKl then begin
dmData.Free; //не всегда обязательно, но желательно, проще чем закрывать конекты и т.д. так все разом чистится
Exit;
end;
finally
dlgConnect.Free;
end;
Application.Title := 'FOO';
Application.CreateForm(TfrmMain, frmMain);
... //тут формы требующие автосоздания... но обычно все одним Main-ом и заканчивается, остальное по мере надобности
Application.Run;
end.
имхо проще, нагляднее, лучше, без ненужных действий...
Германн (2007-04-06 13:19:00) [8]
> Игорь Шевченко © (06.04.07 12:57) [10]
>
> Германн © (06.04.07 00:49) [5]
>
>
> > Первый раз вижу такой dpr !!!
>
>
> ну посмотри еще:
Фуууу :)
Игорь Шевченко (2007-04-06 12:57:00) [9]Германн © (06.04.07 00:49) [5]
> Первый раз вижу такой dpr !!!
ну посмотри еще:
var
WasConnected: ShortInt;
begin
Application.Initialize;
Application.Title := 'FOO';
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TdmData, dmData);
Application.CreateForm(Tdm0, dm0);
Application.CreateForm(Tdm1, dm1);
Application.CreateForm(Tdm2, dm2);
Application.CreateForm(Tdm3, dm3);
Application.CreateForm(Tdm4, dm4);
Application.CreateForm(Tdm5, dm5);
Application.CreateForm(Tdm6, dm6);
Application.CreateForm(Tdm7, dm7);
Application.CreateForm(Tdm8, dm8);
Application.CreateForm(Tdm9, dm9);
Application.CreateForm(Tdm10, dm10);
Application.CreateForm(Tdm11, dm11);
Application.CreateForm(Tdm12, dm12);
Application.CreateForm(Tdm13, dm13);
Application.CreateForm(Tdm14, dm14);
Application.CreateForm(Tdm15, dm15);
Application.CreateForm(Tdm16, dm16);
Application.CreateForm(Tdm17, dm17);
Application.CreateForm(Tdm18, dm18);
Application.CreateForm(Tdm19, dm19);
Application.CreateForm(Tdm20, dm20);
Application.CreateForm(Tdm21, dm21);
Application.CreateForm(Tdm22, dm22);
Application.CreateForm(Tdm23, dm23);
Application.CreateForm(Tdm24, dm24);
Application.CreateForm(Tdm25, dm25);
Application.CreateForm(Tdm26, dm26);
Application.CreateForm(Tdm27, dm27);
Application.CreateForm(Tdm28, dm28);
Application.CreateForm(Tdm29, dm29);
Application.CreateForm(Tdm30, dm30);
Application.CreateForm(Tdm31, dm31);
Application.CreateForm(Tdm32, dm32);
Application.CreateForm(Tdm33, dm33);
Application.CreateForm(Tdm34, dm34);
try
dlgConnect := TdlgConnect.Create(Application);
WasConnected := dlgConnect.ShowModal;
finally
dlgConnect.Free;
end;
if WasConnected <> 1 then begin
Application.ShowMainForm := false;
PostMessage(frmMain.Handle, WM_CLOSE, 0, 0);
end;
Application.Run
end.
P.S. все имена изменены :)
sniknik (2007-04-06 09:03:00) [10]добавлю к уже сказанному
> DMConnect.ADOConnection.Close;
зачем первым действием закрытие коннекта и только после настройка свойств? единственное обьяснение требуемости такого, что в дизайне он у тебя открыт, а раз открыт то и при создании датамодуля тоже открывается(пытается) вот и потребовалось иначе свойств не назначить... а раз открыт то на какоето, возможно только на рабочей машине доступное, соединение/базу... попадается машина у которой база из дизайна недоступна вот тебе и ошибка (не обязательно та что словил, но гарантировано когданибудь "нарвешся").
назначение свойств (лучше через Properties как сказали, нагляднее) можно делать в событии создания датамодуля, смысла выносить код в dpr не вижу.
> except
> ShowMessage('Error Server Connection!');
а вот за такое с работы увольняют... (я бы точно увольнял, уж очень много от подобного стиля проблем... у нас 2 трети ЦТО можно было бы распустить если бы не проги с такими "маскировками" реальных глюков. (продаем не только свое ПО...))
вот с чего ты решил что там именно 'Error Server Connection!'? только с того что сам его словил? или какой другой сакральный смысл? при таком количестве авто созданных форм неужели нигде нет кода в onCreate, или невозможна ошибка от чегото другого а не только коннекта? и даже если от коннекта, знать причину глюка (которая в незамаскированной ошибке прописана) при обслуживании программы очень важно.
это вообше, а конкретно тут, ловля ексепта не нужна. видел в автоматом созданном dpr чтонибудь подобное? ну вот, и у себя убери.
p.s. посмотрел у себя, обычно автоматом создаю только датамодуль и главную форму, остальное по мере надобности... похоже противоположная крайность показанного. ;о)
SlymRO (2007-04-06 04:18:00) [11]Плохиш © (06.04.07 3:33) [7]
Бедный пользователь, которому показываются сразу все эти кучей созданные формы
Я тоже децл офигел от обилия автосозданных форм :)
Представляю что творится в DMConnect !
Автар! Динамики добавь!
DMMain - тоже датамодуль? если да то до него формы имеются...
ZevSS © (06.04.07 0:35) [4]
DMConnect.ADOConnection.Close;
if not DMConnect.ADOConnection.Connected then
А смысл? Всегда выполнится.
frmSecurity.Free; - а че так поздно?
frmSecurity := TfrmSecurity.Create(nil);//зачел лишний раз без надобности Application пользовать?
try
if frmSecurity.ShowModal <> mrOk then //я привык проверять на OK оптимист
Exit;//Легко и просто :)
finally
frmSecurity.Free;
end;
//.. твоя мултиформенная лабуда
Application.Run;
end.
Плохиш (2007-04-06 03:33:00) [12]
> ZevSS © (06.04.07 00:35) [4]
Афигеть.
1. Mainform становиться первая созданная форма с Owner = Application.
2. У ADOConnection есть свойство Properties.
3. Бедный пользователь, которому показываются сразу все эти кучей созданные формы.
BiN (2007-04-06 01:04:00) [13]
> ZevSS © (04.04.07 22:24)
Попробуй в модуле JclStrings.pas в процедуре LoadCharTypes заменить строку
GetStringTypeExA(LOCALE_USER_DEFAULT, CT_CTYPE1, @CurrChar, SizeOf(AnsiChar), CurrType);
на
Win32Check(GetStringTypeExA(LOCALE_USER_DEFAULT, CT_CTYPE1, @CurrChar, SizeOf(AnsiChar), CurrType));
Было дело, я обжигался...
Германн (2007-04-06 00:49:00) [14]Первый раз вижу такой dpr !!!
ZevSS (2007-04-06 00:35:00) [15]У меня все работает через ADOStoredProcedure и ADOQuery. Все эти компоненты коннектятся с б\д через один ADOConnection. У всех компонентов Active := False. Все датасеты открываются при запуске программы и закрываются при OnDestroy формы. Проверял неоднократно, т.к. сегодня пол дня пытался определить из-за чего этот глюк. На некоторых компах все Ok, на других - рантайм эррор. :( Может это из-за того, что у меня mainform нет? По идее основная форма у меня frmMain. Вот так у меня выглядит файл проекта. Тогда если смотреть в Projecr->Options, то там mainform отсутствует и в autocreate form есть только датамодуль DMConnect.
Но почему ж тогда на машине, где вылетает ошибка - после перекомпиляции проекта все Ok? Дурдом.
program KadriEND;
uses
Forms,
Controls,
Dialogs,
UMain in 'UMain.pas' {frmMain},
UDMConnect in 'UDMConnect.pas' {DMConnect: TDataModule},
UAddSotrudnik in 'UAddSotrudnik.pas' {frmAddSotrudnik},
UDMAddSotrudnik in 'UDMAddSotrudnik.pas' {DMAddSotrudnik: TDataModule},
UGlobalVars in 'UGlobalVars.pas',
UDMMain in 'UDMMain.pas' {DMMain: TDataModule},
UDMDelSotrudnik in 'UDMDelSotrudnik.pas' {DMDelSotrudnik: TDataModule},
UEditSotrudnik in 'UEditSotrudnik.pas' {frmEditSotrudnik},
UDMEditSotrudnik in 'UDMEditSotrudnik.pas' {DMEditSotrudnik: TDataModule},
UAbout in 'UAbout.pas' {frmAbout},
UDMEditMestoSlujbi in 'UDMEditMestoSlujbi.pas' {DMEditMestoSlujbi: TDataModule},
UDMEditDembel in 'UDMEditDembel.pas' {DMEditDembel: TDataModule},
UEditDembel in 'UEditDembel.pas' {frmDembelSotrudnik},
UDMEditSpecZvanie in 'UDMEditSpecZvanie.pas' {DMEditSpecZvanie: TDataModule},
UAddSpecZvanie in 'UAddSpecZvanie.pas' {frmAddSpecZvanie},
UPhotoPreview in 'UPhotoPreview.pas' {frmPhotoPreview},
UDMEditSlujUdost in 'UDMEditSlujUdost.pas' {DMEditSlujUdost: TDataModule},
UDMEditTravms in 'UDMEditTravms.pas' {DMEditTravms: TDataModule},
UAddTravm in 'UAddTravm.pas' {frmAddTravms},
UAddMestoSlujbi in 'UAddMestoSlujbi.pas' {frmAddMestoSlujbi},
UDMEditSemPolojenie in 'UDMEditSemPolojenie.pas' {DMEditSemPolojenie: TDataModule},
UAddRodstvennik in 'UAddRodstvennik.pas' {frmAddRodstvennik},
UDMEditVziskanija in 'UDMEditVziskanija.pas' {DMEditVziskanija: TDataModule},
UAddVziskanie in 'UAddVziskanie.pas' {frmAddVziskanie},
UDMEditAtt in 'UDMEditAtt.pas' {DMEditAtt: TDataModule},
UAddAtt in 'UAddAtt.pas' {frmAddAtt},
UDMOtpuska in 'UDMOtpuska.pas' {DMOtpuska: TDataModule},
UAddOtpusk in 'UAddOtpusk.pas' {frmAddOtpusk},
UDMSlujbaChp in 'UDMSlujbaChp.pas' {DMSlujbaChp: TDataModule},
UAddChp in 'UAddChp.pas' {frmAddChp},
UDMTrud in 'UDMTrud.pas' {DMTrud: TDataModule},
UAddTrud in 'UAddTrud.pas' {frmAddTrud},
UAddZagran in 'UAddZagran.pas' {frmAddZagran},
UDMZagran in 'UDMZagran.pas' {DMZagran: TDataModule},
UDMPPiP in 'UDMPPiP.pas' {DMPPiP: TDataModule},
UAddPerepodgotovka in 'UAddPerepodgotovka.pas' {frmAddPerepodgotovka},
UDMGosVlast in 'UDMGosVlast.pas' {DMGosVlast: TDataModule},
UAddGosVlast in 'UAddGosVlast.pas' {frmAddGosVlast},
UDMPovKval in 'UDMPovKval.pas' {DMPovKval: TDataModule},
UAddPovKval in 'UAddPovKval.pas' {frmAddPovKval},
UDMProdlenie in 'UDMProdlenie.pas' {DMProdlenie: TDataModule},
UAddProdlenie in 'UAddProdlenie.pas' {frmAddProdlenie},
UDMObrazovanie in 'UDMObrazovanie.pas' {DMObrazovanie: TDataModule},
UAddObrazUchr in 'UAddObrazUchr.pas' {frmAddObrazUchr},
UAddLang in 'UAddLang.pas' {frmAddLang},
UAddUchStepen in 'UAddUchStepen.pas' {frmAddUchStepen},
UAddUchZvanie in 'UAddUchZvanie.pas' {frmAddUchZvanie},
UAddNagrad in 'UAddNagrad.pas' {frmAddNagrad},
UDMNagrads in 'UDMNagrads.pas' {DMNagrads: TDataModule},
UDMArmy in 'UDMArmy.pas' {DMArmy: TDataModule},
DMKILL in 'DMKILL.pas' {DMDeleteRecord: TDataModule},
UDMPhotoView in 'UDMPhotoView.pas' {DMPhotoView: TDataModule},
USecurity in 'USecurity.pas' {frmSecurity};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TDMConnect, DMConnect);
frmSecurity := TfrmSecurity.Create(Application);
try
DMConnect.ADOConnection.Close;
if not DMConnect.ADOConnection.Connected then
if frmSecurity.ShowModal = mrCancel
then Application.Terminate
else
begin
try
DMConnect.ADOConnection.ConnectionString := Concat('Provider=SQLOLEDB.1;',
'Persist Security Info=False;User ID=',
frmSecurity.EditLogin.Text, ';Initial Catalog=',
frmSecurity.EditBase.Text, ';Data Source=',
frmSecurity.EditServer.Text);
DMConnect.ADOConnection.Provider := 'SQLOLEDB.1';
DMConnect.ADOConnection.Open(frmSecurity.EditLogin.Text,
frmSecurity.EditPassword.Text);
Application.CreateForm(TDMPhotoView, DMPhotoView);
Application.CreateForm(TDMMain, DMMain);
Application.CreateForm(TDMAddSotrudnik, DMAddSotrudnik);
Application.CreateForm(TDMDelSotrudnik, DMDelSotrudnik);
Application.CreateForm(TDMEditSotrudnik, DMEditSotrudnik);
Application.CreateForm(TDMEditMestoSlujbi, DMEditMestoSlujbi);
Application.CreateForm(TDMEditDembel, DMEditDembel);
Application.CreateForm(TDMEditSpecZvanie, DMEditSpecZvanie);
Application.CreateForm(TDMEditSlujUdost, DMEditSlujUdost);
Application.CreateForm(TDMEditTravms, DMEditTravms);
Application.CreateForm(TDMEditSemPolojenie, DMEditSemPolojenie);
Application.CreateForm(TDMEditVziskanija, DMEditVziskanija);
Application.CreateForm(TDMEditAtt, DMEditAtt);
Application.CreateForm(TDMOtpuska, DMOtpuska);
Application.CreateForm(TDMSlujbaChp, DMSlujbaChp);
Application.CreateForm(TDMTrud, DMTrud);
Application.CreateForm(TDMZagran, DMZagran);
Application.CreateForm(TDMPPiP, DMPPiP);
Application.CreateForm(TDMGosVlast, DMGosVlast);
Application.CreateForm(TDMPovKval, DMPovKval);
Application.CreateForm(TDMProdlenie, DMProdlenie);
Application.CreateForm(TDMObrazovanie, DMObrazovanie);
Application.CreateForm(TDMNagrads, DMNagrads);
Application.CreateForm(TDMArmy, DMArmy);
Application.CreateForm(TDMDeleteRecord, DMDeleteRecord);
Application.CreateForm(TfrmMain, frmMain);
except
ShowMessage('Error Server Connection!');
Application.Terminate;
end;
end;
finally
frmSecurity.Free;
end;
Application.Run;
end.
Loginov Dmitry (2007-04-05 22:23:00) [16]проверь, нет ли каких ДатаСетов с Active=True
ZevSS (2007-04-05 22:00:00) [17]А что именно проверять-то? Ну да, естественно, у меня есть такие обработчики исключений. Но ведь прога на некоторых компах запускается, а на некоторых вылетает :( Тем более вся это фигня, имхо, происходит в процессе выполнения Application.Initialization. Если это моя недоработка, то что именно смотреть и как исправлять? Нужно довольно срочно с этим разобраться.
Плохиш (2007-04-05 11:29:00) [18]
> при загрузке вылетает ошибка "Runtime error 216"
Стоит проверить свой код на наличие следующих обработчиков исключений
try
....
except
end;
216 - это ошибка доступа к памяти...