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

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

Кто-нибудь занимался интерфейсами на Дельфи? [D6]


Страницы:   1 2

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-методами (хотя это явно не оговаривается в декларации интерфейсных методов).
Лекция на тему интерфейсов затянется надолго, поверь. Лучше приведи фрагменты своего кода, на который Делфи "ругается" (и какими словами - дословно) с твоими комментариями (что ты делаешь в каждой строчке)


Страницы:   1 2

Наверх

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