На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Где сохраняется откомпилированный код модуля проекта .dpr? Д2007
    Никогда об этом не слышал и нигде не читал. Но столкнулся с ситуацией при восстановлении старого проекта.
    Изначально старые исходники скомпилировал (а точнее сбилдил) на ура. Кое-что поменял в коде некоторых модулей всё работает.
    Но понадобилось добавить в проект новую форму для выяснения неких деталей из-за того, что отладчик в Д2007 хреновый и всё время только и жалуется что переменная Self не валидна.
    И получил ошибку компиляции в следующем коде:
    ExpandedWrap disabled
              //Application.CreateForm(TMainMon, Main); // Так должно быть!
              Application.CreateForm(TMain, Main);

    TMain неизвестный идентифмкатор.
      А что в uses выше написано?

      Прикладывайте весь текст .dpr файла (а еще лучше и сам Unit), чтобы можно было разобраться. Иначе ответ: Вы сделали что-то не так.

      ADD: Если ограничиться только приведенным вами кодом, тогда все идентификаторы неизвестные.
      Сообщение отредактировано: macomics -
        Ну если вам это интересно, то вот весь текст dpr файла. Только прошу не падать в обморок
        ExpandedWrap disabled
          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.
          ExpandedWrap disabled
            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';
          Я тут что-то не вижу модуля, в котором объявлен TMainMon. Есть модуль объявляющий Main (скорее всего имя глобальной переменной), но TMainMon не вижу. Добавьте в uses ссылку на Unit, в котором описаны класс TMainMon и глобальная переменная Main в секции interface.

          add: Если они описаны в модуле UnitMain, тогда проверьте его наличие в папке проекта и наличие описанного в нем класса TMainMon в секции interface.
          Если описание класса TMainMon и переменной Main: TMainMon; было убрано из секции interface, тогда этот класс и переменная не будут видны в других модулях и основном тексте программы (.dpr).

          add2: Или все тоже самое относится к TMain. В первом сообщении у вас фигурирует имя класса TMain, а во втором уже TMainMon.
          Сообщение отредактировано: macomics -
            Цитата northener @
            Никогда об этом не слышал и нигде не читал. Но столкнулся с ситуацией при восстановлении старого проекта.
            Изначально старые исходники скомпилировал (а точнее сбилдил) на ура. Кое-что поменял в коде некоторых модулей всё работает.
            Но понадобилось добавить в проект новую форму для выяснения неких деталей из-за того, что отладчик в Д2007 хреновый и всё время только и жалуется что переменная Self не валидна.
            И получил ошибку компиляции в следующем коде:

                    //Application.CreateForm(TMainMon, Main); // Так должно быть!
                    Application.CreateForm(TMain, Main);

            TMain неизвестный идентифмкатор.

            Триста лет Дельфи не видел ... :lol:

            Цитата для прояснения сути:
            Цитата
            Файл проекта .dpr

            Файл проекта Delphi — это, по сути, главный программный модул не связанный ни с какой формой. В нем указываются ссылки на программные модули приложения и создаются формы. Он имеет следующую структуру:
            ExpandedWrap disabled
              program имя_программы; //заголовок
              //раздел, в котором указываются ссылки на модули форм
              uses
               Forms,
               Unit1 in 'Unit1.pas' {Form1}; //главная форма приложения
               //ссылки на остальные формы приложения
               //…
              {$R *.res} {директива компилятора о подключении файла ресурсов программы}
              begin
               //инициализация приложения как объекта
               Application.Initialize;
               //создание главной формы приложения
               Application.CreateForm(TForm1, Form1);
               //создание остальных форм
               //…
               //запуск приложения
               Application.Run;
              end.


            Таким образом, сообщение "TMain неизвестный идентифмкатор", говорит о том, что в файл проекта не подключен модуль, реализующий форму типа TForm1. Ищи ее реализацию в файлах проекта, и включай найденный файл в раздел "Uses" этого файла проекта.
              *2: Только не на модули форм, а на все модули подключаемые к программе. Forms это модуль, который содержит описание Application, но не формы.
                Цитата macomics @
                Я тут что-то не вижу модуля, в котором объявлен TMainMon. Есть модуль объявляющий Main (скорее всего имя глобальной переменной), но TMainMon не вижу

                Это UnitMain. И в нем объявлен класс TMainMon и переменная
                ExpandedWrap disabled
                  var
                    Main: TMainMon;

                А класса TMain действительно нет.
                Но проект компилировался именно в таком виде!
                  Цитата northener @
                  А класса TMain действительно нет.
                  Но проект компилировался именно в таком виде!
                  Если компилировался, тогда он где-то есть. Попробуйте воспользоваться поиском по файлам.
                  Сообщение отредактировано: macomics -
                    Ага. Был не совсем внимательным. Итак проект ранее компилировался с таким кодом:
                    ExpandedWrap disabled
                        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);

                    Оставил только часть строк чтобы легче было заметить разницу.
                    После добавления нового модуля код стал таким:
                    ExpandedWrap disabled
                        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);

                    И пошла ошибка.
                      Т.е. Delphi 2007 при попытке в этот текст добавить строку создания новой формы изменяет название класса с TMainMon на TMain.

                      Попробуйте переменную Main переименовать MainMon. В пределах модуля это можно быстро сделать через замену. Только не забудьте поставить галочку только слово целиком, иначе будут заменяться и имена классов (TMainMon -> TMainMonMon), а это не нужно.
                        Цитата macomics @
                        Т.е. Delphi 2007 при попытке в этот текст добавить строку создания новой формы изменяет название класса с TMainMon на TMain.

                        Да. Именно так. Причем как видно "строит" название класса из строки
                        ExpandedWrap disabled
                           UnitMain in 'UnitMain.pas' {Main},

                        ибо больше неоткуда. Т.е. менять имя той самой дурацкой глобальной переменной модуля формы нам никто не запрещает и ни о чем не предупреждает. А потом ловите баг.
                        Интересно исправили ли этот баг в старших версиях?

                        Цитата macomics @
                        Попробуйте переменную Main переименовать MainMon. В пределах модуля это можно быстро сделать через замену.

                        А в пределах всего проекта с этим прекрасно справляется CnPack. Но пока я этого делать не буду. Как и мой предшественник, который похоже тоже на этом залетел и оставил комментарий. Вот только непонятно его оформил.
                        Спасибо всем участвовавшим!

                        Добавлено
                        Проверил на DCE 10.4 То же самое. Т.е. в автосоздаваемых формах имя переменной формы должно быть таким же как и имя класса формы за исключением первой буквы Т.
                        Иначе код модуля проекта придется каждый раз при изменении списка форм редактировать ручками.
                          Проверил эту же петрушку на Lazarus v2.2.4 r на Linux.
                          У него с этим порядок. Он отдельно контролирует имена классов и имена глобальных переменных для форм.
                          Проверил как при добавлении новой формы так и при изменении порядка активации форм через окно менеджера в проекте.
                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0378 ]   [ 15 queries used ]   [ Generated: 13.05.24, 20:37 GMT ]