Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Доступ к форме   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
14-1104244484
stud
2004-12-28 17:34
2005.01.16
1с и как с ней бороться))


1-1104314237
denis24
2004-12-29 12:57
2005.01.16
Поток и переменная


3-1102603978
Rule
2004-12-09 17:52
2005.01.16
Как добраться до TDataLink


3-1102622483
serko
2004-12-09 23:01
2005.01.16
DBGridEh


14-1103817997
ArMellon
2004-12-23 19:06
2005.01.16
Как работать в делфи с форматом kar?