
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.172.111.47] |
![]() |
|
Сообщ.
#1
,
|
|
|
Никогда об этом не слышал и нигде не читал. Но столкнулся с ситуацией при восстановлении старого проекта.
Изначально старые исходники скомпилировал (а точнее сбилдил) на ура. Кое-что поменял в коде некоторых модулей всё работает. Но понадобилось добавить в проект новую форму для выяснения неких деталей из-за того, что отладчик в Д2007 хреновый и всё время только и жалуется что переменная Self не валидна. И получил ошибку компиляции в следующем коде: ![]() ![]() //Application.CreateForm(TMainMon, Main); // Так должно быть! Application.CreateForm(TMain, Main); TMain неизвестный идентифмкатор. |
Сообщ.
#2
,
|
|
|
А что в uses выше написано?
Прикладывайте весь текст .dpr файла (а еще лучше и сам Unit), чтобы можно было разобраться. Иначе ответ: Вы сделали что-то не так. ADD: Если ограничиться только приведенным вами кодом, тогда все идентификаторы неизвестные. |
Сообщ.
#3
,
|
|
|
Ну если вам это интересно, то вот весь текст dpr файла. Только прошу не падать в обморок
![]() ![]() program Monitor; {$DEFINE EVENT_LIST} //{$DEFINE DEVICE_CONSOLE} {$IFDEF EVENT_LIST} {$ENDIF} //EVENT_LIST {$IFDEF DEVICE_CONSOLE} {$ENDIF} //DEVICE_CONSOLE {%TogetherDiagram 'ModelSupport_Monitor\default.txaPackage'} uses Forms, Windows, SysUtils, UnitMain in 'UnitMain.pas' {Main}, UnitVar in 'UnitVar.pas', UnitConst in '..\Common\UnitConst.pas', UnitINI in '..\Common\UnitINI.pas', UnitInfoWnd in 'UnitInfoWnd.pas' {InfoWnd}, UnitCommon in '..\Common\UnitCommon.pas', UnitSetting in '..\Common\UnitSetting.pas' {Setting}, UnitProp in 'UnitProp.pas' {Prop}, UnitPepSel in 'UnitPepSel.pas' {PepSel}, UnitWndWait in '..\Common\UnitWndWait.pas' {WndWait}, UnitAuthorize in '..\Common\UnitAuthorize.pas' {Authorize}, UnitLogo in '..\Common\UnitLogo.pas' {LogoForm}, SheltLog in '..\Common\SheltLog.pas', Addone in '..\Addone\Addone.pas', UnitGuardant in '..\Common\UnitGuardant.pas', UnitMessage in '..\Common\UnitMessage.pas' {AutoMessage}, Logo in '..\Common\Logo.pas', SheltLogPropertyPage in '..\Common\SheltLogPropertyPage.pas' {PropLogPage: TFrame}, UnitInterface in '..\Common\UnitInterface.pas', grddelphi in '..\..\Guardant\lib_6_0\grddelphi.pas', UnitLicence in '..\Guardant_5.2\UnitLicence.pas', SafeProg in '..\Guardant_5.2\SafeProg.pas'; {$R *.res} type AppExcept = class public procedure OnException(Sender: TObject; E: Exception); end; procedure AppExcept.OnException(Sender: TObject; E: Exception); BEGIN SaveLogLvl('app', STATISTIC, PChar(APP_NAME+'::OnException(...) ...')); SaveLogLvl('app', ERRORS, PChar('Неизвестная ошибка')); SaveLogLvl('app', STATISTIC, PChar(e.Message)); //ShowAutoMessage(Application, 'Неизвестная ошибка!', 5, false); SaveLogLvl('app', STATISTIC, PChar(APP_NAME+'::OnException(...) end.')); END; var AppException : AppExcept; begin Application.Initialize; SaveLogLvl('app', STATISTIC, PChar('App initialize')); //If IsFirstExecute('Монитор событий',false) then If IsFirstExecute('TMainMon',false, APP_NAME) then begin ShowAutoMessage(Application, APP_NAME + '. Загрузка приложения ' + Cfg.Setting.Product + ' ...', 60, false); SaveLogLvl('app', STATISTIC, PChar('Show start message')); Application.ProcessMessages; AppException := AppExcept.Create(); Application.OnException := AppException.OnException; //Application.Title := 'Монитор событий. M3'; //Application.CreateForm(TMainMon, Main); // Так должно быть! Application.CreateForm(TMainMon, Main); Application.CreateForm(TProp, Prop); //Application.CreateForm(TSetting, Setting); Application.CreateForm(TPepSel, PepSel); Application.CreateForm(TWndWait, WndWait); //Application.CreateForm(TLogo, Logo); Application.Run; AppException.Free(); end; end. |
Сообщ.
#4
,
|
|
|
![]() ![]() uses Forms, Windows, SysUtils, UnitMain in 'UnitMain.pas' {Main}, UnitVar in 'UnitVar.pas', UnitConst in '..\Common\UnitConst.pas', UnitINI in '..\Common\UnitINI.pas', UnitInfoWnd in 'UnitInfoWnd.pas' {InfoWnd}, UnitCommon in '..\Common\UnitCommon.pas', UnitSetting in '..\Common\UnitSetting.pas' {Setting}, UnitProp in 'UnitProp.pas' {Prop}, UnitPepSel in 'UnitPepSel.pas' {PepSel}, UnitWndWait in '..\Common\UnitWndWait.pas' {WndWait}, UnitAuthorize in '..\Common\UnitAuthorize.pas' {Authorize}, UnitLogo in '..\Common\UnitLogo.pas' {LogoForm}, SheltLog in '..\Common\SheltLog.pas', Addone in '..\Addone\Addone.pas', UnitGuardant in '..\Common\UnitGuardant.pas', UnitMessage in '..\Common\UnitMessage.pas' {AutoMessage}, Logo in '..\Common\Logo.pas', SheltLogPropertyPage in '..\Common\SheltLogPropertyPage.pas' {PropLogPage: TFrame}, UnitInterface in '..\Common\UnitInterface.pas', grddelphi in '..\..\Guardant\lib_6_0\grddelphi.pas', UnitLicence in '..\Guardant_5.2\UnitLicence.pas', SafeProg in '..\Guardant_5.2\SafeProg.pas'; add: Если они описаны в модуле UnitMain, тогда проверьте его наличие в папке проекта и наличие описанного в нем класса TMainMon в секции interface. Если описание класса TMainMon и переменной Main: TMainMon; было убрано из секции interface, тогда этот класс и переменная не будут видны в других модулях и основном тексте программы (.dpr). add2: Или все тоже самое относится к TMain. В первом сообщении у вас фигурирует имя класса TMain, а во втором уже TMainMon. |
Сообщ.
#5
,
|
|
|
Цитата northener @ Никогда об этом не слышал и нигде не читал. Но столкнулся с ситуацией при восстановлении старого проекта. Изначально старые исходники скомпилировал (а точнее сбилдил) на ура. Кое-что поменял в коде некоторых модулей всё работает. Но понадобилось добавить в проект новую форму для выяснения неких деталей из-за того, что отладчик в Д2007 хреновый и всё время только и жалуется что переменная Self не валидна. И получил ошибку компиляции в следующем коде: //Application.CreateForm(TMainMon, Main); // Так должно быть! Application.CreateForm(TMain, Main); TMain неизвестный идентифмкатор. Триста лет Дельфи не видел ... ![]() Цитата для прояснения сути: Цитата Файл проекта .dpr Файл проекта Delphi — это, по сути, главный программный модул не связанный ни с какой формой. В нем указываются ссылки на программные модули приложения и создаются формы. Он имеет следующую структуру: ![]() ![]() program имя_программы; //заголовок //раздел, в котором указываются ссылки на модули форм uses Forms, Unit1 in 'Unit1.pas' {Form1}; //главная форма приложения //ссылки на остальные формы приложения //… {$R *.res} {директива компилятора о подключении файла ресурсов программы} begin //инициализация приложения как объекта Application.Initialize; //создание главной формы приложения Application.CreateForm(TForm1, Form1); //создание остальных форм //… //запуск приложения Application.Run; end. Таким образом, сообщение "TMain неизвестный идентифмкатор", говорит о том, что в файл проекта не подключен модуль, реализующий форму типа TForm1. Ищи ее реализацию в файлах проекта, и включай найденный файл в раздел "Uses" этого файла проекта. |
Сообщ.
#6
,
|
|
|
*2: Только не на модули форм, а на все модули подключаемые к программе. Forms это модуль, который содержит описание Application, но не формы.
|
Сообщ.
#7
,
|
|
|
Цитата macomics @ Я тут что-то не вижу модуля, в котором объявлен TMainMon. Есть модуль объявляющий Main (скорее всего имя глобальной переменной), но TMainMon не вижу Это UnitMain. И в нем объявлен класс TMainMon и переменная ![]() ![]() var Main: TMainMon; А класса TMain действительно нет. Но проект компилировался именно в таком виде! |
Сообщ.
#8
,
|
|
|
Цитата northener @ Если компилировался, тогда он где-то есть. Попробуйте воспользоваться поиском по файлам. А класса TMain действительно нет. Но проект компилировался именно в таком виде! |
Сообщ.
#9
,
|
|
|
Ага. Был не совсем внимательным. Итак проект ранее компилировался с таким кодом:
![]() ![]() SafeProg in '..\Guardant_5.2\SafeProg.pas'; {$R *.res} ... begin Application.Initialize; SaveLogLvl('app', STATISTIC, PChar('App initialize')); //If IsFirstExecute('Монитор событий',false) then If IsFirstExecute('TMainMon',false, APP_NAME) then begin ShowAutoMessage(Application, APP_NAME + '. Загрузка приложения ' + Cfg.Setting.Product + ' ...', 60, false); SaveLogLvl('app', STATISTIC, PChar('Show start message')); Application.ProcessMessages; AppException := AppExcept.Create(); Application.OnException := AppException.OnException; //Application.Title := 'Монитор событий. M3'; //Application.CreateForm(TMainMon, Main); // Так должно быть! Application.CreateForm(TMainMon, Main); Application.CreateForm(TProp, Prop); Оставил только часть строк чтобы легче было заметить разницу. После добавления нового модуля код стал таким: ![]() ![]() SafeProg in '..\Guardant_5.2\SafeProg.pas', Unit1 in 'Unit1.pas' {Form1}; {$R *.res} ... begin Application.Initialize; SaveLogLvl('app', STATISTIC, PChar('App initialize')); //If IsFirstExecute('Монитор событий',false) then If IsFirstExecute('TMainMon',false, APP_NAME) then begin ShowAutoMessage(Application, APP_NAME + '. Загрузка приложения ' + Cfg.Setting.Product + ' ...', 60, false); SaveLogLvl('app', STATISTIC, PChar('Show start message')); Application.ProcessMessages; AppException := AppExcept.Create(); Application.OnException := AppException.OnException; //Application.Title := 'Монитор событий. M3'; //Application.CreateForm(TMainMon, Main); // Так должно быть! Application.CreateForm(TMain, Main); Application.CreateForm(TProp, Prop); И пошла ошибка. |
Сообщ.
#10
,
|
|
|
Т.е. Delphi 2007 при попытке в этот текст добавить строку создания новой формы изменяет название класса с TMainMon на TMain.
Попробуйте переменную Main переименовать MainMon. В пределах модуля это можно быстро сделать через замену. Только не забудьте поставить галочку только слово целиком, иначе будут заменяться и имена классов (TMainMon -> TMainMonMon), а это не нужно. |
Сообщ.
#11
,
|
|
|
Цитата macomics @ Т.е. Delphi 2007 при попытке в этот текст добавить строку создания новой формы изменяет название класса с TMainMon на TMain. Да. Именно так. Причем как видно "строит" название класса из строки ![]() ![]() UnitMain in 'UnitMain.pas' {Main}, ибо больше неоткуда. Т.е. менять имя той самой дурацкой глобальной переменной модуля формы нам никто не запрещает и ни о чем не предупреждает. А потом ловите баг. Интересно исправили ли этот баг в старших версиях? Цитата macomics @ Попробуйте переменную Main переименовать MainMon. В пределах модуля это можно быстро сделать через замену. А в пределах всего проекта с этим прекрасно справляется CnPack. Но пока я этого делать не буду. Как и мой предшественник, который похоже тоже на этом залетел и оставил комментарий. Вот только непонятно его оформил. Спасибо всем участвовавшим! Добавлено Проверил на DCE 10.4 То же самое. Т.е. в автосоздаваемых формах имя переменной формы должно быть таким же как и имя класса формы за исключением первой буквы Т. Иначе код модуля проекта придется каждый раз при изменении списка форм редактировать ручками. |
Сообщ.
#12
,
|
|
|
Проверил эту же петрушку на Lazarus v2.2.4 r на Linux.
У него с этим порядок. Он отдельно контролирует имена классов и имена глобальных переменных для форм. Проверил как при добавлении новой формы так и при изменении порядка активации форм через окно менеджера в проекте. |