Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизДоступ к форме Найти похожие ветки
← →
zokzok © (2004-12-29 15:09) [0]есть три формы: из 1й открывается (ShowModal) 2я, из 2й - 3я (ShowModal). При этом необходимо иметь доступ из 3й формы во 2ю, но получается, что 2я форма (при обращении к ней из Form3) равна NIL!!! Но аналогичным способом Form1 совершенно свободно доступна из Form2. Как при такой ситуации получить доступ к Form2 из Form3?
← →
msguns © (2004-12-29 15:10) [1]А как ты обращаешься ?
← →
Digitman © (2004-12-29 15:12) [2]
> но получается, что 2я форма (при обращении к ней из Form3)
> равна NIL
хреново получается.
надо. видимо, исправлять ошибки/недостатки алгоритма.
← →
zokzok © (2004-12-29 16:27) [3]
> А как ты обращаешься ?
ну так, например:
Unit2.Form2.caption := "string" (из Form3)
> ошибки/недостатки алгоритма.
если написать так: Unit1.Form1.caption := "string" (из Form2) всё работает идеально. Обе формы 2 и 3 создаются совершенно одинаково. Я всё проверял на нулевом проекте (без добавления лишнего) - с 2мя формами работает, с 3мя - нет.
← →
Symb (2004-12-29 16:35) [4]Код нулевого проекта - в студию!
← →
Digitman © (2004-12-29 16:37) [5]
> Код нулевого проекта - в студию!
"Эт точно !" (С) Павел Артемьич
))
← →
Fay © (2004-12-29 16:40) [6]2 zokzok © (29.12.04 16:27) [3]
Delphi Started Edition ? 8)
← →
zokzok © (2004-12-29 16:50) [7]
unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, 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);
var modal: TForm2;
begin
Modal:=TForm2.Create(Application);
try
Modal.ShowModal
finally
Modal.Free
end;
end;
end.
{----------------------------------------------}
unit2.pas
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit3, unit1;
{$R *.DFM}
procedure TForm2.Button1Click(Sender: TObject);
var modal: TForm3;
begin
Modal:=TForm3.Create(Application);
try
Modal.ShowModal
finally
Modal.Free
end;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Unit1.Form1.Caption := "string"
{здесь - работает}
end;
end.
{----------------------------------------------}
unit3.pas
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses unit2;
{$R *.DFM}
procedure TForm3.Button1Click(Sender: TObject);
begin
Unit2.Form2.Caption := "string"
{вот здесь вся проблема}
end;
end.
← →
Fay © (2004-12-29 16:55) [8]Form2 нигде не инициализируется.
← →
Symb (2004-12-29 16:55) [9]В Unit2 есть переменная Form2, но в приведенном куске кода ее конструктор нигде не вызывался. Если она не создавалась и в DPR, то она будет равна nil.
← →
Fay © (2004-12-29 16:56) [10]>> не создавалась и в DPR
?!
← →
Symb (2004-12-29 17:06) [11]Ну, у тебя три модуля: unit1.pas, unit2.pas и unit3.pas. И еще есть один файл проекта: Project1.DPR или что-то типа того. Там тоже дельфевый код, который может что-то делать (например, создавать формы).
А в Unit1 ты создаешь экземпляр класса TForm2 под названием Modal, а не Form2.
← →
zokzok © (2004-12-29 17:08) [12]
program Project1;
uses
Forms,
Unit1 in "Unit1.pas" {Form1},
Unit2 in "Unit2.pas" {Form2},
Unit3 in "Unit3.pas" {Form3};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.Run;
end.
всё равно не работает
← →
Fay © (2004-12-29 17:18) [13]2 Symb (29.12.04 17:06) [11]
Sorry. Меня просто замкнуло малость - dpr c dfm перепутал 8)
← →
Symb (2004-12-29 17:19) [14]А вторая форма точно равна nil? Т. е. Delphi выдает соответствующую runtime-ошибку?
Или просто caption не изменяется?
← →
Fay © (2004-12-29 17:22) [15]А так?
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 :=TForm3.Create(Application);
try
Form3.ShowModal
finally
Form3.Free;
end;
end;
← →
Fay © (2004-12-29 17:37) [16]Ёжик задумался...
← →
Плохиш © (2004-12-29 17:38) [17]2zokzok
Я так понимаю, читать книжки это не для реальных пацанов, а для последних лохов.
← →
begin...end © (2004-12-29 17:40) [18]> [16] Fay © (29.12.04 17:37)
Какой ёжик?
← →
Symb (2004-12-29 17:41) [19]2 Fay © (29.12.04 17:37) [16]
Наверное, мы слишком много информации для переваривания сразу насыпали :)
← →
GuAV © (2004-12-29 17:50) [20]Form2 не тем инициализируется.
> Modal:=TForm2.Create(Application);
здесь в Modal одна TForm2
> Application.CreateForm(TForm2, Form2);
а здесь в Form2 другая.
а чтоб там nil - эт" врядли ...
← →
Fay © (2004-12-29 17:52) [21]При
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
замени всеprocedure TFormX.Button1Click(Sender: TObject);
var
Jopa : TFormY;
begin
Jopa := TFormY.Create(Application);
try
Jopa.ShowModal;
finally
Jopa.Free;
end;
end;
наFormY.ShowModal;
и проверь
← →
HSolo © (2004-12-29 18:20) [22]Глобальные переменные противоречат моему эстетическому чуйству :)
Лучше попробуйте так:
unit2.pas
...
implementation
uses unit3;
...
procedure TForm2.Button1Click(Sender: TObject);
begin
with TForm3.Create(Self) do
try
ShowModal
finally
Free
end;
end;
{----------------------------------------------}
unit3.pas
...
implementation
uses unit1;
...
procedure TForm3.Button1Click(Sender: TObject);
begin
(owner as TForm2).Caption := "string";
end;
← →
HSolo © (2004-12-29 18:22) [23]sorry, конечно же
unit3.pas
...
implementation
uses unit2;
← →
Fay © (2004-12-29 18:24) [24]2 HSolo © (29.12.04 18:22) [23]
Да не боись! Мы, типа, догадались, что Unit2 юзается в interface 8)
← →
HSolo © (2004-12-29 18:32) [25]>Fay © (29.12.04 18:24) [24]
Ну мало ли :) чем черт не шутит, когда бог спит :)
← →
maxz © (2004-12-29 19:59) [26]возможно ошибка в том, что у вас два юнита ссылаются друг на друга из implementation
← →
Fay © (2004-12-29 20:14) [27]2 maxz © (29.12.04 19:59) [26]
А что, бывают run-time ошибки такого рода?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.036 c