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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.02.2014, 16:58
Аватар для vah-smile
vah-smile vah-smile вне форума
Новичок
 
Регистрация: 16.02.2009
Адрес: Украина
Сообщения: 67
Репутация: -53
По умолчанию Динамический Label + onClick

Здравствуйте!
Есть поле Label которое создается автоматически:

Код:
  title[i]:= TLabel.Create(ScrollBox1);
  title[i].Parent := ScrollBox1;
  title[i].Top := padding_top;
  title[i].Left := image_size+middle;
  title[i].Caption := t;
  title[i].Font.Style := [fsBold];
  title[i].Font.Size:=13;
  title[i].Visible:= true;

Вопрос: как задать для title[i] (TLabel) свойство onClick?

Код:
title[i].OnClick:=ShellExecute (Handle, 'open', 'C:\file.doc', nil, nil, SW_SHOWNORMAL);

Этот код выдает ошибку:

Код:
Build
  [Error] main_form.pas(112): Incompatible types: 'TNotifyEvent' and 'Cardinal'
  [Fatal Error] Project.dpr(5): Could not compile used unit 'main_form.pas'
Ответить с цитированием
  #2  
Старый 25.02.2014, 17:12
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
...
title[i].OnClick:= MyClick;
...
Procedure TForm1.MyClick(Sender:TObject);
begin
ShellExecute (Handle, 'open', 'C:\file.doc', nil, nil, SW_SHOWNORMAL);
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
vah-smile (25.02.2014)
  #3  
Старый 25.02.2014, 17:27
Аватар для vah-smile
vah-smile vah-smile вне форума
Новичок
 
Регистрация: 16.02.2009
Адрес: Украина
Сообщения: 67
Репутация: -53
По умолчанию

Цитата:
Сообщение от Alegun
Код:
...
title[i].OnClick:= MyClick;
...
Procedure TForm1.MyClick(Sender:TObject);
begin
ShellExecute (Handle, 'open', 'C:\file.doc', nil, nil, SW_SHOWNORMAL);
end;

Большое СПАСИБО!
Я, просто, думал код загнать в одну строку, а получается, что для реализации этого вопроса нужно сделать свою процедуру для клика
Ответить с цитированием
  #4  
Старый 25.02.2014, 17:36
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от vah-smile
...получается, что для реализации этого вопроса нужно сделать свою процедуру для клика
Самое удивительное так это то, что можно задать всего лишь одну процедуру для всех динамических "побратимов", достаточно сделать так
Код:
...
title[i].Tag:= i;
title[i].OnClick:= MyClick;
...
Procedure TForm1.MyClick(Sender:TObject);
begin
case (Sender as TLabel).Tag of
1: // действие 1 
2: // действие 2
3: // действие 3
   // итд.
...
end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
vah-smile (25.02.2014)
  #5  
Старый 25.02.2014, 18:37
Аватар для vah-smile
vah-smile vah-smile вне форума
Новичок
 
Регистрация: 16.02.2009
Адрес: Украина
Сообщения: 67
Репутация: -53
По умолчанию

Извините за нубский вопрос (не хочу открывать новую тему): а как теперь передать в процедуру MyClick свою переменную?

Код:
procedure MyClick(Sender:TObject; var doc: string);
..........
file_name:='C:\file.doc';
title[i].OnClick:=MyClick (file_name);
Ответить с цитированием
  #6  
Старый 25.02.2014, 20:09
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от vah-smile
...как теперь передать в процедуру MyClick свою переменную?
Напрямую никак - обрабатывается ведь клик от мышки, (а в неё наука вживлять данные пока ещё не научилась, только вирусы :-) передается стандартный обработчик, но можно унаследовать потомка от TLabel и добавить ему своё текстовое поле, примерно так
Код:
...

  type
TMyLabel = class(TLabel)
private
 fTxt : string;
 published
   property MyText: string read fTxt write fTxt;
end;

...

var
title: array of TMyLabel;

...

title[i]:= TMyLabel.Create(ScrollBox1);
title[i].MyText:= 'C:\file.doc';

...

procedure MyClick(Sender:TObject);
begin
ShellExecute (Handle, 'open',(Sender as TMyLabel).MyText , nil, nil, SW_SHOWNORMAL);
end;
но согласитесь, кейсом это делать значительно проще
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
vah-smile (26.02.2014)
  #7  
Старый 26.02.2014, 12:17
Аватар для vah-smile
vah-smile vah-smile вне форума
Новичок
 
Регистрация: 16.02.2009
Адрес: Украина
Сообщения: 67
Репутация: -53
По умолчанию

Цитата:
Сообщение от Alegun
Код:
...

  type
TMyLabel = class(TLabel)
private
 fTxt : string;
 published
   property MyText: string read fTxt write fTxt;
end;

...

var
title: array of TMyLabel;

...

title[i]:= TMyLabel.Create(ScrollBox1);
title[i].MyText:= 'C:\file.doc';

...

procedure MyClick(Sender:TObject);
begin
ShellExecute (Handle, 'open',(Sender as TMyLabel).MyText , nil, nil, SW_SHOWNORMAL);
end;

СПАСИБО за помощь!

Единственная поправка: нужно перетворить тип String в PAnsiChar
Код:
procedure TForm1.MyClick(Sender:TObject);
var open_file: PAnsiChar;
begin
  open_file:=PAnsiChar((Sender as TMyLabel).MyText);
  ShellExecute (Handle, 'open', open_file, nil, nil, SW_SHOWNORMAL);
end;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter