На главную Наши проекты:
Журнал   ·   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_
  
> Access Violation at address при загрузке дочерней формы
    Может мой вопрос покажется "ламерским" :whistle: но может кто нибудь сталкивался с такой проблемой.
    Когда вызываю из главной формы дочернюю форму:
    ExpandedWrap disabled
      ...
      implementation
       uses Unit2;
      ...
      procedure TForm1.CustomItem4Click(Sender: TObject);
      begin
      form2:=tform2.Create (self);
      end;
      ...

    то вылетают следующие ошибки
    Ошибка: Access Violation at address xxxxxxxx in module 'XXXXXXX.exe'. Read of address xxxxxxxx.,
    xxxxxxxx - любые значения адреса,
    или
    Ошибка: External Exception C000001D.
    после чего приходится нажимать ОК и только после этого создается дочернее окно и в конце концов всё это виснет.
    Дочернюю форму закрываю так:
    ExpandedWrap disabled
      ...
      procedure TForm2.SCButton1Click(Sender: TObject);
      begin
      close;
      end;
       
      procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
      begin
      action:=cafree;
      end;
       
      procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
      begin
       canclose:=true;
      end;
      ...


    Как можно обойти данную проблему :(
    Подскажите плз.. Если можно то с примерами...
      добавь еще проверку, скорее всего эта форма уже существует...
      ExpandedWrap disabled
        procedure TForm1.CustomItem4Click(Sender: TObject);
        begin
          if not assigned(form2) then
            form2:=tform2.Create (self);
          form2.Show();
        end;
        ...

      ну и закрывай ....
      ExpandedWrap disabled
        procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
        begin
             Action := caFree;
             Form2 := nil;
        end;
        А еще лучше не проверку делать, а в свойствах проекта убрать форму, которая только динамически создается/уничтожается из автосоздания.
          Цитата Felan @
          А еще лучше не проверку делать, а в свойствах проекта убрать форму, которая только динамически создается/уничтожается из автосоздания.

          Это интересно как? :huh: Как можно реализовать Ваш пример.

          -Added
          Цитата vladimir74 @
          добавь еще проверку, скорее всего эта форма уже существует...
          ExpandedWrap disabled
            procedure TForm1.CustomItem4Click(Sender: TObject);
            begin
              if not assigned(form2) then
                form2:=tform2.Create (self);
              form2.Show();
            end;
            ...

          ну и закрывай ....
          ExpandedWrap disabled
            procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
            begin
                 Action := caFree;
                 Form2 := nil;
            end;

          Да странно он уже вызывает эти ошибки как в предыдущем и новую другую ошибку

          Ошибка: Abstract error!

          В чем бага не пойму :huh:
          Сообщение отредактировано: Demon:-) -
            Цитата Demon:-) @
            Это интересно как? :huh: Как можно реализовать Ваш пример.

            зайди в файл проекта (project1.dpr) и убери от туда все Application.CreateForm(TForm2, Form2); кроме стартовой...

            Цитата Demon:-) @
            Да странно он уже вызывает эти ошибки как в предыдущем и новую другую ошибку
            Ошибка: Abstract error!

            непонял что и где вызывает ошибки?
              Цитата vladimir74 @
              Цитата Demon:-) @
              Это интересно как? :huh: Как можно реализовать Ваш пример.

              зайди в файл проекта (project1.dpr) и убери от туда все Application.CreateForm(TForm2, Form2); кроме стартовой...

              Цитата Demon:-) @
              Да странно он уже вызывает эти ошибки как в предыдущем и новую другую ошибку
              Ошибка: Abstract error!

              непонял что и где вызывает ошибки?

              А эту я сразу же надпись снёс, иначе она бы вместе с главной загружалась (а это мне ненужно ;) )

              а ошибки...

              ...Ошибка: Access Violation at address xxxxxxxx in module 'XXXXXXX.exe'. Read of address xxxxxxxx.,
              xxxxxxxx - любые значения адреса,
              или
              Ошибка: External Exception C000001D.
              после чего приходится нажимать ОК и только после этого создается дочернее окно и в конце концов всё это виснет....
              Сообщение отредактировано: Demon:-) -
                Demon:-)
                мне чего то кажется что у тебя ошибка где то в другом.....
                посмотри в Create и Show вызываемой формы может у тебя там что то не так... ты где то обращаешься к обьекту который в данный момент не существует (еще не создан или уже уничтожен)
                поставь в дебагере брейкпоинты в первой форме там где ты открываешь вторую, и во второй форме в методах Create и Show (если существуют) и посмотри где конкретно вылетает ошибка...
                  Цитата vladimir74 @
                  Demon:-)
                  мне чего то кажется что у тебя ошибка где то в другом.....
                  посмотри в Create и Show вызываемой формы может у тебя там что то не так... ты где то обращаешься к обьекту который в данный момент не существует (еще не создан или уже уничтожен)
                  поставь в дебагере брейкпоинты в первой форме там где ты открываешь вторую, и во второй форме в методах Create и Show (если существуют) и посмотри где конкретно вылетает ошибка...

                  вот сам дпр

                  ExpandedWrap disabled
                    program Project1;
                     
                    uses
                      Forms,
                      Unit1 in 'Unit1.pas' {Form1},
                      Unit2 in 'Unit2.pas' {Form2};
                    .....
                    {$R *.res}
                     
                    begin
                      Application.Initialize;
                      Application.Title := '';
                      Application.CreateForm(TForm1, Form1);
                      Application.Run;
                    end.


                  Унит1 это главная
                  Унит 2 дочка

                  Вот в Уните1 я я вызываю дочку Унит2 таким образом (в первом сообщении было описано)

                  ExpandedWrap disabled
                     form2:=tform2.Create (self);


                  вылетали ошибки, и вставил Ваш код

                  ExpandedWrap disabled
                    if not assigned(form2) then
                        form2:=tform2.Create (self);
                      form2.Show();

                  ошибки остались и возникла новая вот
                    ах да может тебе вместо tform2.Create(self) создавать tform2.Create(Application) ?
                    разница между вызовами описана в DRKB кстати очень рекомендую....

                    Добавлено
                    Demon:-)
                    что к тебя происходит в form2.FormCreate(Sender: TObject) ?

                    я только что сделал проект (пятница подействовала)
                    ExpandedWrap disabled
                      program Project1;
                      uses
                        Forms,
                        Unit1 in 'Unit1.pas' {Form1},
                        Unit2 in 'Unit2.pas' {Form2};
                      {$R *.res}
                      begin
                        Application.Initialize;
                        Application.CreateForm(TForm1, Form1);
                        Application.Run;
                      end.

                    ExpandedWrap disabled
                      unit Unit1;
                      interface
                      uses
                        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                        Dialogs, StdCtrls;
                      type
                        TForm1 = class(TForm)
                          Button: TButton;
                          procedure ButtonClick(Sender: TObject);
                        private
                          { Private-Deklarationen }
                        public
                          { Public-Deklarationen }
                        end;
                      var
                        Form1: TForm1;
                       
                      implementation
                      uses
                        Unit2;
                      {$R *.dfm}
                      procedure TForm1.ButtonClick(Sender: TObject);
                      begin
                      if not assigned(form2) then
                          form2:=tform2.Create(self);
                        form2.Show();
                      end;
                      end.


                    ExpandedWrap disabled
                      unit Unit2;
                      interface
                      uses
                        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                        Dialogs, StdCtrls;
                      type
                        TForm2 = class(TForm)
                          Edit: TEdit;
                          procedure FormClose(Sender: TObject; var Action: TCloseAction);
                        private
                          { Private-Deklarationen }
                        public
                          { Public-Deklarationen }
                        end;
                      var
                        Form2: TForm2;
                      implementation
                      {$R *.dfm}
                      procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
                      begin
                           Action := caFree;
                           Form2 := nil;
                      end;
                      end.

                    у меня никаких ошибок нет, следовательно я так понимаю проблема ни в самом открытии а в том что ты при этом открытии делаешь дополнительно. Пройдись дебагером от начала создания до конца открытия формы...
                      Вот так совпадение. Прям сейчас с той же проблемой сталкнулся. Код точно такой же.
                      AV появляется если я в TForm2.FormCreate хочу задать этой же форме позицию на экране или же присвоить ей другие значения.

                      ExpandedWrap disabled
                        Ini := TIniFile.Create(ShellDir('AppData')+'\LinkCollector\Config.ini');
                            try
                               form2.Top:=ini.ReadInteger('Program','Top', 100); // Если эти две сторочки убать
                               form2.Left:=ini.ReadInteger('Program','Left',100); // то проблема исчезает
                            finally
                             ini.Free;
                            end;

                      Но как в таком случае регулировать ее позицию?


                      Все вроде, решил проблему заменив код создания формы с
                      ExpandedWrap disabled
                               if not assigned(form2) then
                                    form2:=tform2.Create(self);
                               form2.Show;


                      на этот
                      ExpandedWrap disabled
                               if not assigned(form2) then
                                    Application.CreateForm(TForm2, Form2);
                               Form2.Show;
                      Сообщение отредактировано: AnalogXP -
                        Цитата AnalogXP @
                        Вот так совпадение. Прям сейчас с той же проблемой сталкнулся. Код точно такой же.
                        AV появляется если я в TForm2.FormCreate хочу задать этой же форме позицию на экране или же присвоить ей другие значения.

                        ExpandedWrap disabled
                          Ini := TIniFile.Create(ShellDir('AppData')+'\LinkCollector\Config.ini');
                              try
                                 form2.Top:=ini.ReadInteger('Program','Top', 100); // Если эти две сторочки убать
                                 form2.Left:=ini.ReadInteger('Program','Left',100); // то проблема исчезает
                              finally
                               ini.Free;
                              end;

                        Но как в таком случае регулировать ее позицию?


                        Все вроде, решил проблему заменив код создания формы с
                        ExpandedWrap disabled
                                 if not assigned(form2) then
                                      form2:=tform2.Create(self);
                                 form2.Show;


                        на этот
                        ExpandedWrap disabled
                                 if not assigned(form2) then
                                      Application.CreateForm(TForm2, Form2);
                                 Form2.Show;

                        да реально "тупость" почему-то дочерней форме нельзя задавать размер :wall:

                        Вызывает ошибку вот эта запись: :whistle:
                        ExpandedWrap disabled
                          procedure TForm2.FormCreate(Sender: TObject);
                          begin
                          form2.Width:=540;
                          form2.Height:=360;
                          end;


                        гы :lol: комментируешь и всё работает :lol:
                        так

                        ExpandedWrap disabled
                          procedure TForm2.FormCreate(Sender: TObject);
                          begin
                          //form2.Width:=540;
                          //form2.Height:=360;
                          end;

                        всем псб... ;)
                          AnalogXP, Demon:-)
                          Ну вы и чудаки, однако :D
                          Кто же в FormCreate обращается к "левой" переменной form2 ?! Нужно же с self работать, т.е. просто писать
                          ExpandedWrap disabled
                            procedure TForm2.FormCreate(Sender: TObject);
                            begin
                              {form2.}Width:=540;
                              {form2.}Height:=360;
                            end;

                          PS. Вот вам и разница между TForm2.Create и Application.CreateForm:
                          TForm2.Create вызывает TObject.NewInstance, затем Create и FormCreate, и только после этого происходит присвоение значения переменной form2. Т.е. во время выполнения FormCreate form2 еще не присвоено и = Nil !!!
                          А вот Application.CreateForm вызывает TObject.NewInstance, сразу присваивает значение form2 и только после этого вызывает Create и FormCreate с уже установленным значением form2
                          Сообщение отредактировано: leo -
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0546 ]   [ 16 queries used ]   [ Generated: 29.07.25, 20:17 GMT ]