Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.01 c
1-6030
Незнающий
2004-02-18 16:48
2004.03.03
Как в TListBox отследить изменение текущего элемента (ItemIndex)?


3-5956
kaif
2004-02-05 21:22
2004.03.03
Как вызвать диалог настройки строки OLE DB initstring для ADO?


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


7-6263
kryworut
2003-12-09 15:22
2004.03.03
как заставить программу перехватывать сообщение о перезагрузке,


14-6238
ККВ
2004-02-10 13:54
2004.03.03
Microsoft Help WorkShop




   Наверх