Форум: "WinAPI";
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];
ВнизURL Найти похожие ветки
← →
Evgeny (2001-12-22 12:53) [0]Какие идеи имеются по компоненту URL, но полностью на WinAPI.
← →
Evgeny (2001-12-25 10:33) [1].
← →
panov (2001-12-25 10:44) [2]Вопрос для форума потрепаться?:-)
Если нет, то вопрос сформулируй получше.
← →
Evgeny (2001-12-25 14:37) [3]Хотелось бы создать компонент URL на основе STATIC, так как не хочется тащить всю тяжесть VCL, может у кого-нибудь имеются наметки на эту тему, или ссылки.
← →
Mick (2001-12-25 15:05) [4]Консольное приложение + Writeln(MyUrlString) не тащит "всю тяжесть VCL".
← →
Evgeny (2001-12-26 14:12) [5]Про консольное приложение и речи не было. Компонент я уже создал сам, но у меня осталась маленькая проблема.
Вот кусок от объекта
type
TOnEvent = procedure(Sender : TObject) of Object;
TUrlLabel = class
private
...
fOnOverURL : TOnEvent;
fOnURLClick : TOnEvent;
procedure SetOnURL(const Index: Integer; const Value: TOnEvent);
...
published
property Hint: String read fHint write SetHint;
property URL: String read fUrl write SetUrlText;
property OnOverURL: TOnEvent index 0 read fOnOverURL write SetOnURL;
property OnURLClick: TOnEvent index 8 read fOnURLClick write SetOnURL;
end;
procedure TUrlLabel.SetOnURL(const Index: Integer; const Value: TOnEvent);
begin
if Index = 0 then
fOnOverURL := Value
else
fOnURLClick := Value;
end;
А здесь вызов
var
Url : array[Byte] of TUrlLabel;
procedure UrlClick;
begin
MessageBox(Wnd, "Url Click", "Внимание", MB_OK);
end;
procedure xxx;
begin
...
Url[I] := TUrlLabel.Create(I * 14 + 14, 6, 14, 16, hWndDlg);
with Url[I] do
begin
Url := Alpha[I];
Hint := Alpha[I];
OnUrlClick := UrlClick;
end;
...
end;
выделенная строка естественно не проходит, а как сделать правильно не могу никак сообразить.
← →
Anatoly Podgoretsky (2001-12-26 15:39) [6]Сделай обработчик членом класса и все будет хорошо.
← →
Evgeny (2001-12-27 06:51) [7]>Anatoly Podgoretsky
Приведенный выше обработчик, это так для проверки. Реально код может быть любым. Тогда как?
← →
Anatoly Podgoretsky (2001-12-28 07:20) [8]Какая разница какой реальный код, надо что бы обработчик был членом какого либо класса.
← →
Evgeny (2001-12-28 14:45) [9]Беда в том, что классов, кроме самого URL, больше не предвидится. В этом то у меня и вся загвоздка.
← →
Anatoly Podgoretsky (2001-12-28 23:25) [10]Скажем так, совсем не понятно, что ты хочешь сделать, сам то представляешь?
← →
Evgeny (2001-12-30 07:27) [11]Попытаюсь объяснить. Вот сам объект:
type
TOnEvent = procedure(Sender : TObject) of Object;
TUrlLabel = class
private
fParent : HWND;
fAlign : TTextAlign;
fRect : TRect;
fUrl : String;
fSelect : Boolean;
fPressed : Boolean;
fDefColor : ColorRef;
fSelColor : ColorRef;
fDefFont : HFONT;
fSelFont : HFONT;
fFontSize : Integer;
fHint : String;
fOnOverURL : TOnEvent;
fOnURLClick : TOnEvent;
procedure SetOnURL(const Index: Integer; const Value: TOnEvent);
procedure SetUrlText(Value : String);
procedure SetLinkColor(const Index: Integer; Value : ColorRef);
procedure SetFontSize(Value : Integer);
procedure SetAlign(Value : TTextAlign);
procedure SetHint(Value : String);
public
Handle : HWND;
tti : TToolInfo;
constructor Create(x, y, w, h : Integer; hParent : HWND);
destructor Destroy; override;
procedure Redraw;
published
property Align: TTextAlign read fAlign write SetAlign;
property aRect: TRect read fRect;
property FontSize: Integer read fFontSize write SetFontSize;
property Hint: String read fHint write SetHint;
property DefColor: ColorRef index 0 read fDefColor write SetLinkColor;
property SelColor: ColorRef index 1 read fSelColor write SetLinkColor;
property Selected: Boolean read fSelect;
property URL: String read fUrl write SetUrlText;
property OnOverURL: TOnEvent index 0 read fOnOverURL write SetOnURL;
property OnURLClick: TOnEvent index 8 read fOnURLClick write SetOnURL;
end;
{----------------------------------------------------------}
procedure TUrlLabel.SetOnURL(const Index: Integer; const Value: TOnEvent);
begin
if Index = 0 then
fOnOverURL := Value
else
fOnURLClick := Value;
end;
Вызов:
WM_INITDIALOG :
begin
for I := 0 to 29 do
begin
Url[I] := TUrlLabel.Create(I * 14 + 14, 6, 14, 16, hWndDlg);
with Url[I] do
begin
Url := Alpha[I];
Hint := Alpha[I];
// OnUrlClick := UrlClick;
end;
end;
{----------------------------------------------------------}
// Тест
procedure UrlClick;
begin
MessageBox(Wnd, "Url Click", "Внимание", MB_OK);
end;
Ну а так как этот объект единственный, а само WinAPI по определению процедурное, то не могу сообразить как мне теперь организовать вызов
OnUrlClick := UrlClick;
Вот собственно и весь вопрос. Сожалею, что не совсем понятно описал в первый раз.
← →
Evgeny (2002-01-03 06:20) [12]Так-таки никто не знает?
← →
nikkie (2002-01-03 10:00) [13]так-таки все знают... ты пытаешься смешать win api с идеями vcl-программирования. вероятно это можно сделать, но у меня сомнения в разумности этого подхода.
обрати внимание, как объявлено событие:
TOnEvent = procedure(Sender : TObject) of Object;
это означает, что обработчик должен быть методом некоторого класса, а не просто процедурой. Anatoly Podgoretsky тебе про это уже раза 3 сказал.
но ты написал класс так, как будто это vcl-компонента. в vcl обработчики пишутся как методы формы, поэтому и возникло "of object" в определении события. поскольку ты к vcl не привязан (насколько я понимаю), то можно этот "of object" вообще выкинуть.
← →
Evgeny (2002-01-04 06:23) [14]Да все я прекрасно понял и с первого раза. Единственное, что я никак не могу понять - это как мне все таки смешать эти два понятия. Знаю что возможно - не знаю как. В связи с чем и задан был вопрос. При простом выкидывании "of object" невозможно откомпилировать строки:
property OnOverURL: TOnEvent index 0 read fOnOverURL write SetOnURL;
property OnURLClick: TOnEvent index 8 read fOnURLClick write SetOnURL;
Кстати библиотека KOL, как раз и построена на таком смешивании, но автор не учавствует в здешнем форуме, и по сей причине у него не спросишь. Вот и остается надежда на Вас.
← →
nikkie (2002-01-04 14:45) [15]удаляем "of object". компилируем. читаем сообщение об ошибке.
"Published property OnURLClick cannot be of type PROCEDURE"
переносим из published в public. компилируем. радуемся.
← →
Evgeny (2002-01-04 15:08) [16]Сейчас уже не успеваю по экспериментировать, остается заняться этим дома. Но наскоком успел проверить, юнит скомпилировался, а вызов нет.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c