Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

URL


Evgeny ©   (2001-12-22 12:53:00) 

Какие идеи имеются по компоненту URL, но полностью на WinAPI.


Evgeny   (2002-01-04 15:08:00) [1]

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


nikkie   (2002-01-04 14:45:00) [2]

удаляем "of object". компилируем. читаем сообщение об ошибке.

"Published property OnURLClick cannot be of type PROCEDURE"

переносим из published в public. компилируем. радуемся.


Evgeny   (2002-01-04 06:23:00) [3]

Да все я прекрасно понял и с первого раза. Единственное, что я никак не могу понять - это как мне все таки смешать эти два понятия. Знаю что возможно - не знаю как. В связи с чем и задан был вопрос. При простом выкидывании "of object" невозможно откомпилировать строки:

property OnOverURL: TOnEvent index 0 read fOnOverURL write SetOnURL;
property OnURLClick: TOnEvent index 8 read fOnURLClick write SetOnURL;

Кстати библиотека KOL, как раз и построена на таком смешивании, но автор не учавствует в здешнем форуме, и по сей причине у него не спросишь. Вот и остается надежда на Вас.


nikkie   (2002-01-03 10:00:00) [4]

так-таки все знают... ты пытаешься смешать win api с идеями vcl-программирования. вероятно это можно сделать, но у меня сомнения в разумности этого подхода.

обрати внимание, как объявлено событие:

TOnEvent = procedure(Sender : TObject) of Object;

это означает, что обработчик должен быть методом некоторого класса, а не просто процедурой. Anatoly Podgoretsky тебе про это уже раза 3 сказал.

но ты написал класс так, как будто это vcl-компонента. в vcl обработчики пишутся как методы формы, поэтому и возникло "of object" в определении события. поскольку ты к vcl не привязан (насколько я понимаю), то можно этот "of object" вообще выкинуть.


Evgeny   (2002-01-03 06:20:00) [5]

Так-таки никто не знает?


Evgeny   (2001-12-30 07:27:00) [6]

Попытаюсь объяснить. Вот сам объект:

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;
Вот собственно и весь вопрос. Сожалею, что не совсем понятно описал в первый раз.


Anatoly Podgoretsky   (2001-12-28 23:25:00) [7]

Скажем так, совсем не понятно, что ты хочешь сделать, сам то представляешь?


Evgeny   (2001-12-28 14:45:00) [8]

Беда в том, что классов, кроме самого URL, больше не предвидится. В этом то у меня и вся загвоздка.


Anatoly Podgoretsky   (2001-12-28 07:20:00) [9]

Какая разница какой реальный код, надо что бы обработчик был членом какого либо класса.


Evgeny   (2001-12-27 06:51:00) [10]

>Anatoly Podgoretsky
Приведенный выше обработчик, это так для проверки. Реально код может быть любым. Тогда как?


Anatoly Podgoretsky   (2001-12-26 15:39:00) [11]

Сделай обработчик членом класса и все будет хорошо.


Evgeny   (2001-12-26 14:12:00) [12]

Про консольное приложение и речи не было. Компонент я уже создал сам, но у меня осталась маленькая проблема.

Вот кусок от объекта
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;

выделенная строка естественно не проходит, а как сделать правильно не могу никак сообразить.


Mick   (2001-12-25 15:05:00) [13]

Консольное приложение + Writeln(MyUrlString) не тащит "всю тяжесть VCL".


Evgeny   (2001-12-25 14:37:00) [14]

Хотелось бы создать компонент URL на основе STATIC, так как не хочется тащить всю тяжесть VCL, может у кого-нибудь имеются наметки на эту тему, или ссылки.


panov   (2001-12-25 10:44:00) [15]

Вопрос для форума потрепаться?:-)
Если нет, то вопрос сформулируй получше.


Evgeny   (2001-12-25 10:33:00) [16]

.


Наверх

Титульная страница Поиск, карта сайта Написать письмо