Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.03;
Скачать: CL | DM;

Вниз

никак не могу разобраться с методом   Найти похожие ветки 

 
Dysan ©   (2004-01-23 13:18) [0]

Описан COM обьект
type
TEtan = class(TAutoObject, IEtan)
protected
host:PChar;
public
procedure Set_host(Value: PChar); virtual; safecall;
end;

procedure TEtan.Set_Host(Value: PChar);
begin
host:=Value;
end;

В другой программе обращаюсь:
t:=CreateOleObject("Etan_events.Etan");

t.Host:="mail.ru"; <--- И вот тут он говорит что "Неверный тип переменной"

Помогите разобраться.


 
Romkin ©   (2004-01-23 13:22) [1]

t.Host:=PChar("mail.ru");
Но я бы вообще не советовал употрелять PChar, он не входит в перечень ole automation типов. Используй BSTR (WideString) или OleVariant


 
Тимохов ©   (2004-01-23 13:22) [2]

Ты как вообще создаешь свой объект? Т.е. с помощью стандартных средств дельфи или сам библиотеку типов пишешь?


 
Тимохов ©   (2004-01-23 13:24) [3]

В дополнение к 1.
Если ты для создания своего объекта используешь стандартный дельфовый механизм - то там типы сами привильные ставятся, т.е. ole automation.


 
Dysan ©   (2004-01-23 13:26) [4]

нет не сам а так сказать визардом дельфи
и все что там написано т.е. Pchar это он сам поставил
Но к слову что я только не перепробовал и OleVariant втом числе.
Не получаеться и все. весь день бьюсь. :(


 
Romkin ©   (2004-01-23 13:28) [5]

У тебя должна быть библиотека типов, в ней выбираешь тип проперти BSTR и все


 
Dysan ©   (2004-01-23 13:42) [6]

да странно заработало с OleVariant. ведать я чтото упускал раньше.
А вот еще вопрос
как сделать массив ? что к нему из программы обращаться например Item[номер].свойство
?


 
Romkin ©   (2004-01-23 13:47) [7]

Это не массив, это array property. Аналогично, просто добавь входной параметр:

[
propget,
id(0x00000002)
]
HRESULT _stdcall ClientName([in] long ClientID, [out, retval] BSTR * Value );


Вызов в Delphi - ClName := V.ClientName[3]

А вот еще и свойство - догда проперти должна возвращать интерфейс, а уже у него к свойству обращаешься


 
Romkin ©   (2004-02-20 15:50) [8]

Все-таки поясню :)
Итак, как сделать свойство у интерфейса, представляющее собой объект? Разумеется, надо вернуть интерфейс.
Итак, допустим, нужно свойство Item[index: integer], которое возвращает какой-то элемент, у которго свои итемы и проперти :)
Создаем automation object, в thread model которго указываем internal. Назовем Item (интерфейс, автоматом, IItem назовется, что не важно). В принципе, можно ничего не менять, но я бы рекомендовал изменить тип предка кокласса с TAutoObject на TAutoIntfObject и убрать создание factory в initialization, она не нужна, снаружи создавать этот объект не потребуется.
ДАлее, в твоем интерфейсе IEtan создаем свойство Item, тип которго IItem :) (будет он в списке). И в параметрах добавляем index типа long. Все. В реализации:
function Item(Index: integer): IItem;
begin
Result := TItem.Create(Index); //или как там ты хочешь
end;
И все. Использование:

V, Item: VAriant; V := CreateOleObject(...;
Теперь можно: V.Item[i].чего-то :=
или Item := V.Item[i]; Item.чего-то
Все просто. Вот только проблема возникает, когда ведущий объект уничтожается. Здесь два выхода: В методе function Item(Index: integer): IItem; запоминать ссылку на объект и уничтожать в его деструкторе. Что опасно. Второе: переложить эту заботу на клиента и забить. Третье: посмотреть в сторону TAggregatedObject и сделать агрегирование



Страницы: 1 вся ветка

Текущий архив: 2004.03.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
1-6142
WebErr
2004-02-19 15:34
2004.03.03
А в Delphi есть template?


14-6254
Soft
2004-02-08 00:18
2004.03.03
Читать только самым умным на этом форуме.


14-6233
Bless
2004-02-09 16:35
2004.03.03
Вопрос программирующим в CBuilder


3-5949
КомофОнСамый
2004-02-05 19:53
2004.03.03
как добавить строчку в service??


1-6026
evg_nib
2004-02-18 14:58
2004.03.03
Формы и приложение