Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
Внизникак не могу разобраться с методом Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c