Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
ВнизКак обратиться к объекту на другой форме в нестандартном случае? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c