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

Вниз

Как обратиться к объекту на другой форме в нестандартном случае?   Найти похожие ветки 

 
Dymok ©   (2008-02-20 11:13) [0]

Проект можно скачать по адресу http://ifolder.ru/5425321 (9кб - архив)

Цель: Хочу реализовать интерфейс приложения немного нестандартным для делфей способом - сделать так, чтобы все формы открывались на главной, а не сами по себе. Похожим образом сделаны многие профессиональные приложения (например антивирус Касперского). Похоже на главную форму с дочерними но не совсем.

Возникла проблема - как обратиться из формы fModal к объекту на форме fTest - в событии procedure TfModal.Button1Click(Sender: TObject); естественно вылетает ошибка Access violation... .

Как же обратиться к объекту на форме fTest?
Может кто знает, как еще можно реализовать такой интерфейс приложения?


 
oldman ©   (2008-02-20 11:16) [1]


> Возникла проблема - как обратиться из формы fModal к объекту
> на форме fTest - в событии procedure TfModal.Button1Click(Sender:
>  TObject); естественно вылетает ошибка Access violation.
> ..


Покажи, как обращаешься.


 
Рамиль ©   (2008-02-20 11:20) [2]

Что значит естественно?
Скорее всего объект не создан.


 
Семеныч   (2008-02-20 11:20) [3]


unit uTest;
interface
...
var
 fTest: TfTest;
...
end.

unit uModal;
...
implementation
uses
 uTest;
 //  Здесь доступна переменная fTest.
 // Например: fTest.Edit1.Text := "Привет от Семеныча"
...
end.


 
Dymok ©   (2008-02-20 11:49) [4]


Семеныч   (20.02.08 11:20) [3]
//  Здесь доступна переменная fTest


Переменная то доступна, при компиляции ошибок нет, ошибка - при выполнении (нажатии на кнопку TfModal.Button1Click).
Понятное дело, что переменную fTest, fTest1... fTestN-ая  мы для удобства реализации не создаём, т.к. их может быть много, не понятно какую надо будет уничтожать. Поэтому идём через переменную TopicForm, общую для всех, но даже если объявить её в секции public, и потом обращаться with fTest, TopicForm do то это всё равно не поможет...


 
Рамиль ©   (2008-02-20 12:11) [5]

Где в приведенном коде
fTest :=

Надо не with fTest, TopicForm do

with TfTest(TopicForm) убедившись сначала, что TopicForm содержит ссылку на экземпляр TfTest.


 
Семеныч   (2008-02-20 12:36) [6]

> Dymok ©   (20.02.08 11:49) [4]

Посмотрел проект. Ошибка в том, что переменная fTest нигде не инициализируется, а к ней происходит обращение из модальной формы.

Избегайте использования глобальных переменных, у новичков это одна из очень распространенных причин ошибок (вот и Вы на нее налетели). Лучше всего - выкиньте совсем переменные fTest, fTest2, fModal, fTopic и все им подобные. Когда их не станет, то сам компилятор начнет Вас заставлять писать "взрослый" код.

А решение, например, такое:

procedure TfTest.bfModalClick(Sender: TObject);
begin
 TfModal.Create(Self).ShowModal;
end;

procedure TfModal.Button1Click(Sender: TObject);
begin
 TfTest(Owner).Label1.Caption := "Привет от Семеныча";
end;


 
oldman ©   (2008-02-20 12:42) [7]


> Как обратиться к объекту на другой форме


Может я ничего не понимаю?

Unit1
 uses Unit2
   Tform2.Label1.Caption:="О!!! Ко мне обратились!"


 
Семеныч   (2008-02-20 12:50) [8]

> Dymok ©   (20.02.08 11:13)  

Насчет "нестандартного случая". Никакого нестандартного случая здесь нет. Неважно, где лежит форма - на другой форме, на панели, на Рабочем Столе или где-то еще. Все равно обращение к ней происходит стандартным образом:

1. На момент обращения форма должна быть уже создана.
2. Ссылка (переменная, поле, свойство и т.д.), через которую происходит обращение, должна быть правильно инициализирована.

