Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.061 c
4-1101469577
Unknown user
2004-11-26 14:46
2005.01.16
try except...


1-1103098374
kingdom
2004-12-15 11:12
2005.01.16
Как найти пересечение фигур


1-1104266948
RSN
2004-12-28 23:49
2005.01.16
Фокус ввода


1-1104023591
Narik
2004-12-26 04:13
2005.01.16
Inifiles


11-1084974886
Terminus
2004-05-19 17:54
2005.01.16
KOLTabControl это еще не PageControl :). Есть вопрос...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский