Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1201058161
Буран
2008-01-23 06:16
2008.03.23
Помогите перевести dll на Си, пожалуйста?


15-1202741305
БарЛог
2008-02-11 17:48
2008.03.23
Статья о передаче файлов потоком


2-1203981939
чувак
2008-02-26 02:25
2008.03.23
помогите разобраться с mouse_event...


11-1186478815
kichrot
2007-08-07 13:26
2008.03.23
Уничтожение не модальной формы с Parent = nil


15-1202569817
korstin
2008-02-09 18:10
2008.03.23
Нынче заказчики пошли )))





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский