Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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]

Сейчас уже не успеваю по экспериментировать, остается заняться этим дома. Но наскоком успел проверить, юнит скомпилировался, а вызов нет.




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.028 c
3-9060            amamed_3071           2002-02-06 16:22  2002.03.04  
Create Quickreport


6-9267            Shaman@mike           2001-12-03 15:22  2002.03.04  
Подскажи как можно изменить MAC адрес


4-9346            Burmistroff           2002-01-05 18:42  2002.03.04  
К скрывают PopUp menu?


1-9109            GarT                  2002-02-15 17:00  2002.03.04  
Возникает ошибка при обращении к функции из DLL


1-9202            Winer                 2002-02-14 18:08  2002.03.04  
PopUp menu