Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
3-5972
Boroda Oleg
2004-02-04 16:15
2004.03.03
Получение значения из триггера по созданию новой записи


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


1-6115
Miwa
2004-02-20 17:18
2004.03.03
Как в TStringList.AddObject вместо объекта integer засунуть?


3-5986
Механик
2004-02-04 17:06
2004.03.03
DCOM-Interbase


3-5979
Игорь М
2004-02-05 10:36
2004.03.03
редактирование SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский