Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание дополнительной формы  (Прочитано 11038 раз)
0 Пользователей и 1 Гость смотрят эту тему.
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« : 07-01-2009 21:43 » 

Возникла мне непонятная проблема. Сижу с утра. Уже и Delphi переустановил...
Ясно, что моих скромных знаний недостаточно.
 Хочу добавить еще одну форму. Все делаю,  как написано в учебнике. Добавляю Form2,
объявляю ее в разделе доступных форм, в разделе implementation для Unit1 указываю uses Unit2,
 а для Unit2 указываю uses Unit1.  Компилятор со всем согласен.
При попытке показать форму (Form2.Show;), при обработке события OnClick кнопки, установленной на Form1, выскакивает сообщение - 

(Project Project1.exe raised exception class EAccessViolation with message 'Access
violation at address 004458A6 in module 'Project1.exe of address 000002F4'.
Process stopped.)

При других операциях с формой - сообщение то-же, только меняются адреса.
Delphi7, операционная система - XP.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-01-2009 21:48 » 

fredi5, быстрее всего ошибка твоя. Copy-paste не делал?
И вообще, гадать на кофейной гуще: что-то сделал, что-то вылетело - согласись, не спортивно. Покажи код и тогда будем думать. Ведь мало ли что выдает ошибку. Вообще, привыкай пользоваться отладчиком: жми F5 (установить/снять точку останова) на нужной строке и F9 (запуск).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 07-01-2009 21:52 » 

Форма создаётся, прежде чем используется?
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 07-01-2009 22:03 » 

При перекрёстных ссылках модулей:
Ссылка в одном модуле д.б. в разделе interface, а в другом модуле в разделе implementation.
Лучше конечно дай текст программы, что бы зря не теоретизировать, но такие сообщения возникают при обращениии по несуществующему адресу. Вроде попытки присвоения значения внутренней для процедуры переменной типа String.
Записан
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 07-01-2009 22:08 » 

Форма создается, прежде чем используется. Про код сказать почти нечего т.к. он состоит
из события обработки только одной кнопки.
На Form1 всего одна кнопка, Form2 - пустая.
Записан
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 07-01-2009 22:20 » 

Не хотел занимать много места.
 
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.Show ;
end;
end.
еще
Код:
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
end.
и еще
Код:
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.
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 07-01-2009 22:30 » 

Form2 - не создаётся автоматически, удалена из автосоздаваемых форм в опциях проекта.
Поэтому при обработке клика кнопки в Form1 - Form2.Show вызывает обращение по несуществующему адресу.
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #7 : 07-01-2009 22:36 » 

Можно добавить  в Project1 после
Application.CreateForm(TForm1, Form1);
еще и это
Application.CreateForm(TForm2, Form2);

Записан
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 07-01-2009 22:51 » 

Значит не нужно было добавлять форму2 в список доступных. Видимо я не так понял процесс ее создания.
Оставил эту форму в списке автосоздания и ... все заработало !!!!

СПАСИБО.

P.S. Я думал, что только один не сплю в это время суток.
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 09-01-2009 16:58 » new

Автором темы неправильно понимается настройка опций.
Формы не добавляются в список доступных. Они удаляются из списка автосоздания, и в результате становятся доступными для включения в него. Т.е. появляются в списке доступных.
Просто добрый дядя Борланд решил, что все формы заданные в проекте, должны создаваться автоматиченски. Но потом подумал и дал возможность разработчику самому решать когда создавать формы.
Т.е. кроме варианта автосоздания, можно (естественно убрав форму из списка автосоздания) использовать следующий код обработки TForm1.Button1Click:
Код:
    Form2:=TForm2.Create(Self);
    Form2.Show
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines