Да, без проблем
Код:
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?