Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.09.2018, 05:22
TEKTON TEKTON вне форума
Новичок
 
Регистрация: 14.03.2011
Сообщения: 60
Репутация: 10
По умолчанию Как обрабатывать Event*ы у динамически создаваемых обьектов?

Приветствую.

Есть динамически создаваемые Label*ы
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
    s:string;
   lb:array of TLabel;
begin
setlength(lb,Memo2.Lines.Count);
for i:=0 to Memo2.Lines.Count-1 do
 begin
  lb[i]:=TLabel.Create(Self);
  lb[i].Parent:=Form1;
  lb[i].Left:=8;
  lb[i].Top:=i*17;
  lb[i].Font.Size:=9;
  lb[i].Height:=12;
  lb[i].Width:=200;
  lb[i].WordWrap:=False;
  lb[i].Cursor:=crHandPoint;

  lb[i].Caption:=Pars('">',Memo2.Lines.Strings[i-1],'%%%');
 end;
end;
Из Memo парсятся строки и записываются в Caption*ы Label*ов.
Можно как то обработать Events тоже динамически ?
Что то типа:
Код:
procedure TForm1.lb[i]Click(Sender: TObject);
begin
ShellExecute(handle, 'open',pChar(Pars('%%%',Memo2.Lines.Strings[i-1],'">')), nil, nil, SW_SHOW);
end;
Что б в каждый Label спарсить свой Url и превратить его в гиперссылку.
Ну и обработать события:
lb[i].MouseDown,
lb[i].MouseUp,
lb[i].MouseLeave,
lb[i].MouseEnter

Что б можно было обрабатывать события мыши (если курсор над label5, подкрасить его в красный. Курсор ушёл вернуть цвет в синий.)
Спасибо.

Последний раз редактировалось TEKTON, 28.09.2018 в 05:25.
Ответить с цитированием
  #2  
Старый 28.09.2018, 17:08
F.o.x. F.o.x. вне форума
Прохожий
 
Регистрация: 16.06.2018
Сообщения: 14
Версия Delphi: 7, XE3
Репутация: 10
Сообщение

Да, без проблем

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
    s:string;
   lb:array of TLabel;
begin
setlength(lb,Memo2.Lines.Count);
for i:=0 to Memo2.Lines.Count-1 do
 begin
  lb[i]:=TLabel.Create(Self);
  lb[i].Parent:=Form1;
  lb[i].Left:=8;
  lb[i].Top:=i*17;
  lb[i].Font.Size:=9;
  lb[i].Height:=12;
  lb[i].Width:=200;
  lb[i].WordWrap:=False;
  lb[i].Cursor:=crHandPoint;
  
  // Определяем Tag
  
  lb[i].Tag:=i;

  // Определяем обработчики событий
  
  lb[i].OnMouseDown:=ALabelMouseDown;
  lb[i].OnMouseUp:=ALabelMouseUp;
  lb[i].OnMouseLeave:=ALabelMouseLeave;
  lb[i].OnMouseEnter:=ALabelMouseEnter;      
 
  lb[i].Caption:=Pars('">',Memo2.Lines.Strings[i-1],'%%%');
 end;
end;
Обработчики событий - точно такие же свойства, только процедурного типа.

При этом у формы должны быть определены эти четыре процедуры:
Код:
 
procedure ALabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
procedure ALabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
procedure ALabelMouseLeave(Sender: TObject); 
procedure ALabelMouseEnter(Sender: TObject);
А внутри обработчика используем Sender для обращения к объекту, вызвавшему событие. Примерно так:
Код:
procedure ALabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin
ShellExecute(handle, 'open',pChar(Pars('%%%',Memo2.Lines.Strings[(Sender as TLabel).Tag],'">')), nil, nil, SW_SHOW);
end;
И Вы точно уверены, что хотите использовать OnMouseDown и OnMouseUp вместо OnClick?
__________________
Соцпрофиль: vk.com/id401642609

Последний раз редактировалось F.o.x., 28.09.2018 в 17:37.
Ответить с цитированием
Этот пользователь сказал Спасибо F.o.x. за это полезное сообщение:
TEKTON (29.09.2018)
  #3  
Старый 29.09.2018, 19:14
TEKTON TEKTON вне форума
Новичок
 
Регистрация: 14.03.2011
Сообщения: 60
Репутация: 10
По умолчанию

У гипер ссылки (ту которую из label*a делаем), должно быть три состояния.
1) Не активная - цвет синий.
2) Когда курсор висит над лейблом, цвет текста подкрашивается в красный
(курсор ушёл, текст снова синий).
3) Посещённая ссылка - цвет сиреневый. (тут в принципе и на онклик можно повесить изменение цвета).
Вот нарыл такое
http://www.delphisources.ru/pages/fa...gyperlink.html
Посмотрю как там оно работает.
Но за код, всё равно спасибо.

P.S. глянул.
Вроде норм работает.
Но хочется подправить несколько моментов.
1) как пр.описать, что б курсор всегда имел crHandPoint
2)Ссылка подкрашивается красным тока в момент клика (сделать чтоб подкрашивалась когда курсор над ссылкой висит)
3)как поменять иконку ? Что б в палитре отличалась от простого лейбла
Спасибо.

Последний раз редактировалось TEKTON, 29.09.2018 в 20:29.
Ответить с цитированием
  #4  
Старый 29.09.2018, 21:48
F.o.x. F.o.x. вне форума
Прохожий
 
Регистрация: 16.06.2018
Сообщения: 14
Версия Delphi: 7, XE3
Репутация: 10
Сообщение

Цитата:
1) как пр.описать, что б курсор всегда имел crHandPoint
Добавить в конструктор компонента:
Код:
Cursor:=crHandPoint;

Цитата:
2)Ссылка подкрашивается красным тока в момент клика (сделать чтоб подкрашивалась когда курсор над ссылкой висит)
Код:
procedure TLink.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y:
  Integer);
begin
  if Button = mbLeft then FLinkColor := Font.Color;
  inherited;
end;

procedure TLink.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y:
  Integer);
begin
  if Button = mbLeft then Font.Color := FVLinkColor;
  inherited;
end;

procedure TLink.MouseLeave;
begin
  Font.Color := FLinkColor;
  inherited;
end;
Цитата:
3)как поменять иконку ? Что б в палитре отличалась от простого лейбла
Создать в делфийском ImageEditor`е свой dcr-файл с bitmap ресурсом своей картинки 24x24 пиксела x 256 бит (имя самого ресурса должно совпадать с именем класса компонента). Подключить этот файл в секции implementation
Код:
{$R ИмяФайла.dcr}
Левый верхний (или нижний?) пиксел bitmap`а считается фоновым цветом - т.е. прозрачным.
Если ИмяФайла совпадает с именем модуля, то ИмяФайла можно заменить на *
Если компонент в отдельном пакете, то лучше перенести подключение dcr непосредственно в dpk-файл.
__________________
Соцпрофиль: vk.com/id401642609

Последний раз редактировалось F.o.x., 29.09.2018 в 22:29.
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо F.o.x. за это полезное сообщение:
Guaho (30.09.2018), TEKTON (29.09.2018)
  #5  
Старый 29.09.2018, 22:25
TEKTON TEKTON вне форума
Новичок
 
Регистрация: 14.03.2011
Сообщения: 60
Репутация: 10
По умолчанию

Спасибо.
Цитата:
Сообщение от F.o.x.
...
Если компонент в отдельном пакете, то лучше перенести подключение dcr непосредственно в dpk-файл.
Я не настолько крут
Я вообще не знаю как эти DpK создавать, паковать
Ответить с цитированием
  #6  
Старый 29.09.2018, 22:45
F.o.x. F.o.x. вне форума
Прохожий
 
Регистрация: 16.06.2018
Сообщения: 14
Версия Delphi: 7, XE3
Репутация: 10
Сообщение

На самом деле это не сложно.

Если надо, то вот пример, там есть ссылка на скачивание. Инструкция по установке и описание тоже в архиве.
__________________
Соцпрофиль: vk.com/id401642609
Ответить с цитированием
Этот пользователь сказал Спасибо F.o.x. за это полезное сообщение:
TEKTON (30.09.2018)
  #7  
Старый 29.09.2018, 22:57
TEKTON TEKTON вне форума
Новичок
 
Регистрация: 14.03.2011
Сообщения: 60
Репутация: 10
По умолчанию

Наверно
Просто не сталкивался никогда с этим вообще.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter