Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2007, 15:28   #1
dars73
 
Регистрация: 06.11.2007
Сообщений: 8
По умолчанию Управление Программно созданными объектами

Добрый день уважаемые Гуру.
столкнулся с проблемой у меня кусок кода создает программно объекты типа TEdit
Код:
////////////////////////////////////////////////////////
procedure TForm3.Image1Click(Sender: TObject);
//Установка обьекта на  изображении
var MyEdit:TEdit;
begin
i:=i+1;
MyEdit:=TEdit.Create(self);
MyEdit.Name:=Format('MyEdit%d',[i]);
with TEdit(FindComponent(Format('MyEdit%d',[i]))) do
begin
Parent:=Form3;
Left:=mouse.CursorPos.X-form3.Left-4;
Top:=mouse.CursorPos.y-form3.Top-50;
Visible:=true;
parentcolor:=true;
end;
end;
//////////////////////////////////////////////////////////////////
после коздания объекта мне нужно его перемещать по форме. нашел вот такую статью:

//////////////////////////////////////////////////////////////////////////////
Для того, чтобы переместить какой-нибудь компонент (визуальный конечно же) нам необходимо послать компоненту соответствующее сообщение, с помощью метода Perform. Это делается примерно так:

ReleaseCapture;
edit1.Perform(WM_SYSCOMMAND, $F012, 0);

Все это надо записать в обработчик события OnMouseDown для нужного компонента, в данном случае это TEdit. И тогда при нажатии на компонент на экране появится контур компонента, когда вы выберите подходящее место и отпустите кнопку, компонент переместится туда!

Вот такой простой и красивый способ!
////////////////////////////////////////////////////////////////////////////

но этод способ описан к фексированно установленному компоненту.
как это можно связать этот метод с мои кодом?

и как например в созданый объект Edit внести текст.

большое спасибо за любые отклики.

Используйте тег СODE для оформления листингов - кнопка #. Модератор

Последний раз редактировалось AlDelta; 06.11.2007 в 17:27.
dars73 вне форума Ответить с цитированием
Старый 06.11.2007, 15:45   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

var NewEdit: TEdit;

NewEdit.create(self);... и т.д.
NewEdit.OnMouseDown := OldEdit.OnMouseDown;

Событие OnMouseDown для OldEdit должно существовать.
_SERGEYX_ вне форума Ответить с цитированием
Старый 07.11.2007, 02:08   #3
dars73
 
Регистрация: 06.11.2007
Сообщений: 8
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
var NewEdit: TEdit;

NewEdit.create(self);... и т.д.
NewEdit.OnMouseDown := OldEdit.OnMouseDown;

Событие OnMouseDown для OldEdit должно существовать.
спасибо за ответ. Но нельзя бы с примерчиком .
А то у меня пишет OldEdit не декларирована.
и в справке не нашел что это за вещь.
dars73 вне форума Ответить с цитированием
Старый 07.11.2007, 08:37   #4
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
Восклицание

Цитата:
Сообщение от dars73 Посмотреть сообщение
спасибо за ответ. Но нельзя бы с примерчиком .
А то у меня пишет OldEdit не декларирована.
и в справке не нашел что это за вещь.
OldEdit???
Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Событие OnMouseDown для OldEdit должно существовать.
OldEdit - какой-то другой Edit, его по сути может и не быть, а вот событие OnMouseDown должено соответствовать методу OnMouseDown класса TEdit.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 07.11.2007, 12:04   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Попробую совсем просто объяснить.
Киньте на форму TEdit и задайте ему имя OldEdit.
Теперь в том же инспекторе объектов переключитесь на вкладку событий и задайте обработчик события OldEdit.OnMouseDown, т.е. впишите туда
Код:
ReleaseCapture;
(Sender as TEdit).Perform(WM_SYSCOMMAND, $F012, 0);
Теперь удалите компонент OldEdit. Сам компонент больше не существует, а вот нужное вам событие OldEdit.OnMouseDown в тексте осталось и вы его можете использовать.
Обратите внимание на параметр (Sender as TEdit).
Он означает, что этот обработчик вы можете назначить любому созданному TEdit-у, независимо от того, какое имя вы ему дали, поскольку обращение производится по имени класса.
mihali4 вне форума Ответить с цитированием
Старый 07.11.2007, 14:42   #6
dars73
 