И то же самое касается не только форм, а вообще всех объектов.


 
dymok ©   (2008-02-20 12:59) [9]

Спасибо Рамилю - работает!
Особое спасибо Семёнычу - за подробный ответ. Да, так, как вы говорите - лучше

oldman - скачай проект - всё поймёшь


 
oldman ©   (2008-02-20 13:39) [10]


> dymok ©   (20.02.08 12:59) [9]
> oldman - скачай проект - всё поймёшь


Без обид -
Ну почему вместо того, чтобы внятно объяснить проблему,
некоторые люди просят разобраться в куче их кода для поиска одной ошибки?

Тем более, что даже если я скачаю (непонятно что, кстати) не факт, что компильну. У меня D5.

:)


 
dymok ©   (2008-02-20 14:19) [11]

OldMan, проблема была - как обратиться к объекту формы, владельцем которой является Panel главной формы, с другой, модальной формы. Причём форма создавалась TopicForm:=TfTest.Create(Self); через некую переменную, общую для нескольких подобных форм переменную.
Понятно?! :)

По-русски: Эй, Вы Label1, да-да, это я Вам, которому расположеному на форме fTest, и меня не волнует что fTest не существует, что вы живёте по поддельным документам (TopicForm). Так что не надо мне тут делать удивлённые глаза (Access violation at address ...), а скажите мне лучше Caption:="привет";
:)))))


 
oldman ©   (2008-02-20 14:41) [12]


> OldMan, проблема была - как обратиться к объекту формы,
> владельцем которой является Panel главной формы, с другой,
>  модальной формы.


Проблема понятна.
Причем, главная форма создается раньше модальной, надеюсь?
Значит, uses уже катит.


 
oldman ©   (2008-02-20 14:43) [13]

А!!!!!!!
Дошло!!!!!!!!

В динамически создаваемых формах нет uses!!!!!!!

:)))

Извини за тупость...


 
Leonid Troyanovsky ©   (2008-02-20 19:41) [14]


> oldman ©   (20.02.08 14:43) [13]

> В динамически создаваемых формах нет uses!!!!!!!

Лишь в случае чрезмерно динамически созданных.

Крики извинить не можем, извини.

--
Regards, LVT.


 
Сергей М. ©   (2008-02-20 20:34) [15]


> В динамически создаваемых формах нет uses


Оных нет и в любых иных формах, будь они хоть хренически создаваемые)

Извините за еще большую тупость, но uses имеет отношение только к compile-time)

Так что чрезмернось (см. Leonid Troyanovsky ©   (20.02.08 19:41) [14]) есть великое волшебство)


 
Leonid Troyanovsky ©   (2008-02-20 22:25) [16]


> Сергей М. ©   (20.02.08 20:34) [15]

> Оных нет и в любых иных формах, будь они хоть хренически
> создаваемые)

> Так что чрезмернось (см. Leonid Troyanovsky ©   (20.02.08
> 19:41) [14]) есть великое волшебство)

Какое уж тут волшебство.
Сомнения в динамичности или, собс-но, чрезмерности?

--
Regards, LVT.


 
Игорь Шевченко ©   (2008-02-20 23:20) [17]

Dymok ©   (20.02.08 11:13)  


> Проект можно скачать по адресу http://ifolder.ru/5425321
> (9кб - архив)


Ты крайне невежлив. Это плохо кончится.


 
Германн ©   (2008-02-21 01:16) [18]


> Как обратиться к объекту на другой форме в нестандартном
> случае?

Мне кажется что термин "нестандартный" в данном случае есть эквивалент термину "перанальный". Или я не прав?



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
3-1193829886
adamas
2007-10-31 14:24
2008.03.23
Клонирование набора данных!


15-1202182276
Rian
2008-02-05 06:31
2008.03.23
Как через Format выводить Float фиксированного размера?


2-1204035970
s_t_d
2008-02-26 17:26
2008.03.23
Масштаб просмотра для элемента QuickRep


2-1203867327
Рустам
2008-02-24 18:35
2008.03.23
работа в трее


2-1203715169
no
2008-02-23 00:19
2008.03.23
Case label outside of rang