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

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

Глюк при запуске откомпиленного проекта [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 - это ошибка доступа к памяти...


Наверх

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