Регистрация: 06.11.2007
Сообщений: 8
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Попробую совсем просто объяснить.
Киньте на форму TEdit и задайте ему имя OldEdit.
Теперь в том же инспекторе объектов переключитесь на вкладку событий и задайте обработчик события OldEdit.OnMouseDown, т.е. впишите туда
Огромное спасибо Все прекрасно работает!!!

А подскажите пожалуйста. если я создаю события для реально установленного компонента на форме, то я могу переприсваивать их к динамически созданным в процессе выполнения программы. Достаточно просто сделать их невидимыми чтобы не путались под ногами?

и еще вопрос, Если не сильно надоел ,

можно ли как то отследить у динамических обьектов на ком из них был выполнен клик мышью?

тоесть например три MyEdit созданные программно.
нужно что бы текст менял цвет в том объекте на котором я кликну мышью. если это конечно реально.

Спасибо всем.
ВЕК ЖИВИ И ВЕК УЧИСЬ!!!
dars73 вне форума Ответить с цитированием
Старый 07.11.2007, 15:45   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Достаточно просто сделать их невидимыми чтобы не путались под ногами
Если они вам больше не понадобятся, их можно просто удалить. Как уже говорилось, созданные вами обработчики при этом никуда не денутся.
Цитата:
можно ли как то отследить у динамических обьектов на ком из них был выполнен клик мышью?
Конечно, можно.
Например:
Код:
if (Sender as TEdit).Name='MyEdit1' then
(Sender as TEdit).Font.Color:=clRed else
if (Sender as TEdit).Name='MyEdit2' then
(Sender as TEdit).Font.Color:=clGreen else
if (Sender as TEdit).Name='MyEdit3' then
(Sender as TEdit).Font.Color:=clBlue;
mihali4 вне форума Ответить с цитированием
Старый 08.11.2007, 05:04   #8
dars73
 
Регистрация: 06.11.2007
Сообщений: 8
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Конечно, можно.
Например:
Код:
if (Sender as TEdit).Name='MyEdit1' then
(Sender as TEdit).Font.Color:=clRed else
if (Sender as TEdit).Name='MyEdit2' then
(Sender as TEdit).Font.Color:=clGreen else
if (Sender as TEdit).Name='MyEdit3' then
(Sender as TEdit).Font.Color:=clBlue;
Как я правильно вас понял я должен проверять все 300-400 объектов

которые создает программа, через условие If и реальное имя MyEdit1,MyEdit2,.......

а как нибудь это зациклить можно?
или это единственный способ?

Большое спасибо всем за совместные обьяснения.
dars73 вне форума Ответить с цитированием
Старый 08.11.2007, 07:52   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
300-400 объектов
Зачем столько много? Уж не проще ли их заменить каким нить гридом?
По теме, перебрать все эдиты на форме мона так:

for i:=0 to componentcount-1 do
if components[i] is Tedit then <Это Эдит>
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.11.2007, 08:04   #10
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

А можно перебор осуществить и по-другому:
Код:
for n:=1 to i do
_if (Sender as TEdit).Name='MyEdit'+inttostr(n) then
__DoSomething;
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с классами и объектами Shavminator Общие вопросы Delphi 7 18.12.2009 04:11
Как заполнить форму 6-иугольными объектами DeKot Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 26.08.2008 21:59
Взаимодействие ListView с рукописными объектами. Turbine Общие вопросы Delphi 1 15.08.2008 11:27
Взаимодействие ListView с другими объектами. Передача Turbine Компоненты Delphi 0 13.08.2008 22:40
Управление TChar программно Sanprof Общие вопросы Delphi 5 18.02.2008 20:06