![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кто-нибудь занимался интерфейсами на Дельфи? [D6]
star © (2002-01-17 12:32:00)Люди, помогите! Разбирался с интерфейсами - ничего не понял! Вроде документация на русском, и сам вроде не тупой, но ничего не понял !!! Нужно работать с нитерфейсом IHTMLDocument2. На мои жалкие попытки Дельфи ругались разными словами. Может кто-нибудь сможет объяснить на элементарных примерах, что такое эти интерфейсы, и как с ними работать ...
Не могу уже, голова опухла ...
Digitman (2002-01-17 17:13:00) [21]>yaJohn
>>Interface - moshneyshiy mehanizm, odnako v VCL ispolzuetsia >>krayne epizodicheski
Не в VCL, а в примитивных букварях (и - кажущихся на первый взгляд - более серьезных изданиях) по программирования в среде Делфи. Все это на поверку не перекрывает диапазона познаний "чайника", которому какие-то там интерфейсы не нужны вовсе, чтобы "накидать батонов".
А вот загляни-ка ты, скажем, в демо-проект scktsrvr.dpr, где реализован Borland Socket Server (BSS). Серьезный ведь бизнес-продукт, согласись ? Так вот он просто пронизан насквозь использованием интерфейсов ! Ну чем не пособие ? Взамен книжкам по "киданию батонов" ?
Romkin (2002-01-17 17:10:00) [22]2yaJohn
Не извращайся, объявление var i:TInt; означает, что тебе надо вызвать i.Free... После всего. при var i:IInt; этого не надо - выйдет из области видимости, и вызовется Release, а TInterfacedObject при обнулении счетчика себя уничножает.
yaJohn (2002-01-17 16:55:00) [23]2 Romkin
VAU!!! Rabotaet!!! Ili
var i: TInt;
begin
i := TInt.Create;
IInt(i).x:=1;
No (i as IInt).x - ne idet.
Vse ravno - spasibo OGROMNOE!
2 Digitman
>А на основание чего ты, кстати, ассоциируешь некую ошибку компиляции строки i.x:=1 с каким-то там вымышленным "наследованием" ?
---8
Axel (2002-01-17 16:42:00) [24]> star © (17.01.02 12:32)
maybe it helps you
http://www.optim.ru/cs/Topics/TopicCom.asp
http://www.rsdn.ru/summary/?266
http://www.rusdoc.ru/material/lang/other/activex/active.shtml
http://www.interface.ru/fset.asp?Url=/borland/com_dcom.htm
http://www.sei.cmu.edu/str/descriptions/com_body.html
http://www.rkstudio.narod.ru/comyou/comyou.html
good luck
vuk (2002-01-17 16:32:00) [25]>Kak? Esli u interfeysa koda po opredeleniu net
Кода нет, а определение-то есть. Свойство применимо только к интерфейсу, посколько свойство в нем определено. В классе свойство не определено и применено к классу быть не может.
Romkin (2002-01-17 16:24:00) [26]Вся соль - в особенности Delphi:
var i:IInt;
begin
i := TInt.Create;
То есть переменная - интерфейс, а создается объект, компилятор сам делает QueryInterface
Digitman (2002-01-17 16:20:00) [27]>yaJohn
Наследуются. Но переопределить в интерфейсе-наследнике св-во, объявленное в интерфейсе-предке, нельзя. Эдак знаешь сколько умников найдется, желающих переделать тот же IHTMLDocument2 ?
А на основание чего ты, кстати, ассоциируешь некую ошибку компиляции строки i.x:=1 с каким-то там вымышленным "наследованием" ? Что такое i.x в соответствии с твоим примером кода ? Где и как сие декларировано ? Где, что и как наследуется в дан.примере ?
Если ты про строчку
TInt = class (TInterfacedObject,IInt),
то говорят, что "объявленный класс TInt наследует класс TInterfacedObject и реализует интерфейсы IUnknown и IInt"
Romkin (2002-01-17 16:15:00) [28]
IInt = interface
procedure set_x(xxx:integer);
function get_x:integer;
property x: integer read get_x write set_x;
end;
TInt = class (TInterfacedObject,IInt)
public
fx:integer;
procedure set_x(xxx:integer);
function get_x:integer;
end;
.....
{ TInt }
function TInt.get_x: integer;
begin
result:=fx;
end;
procedure TInt.set_x(xxx: integer);
begin
fx:=xxx;
end;
......
procedure TForm1.Button1Click(Sender: TObject);
var i:IInt;
begin
i := TInt.Create;
i.x:=1;
Label1.Caption := IntToStr(i.x);
end;
Должно пройти. У меня работает
yaJohn (2002-01-17 16:09:00) [29]>Где объявили там и используем
Kak? Esli u interfeysa koda po opredeleniu net.
yaJohn (2002-01-17 16:05:00) [30]Pardon, nado utochnit"....
Oshibka kompiliacii. T.e. property u interfeysov ne nasleduutsia???? A zachem oni togda nujni????
vuk (2002-01-17 16:05:00) [31]Все правильно. Свойство-то объявлено в интерфейсе, а не в классе. Где объявили там и используем.
yaJohn (2002-01-17 16:00:00) [32]2 Digitman
Soglasen, soglasen...
Kstati, putanica chasto voznikaet mejdu COM poniatiem interfeysa i ObjectPascal. Oni hot i pohoji, no... O poslednem (Interface v "chistom" Pascal ponimanii) informacii voobshe prakticheski net. Esli ne prav - nastavte na put" istinniy. Naprimer, ya mogu obiavit v interface nekoe property i ego metodi read/write. V realizacii realizuem metodi read/write, a o samom property mojno i ne vspominat". No i obratitsia k nemu nelzia.
IInt = interface
procedure setx(xxx:integer);
function getx:integer;
property x: integer read getx write setx;
end;
TInt = class (TInterfacedObject,IInt)
private
fx:integer;
procedure setx(xxx:integer);
function getx:integer;
end;
.....
{ TInt }
function TInt.getx: integer;
begin
result:=fx;
end;
procedure TInt.setx(xxx: integer);
begin
fx:=xxx;
end;
......
procedure TForm1.Button1Click(Sender: TObject);
var i:TInt;
begin
i.x:=1; -- ERROR
end;
Pochemu????
Digitman (2002-01-17 15:37:00) [33]>yaJohn
Не перекрывает, а РЕАЛИЗУЕТ ! Не вноси терминологическую путаницу.
И создание экземпляра интерфейса, как ты говоришь, - тоже нонсенс.
yaJohn (2002-01-17 15:25:00) [34]Izvinite, no mne sozdanie ekzempliara interfeysa kajetsia neskolko strannim zaniatiem.... Eto vse ravno, chto sozdavat ekzempliari TObject.
>Интерфейс - это, по сути, некий класс
Ne sovsem tak.
Interface eto, esli ugodno, deklaracia nekotorogo nabora metodov. Esli class realizuet interface, eto znachit, chto on perekrivaet vse abstraktnie metodi etogo interfeisa.
Digitman (2002-01-17 15:25:00) [35]>Romkin
Тоже верно)
Romkin (2002-01-17 15:20:00) [36]Help -> Developing COM-based applications
Digitman (2002-01-17 15:17:00) [37]Чтобы Делфи "понял", он должен знать, где находится декларация интерфейса.
star (2002-01-17 15:09:00) [38]Собственно код этот был лишь проба. Я объявил переменную типа этого интерфейса - дельфи не понял. Я объявил переменную типа IUnknown и попробовал применить метод Query... - результат тот же ... Я про них вообще ничего не понял ...
Digitman (2002-01-17 12:46:00) [39]Интерфейс - это, по сути, некий класс, все методы которого явл-ся абстрактными и являются public-методами (хотя это явно не оговаривается в декларации интерфейсных методов).
Лекция на тему интерфейсов затянется надолго, поверь. Лучше приведи фрагменты своего кода, на который Делфи "ругается" (и какими словами - дословно) с твоими комментариями (что ты делаешь в каждой строчке)