![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обратиться к объекту на другой форме в нестандартном случае? [D7, XP]
Dymok © (2008-02-20 11:13:00)Проект можно скачать по адресу http://ifolder.ru/5425321(9кб - архив)
Цель:Хочу реализовать интерфейс приложения немного нестандартным для делфей способом - сделать так, чтобы все формы открывались на главной, а не сами по себе. Похожим образом сделаны многие профессиональные приложения (например антивирус Касперского). Похоже на главную форму с дочерними но не совсем.
Возникла проблема - как обратиться из формы fModal к объекту на форме fTest - в событииprocedure TfModal.Button1Click(Sender: TObject);естественно вылетает ошибка Access violation....
Как же обратиться к объекту на форме fTest?
Может кто знает, как еще можно реализовать такой интерфейс приложения?
Германн (2008-02-21 01:16:00) [1]
> Как обратиться к объекту на другой форме в нестандартном
> случае?
Мне кажется что термин "нестандартный" в данном случае есть эквивалент термину "перанальный". Или я не прав?
Игорь Шевченко (2008-02-20 23:20:00) [2]Dymok © (20.02.08 11:13)
> Проект можно скачать по адресу http://ifolder.ru/5425321
> (9кб - архив)
Ты крайне невежлив. Это плохо кончится.
Leonid Troyanovsky (2008-02-20 22:25:00) [3]
> Сергей М. © (20.02.08 20:34) [15]
> Оных нет и в любых иных формах, будь они хоть хренически
> создаваемые)
> Так что чрезмернось (см. Leonid Troyanovsky © (20.02.08
> 19:41) [14]) есть великое волшебство)
Какое уж тут волшебство.
Сомнения в динамичности или, собс-но, чрезмерности?
--
Regards, LVT.
Сергей М. (2008-02-20 20:34:00) [4]
> В динамически создаваемых формах нет uses
Оных нет и в любых иных формах, будь они хоть хренически создаваемые)
Извините за еще большую тупость, но uses имеет отношение только к compile-time)
Так что чрезмернось (см. Leonid Troyanovsky © (20.02.08 19:41) [14]) есть великое волшебство)
Leonid Troyanovsky (2008-02-20 19:41:00) [5]
> oldman © (20.02.08 14:43) [13]
> В динамически создаваемых формах нет uses!!!!!!!
Лишь в случае чрезмерно динамически созданных.
Крики извинить не можем, извини.
--
Regards, LVT.
oldman (2008-02-20 14:43:00) [6]А!!!!!!!
Дошло!!!!!!!!
В динамически создаваемых формах нет uses!!!!!!!
:)))
Извини за тупость...
oldman (2008-02-20 14:41:00) [7]
> OldMan, проблема была - как обратиться к объекту формы,
> владельцем которой является Panel главной формы, с другой,
> модальной формы.
Проблема понятна.
Причем, главная форма создается раньше модальной, надеюсь?
Значит, uses уже катит.
dymok (2008-02-20 14:19:00) [8]OldMan, проблема была - как обратиться к объекту формы, владельцем которой является Panel главной формы, с другой, модальной формы. Причём форма создавалась TopicForm:=TfTest.Create(Self); через некую переменную, общую для нескольких подобных форм переменную.
Понятно?! :)
По-русски: Эй, Вы Label1, да-да, это я Вам, которому расположеному на форме fTest, и меня не волнует что fTest не существует, что вы живёте по поддельным документам (TopicForm). Так что не надо мне тут делать удивлённые глаза (Access violation at address ...), а скажите мне лучше Caption:='привет';
:)))))
oldman (2008-02-20 13:39:00) [9]
> dymok © (20.02.08 12:59) [9]
> oldman - скачай проект - всё поймёшь
Без обид -
Ну почему вместо того, чтобы внятно объяснить проблему,
некоторые люди просят разобраться в куче их кода для поиска одной ошибки?
Тем более, что даже если я скачаю (непонятно что, кстати) не факт, что компильну. У меня D5.
:)
dymok (2008-02-20 12:59:00) [10]Спасибо Рамилю - работает!
Особое спасибо Семёнычу - за подробный ответ. Да, так, как вы говорите - лучше
oldman - скачай проект - всё поймёшь
Семеныч (2008-02-20 12:50:00) [11]> Dymok © (20.02.08 11:13)
Насчет "нестандартного случая". Никакого нестандартного случая здесь нет. Неважно, где лежит форма - на другой форме, на панели, на Рабочем Столе или где-то еще. Все равно обращение к ней происходит стандартным образом:
1. На момент обращения форма должна быть уже создана.
2. Ссылка (переменная, поле, свойство и т.д.), через которую происходит обращение, должна быть правильно инициализирована.
И то же самое касается не только форм, а вообще всех объектов.
oldman (2008-02-20 12:42:00) [12]
> Как обратиться к объекту на другой форме
Может я ничего не понимаю?
Unit1
uses Unit2
Tform2.Label1.Caption:='О!!! Ко мне обратились!'
Семеныч (2008-02-20 12:36:00) [13]> 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;
Рамиль (2008-02-20 12:11:00) [14]Где в приведенном коде
fTest :=
Надо не with fTest, TopicForm do
with TfTest(TopicForm) убедившись сначала, что TopicForm содержит ссылку на экземпляр TfTest.
Dymok (2008-02-20 11:49:00) [15]
Семеныч (20.02.08 11:20) [3]
// Здесь доступна переменная fTest
Переменная то доступна, при компиляции ошибок нет, ошибка - при выполнении (нажатии на кнопку TfModal.Button1Click).
Понятное дело, что переменную fTest, fTest1... fTestN-ая мы для удобства реализации не создаём, т.к. их может быть много, не понятно какую надо будет уничтожать. Поэтому идём через переменную TopicForm, общую для всех, но даже если объявить её в секции public, и потом обращатьсяwith fTest, TopicForm doто это всё равно не поможет...
Семеныч (2008-02-20 11:20:00) [16]
unit uTest;
interface
...
var
fTest: TfTest;
...
end.
unit uModal;
...
implementation
uses
uTest;
// Здесь доступна переменная fTest.
// Например: fTest.Edit1.Text := 'Привет от Семеныча'
...
end.
Рамиль (2008-02-20 11:20:00) [17]Что значит естественно?
Скорее всего объект не создан.
oldman (2008-02-20 11:16:00) [18]
> Возникла проблема - как обратиться из формы fModal к объекту
> на форме fTest - в событии procedure TfModal.Button1Click(Sender:
> TObject); естественно вылетает ошибка Access violation.
> ..
Покажи, как обращаешься.