Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

делаю ActiveX Control...   Найти похожие ветки 

 
френк   (2006-01-10 11:55) [0]

в общем ситуация такая. жил-был компонент TSimpleComponent. и возникла необходимость в порождении ActiveX Control"a на базе него ) ну понятное дело что в результате автоматической кодогенерации много чего было потеряно... отсюда пара вопросов )

1. Если были в компоненте вложенные свойства, т.е. TSimpleComponent.Options.AlwaysBlack к примеру - как вы обычно поступаете? (Options - класс типа TSimpleOptions к примеру). Пришлось пока что вывернуть наружу все пропертисы класса TSimpleOptions приблизительно в таком виде TSimpleComponentX.Opt_AlwaysBlack :) Потянет? ) Чувствую что можно лучше, но тяму не хватает.

2. В ряде методов / событий используется Canvas. На что бы его такое заменить? Аналоги для Font / Picture нашел + Set(Get)OleFont / Set(Get)OlePicture.

3. Остальные объекты описал внутри TLB по возможности (понятное дело только записи), но почему-то при использовании в дальнейшем этих объектов вижу странное предупреждение: /*Warning: unable to validate structure name: */ не могу сообразить с чем связано, натолкните на путь истиный...

4. Как быть если ранне, будучи простым VCL сей объект через ряд свойств был связан с другими объектами? Есть вохможность иные объекты перегнать в ActiveX, что и собираюсь сделать, но как бы в Design-time позволить пользователю организовывать между ними связь? Посоветуйте.

Вроде бы пока все. Есть еще некоторые вопросы, но думаю решу сам. Надеюсь на вашу помощь, мастера.


 
френк   (2006-01-10 12:22) [1]

сложность с /*Warning: unable to validate structure name: */ вылелась в следующую ситуацию:

к примеру в событие передается блок информации в виде record"a

VCL:


TSomeData = record
First: Integer;
Second: Integer;
Third: String;
end;

procedure TSimpleComponentX.OnSomeEvent(const SomeData: TSomeData);


ActiveX:


 TxSomeData = packed record
   First: Integer;
   Second: Integer;
   Third: WideString;
 end;

// в описании интерфейса
procedure OnSomeEvent(SomeData: {??TxSomeData}OleVariant); dispid 226;


он не может использовать TxSomeData, компилятор ругается на illegal type in section... но как тогда быть? ведь мне надо передать из обертки внутрь:


TSimpleComponentX.SomeEvent(const SomeData: TSomeData);
var
xSomeData: TxSomeData;
begin
Convert2X(SomeData,xSomeData); // общий случай
if FEvents <> nil then FEvents.OnAfterDelete(xSomeData);
end;


как быть, господа? ( я запутался. прошу, помогите.


 
френк   (2006-01-10 12:23) [2]

OnAfterDelete = OnSomeEvent, прошу прощение думаю об одном, пишу другое )


 
френк   (2006-01-10 14:41) [3]

Удалено модератором


 
wal ©   (2006-01-10 15:07) [4]

1. Создай интерфейс IOptions, в нем опиши все методы-свойства TSimpleOptions, в интерфейсе объекта создай свойство Options только для чтения, возвращающее этот интерфейс.
2. С Canvas сделай аналогично.
3. Используй вариантные массивы.
4. Это уже с контейнером взаимодействие организовывать надо. В двух словах не объяснить (да и честно говоря, задача такая не вставала, поэтому не в курсе, только слышал краем уха).

С уважением.


 
френк   (2006-01-10 16:22) [5]

wal ©   (10.01.06 15:07) [4]
1. по поводу IOptions все четка понял, спасибо!

2. вот по поводу Canvas"a не въехал. неужели делать интерфейс под канву? мне надо то всего осуществить по сути передачу указателя на канвас от внешней среды через мой ActiveX в его ядро, которое VCL.

3. прошу прощение, но каким боком тут вариантные массивы? в кратце.

4. буду искать инфу.


 
wal ©   (2006-01-10 16:56) [6]


> мне надо то всего осуществить по сути передачу указателя
> на канвас от внешней среды
В COM-OLE нету никаких указателей, а тем более канвасов. Нужно или в рамках COM создать аналог канваса, либо искать иной путь.

> каким боком тут вариантные массивы? в кратце.
В кратце то же самое, в COM-OLE набор допустимых типов данных весьма невелик, но variant в их число входит, а через вариант можно передать все что угодно, в том числе и дакую структуру, изобразив ее в виде вариантного массива.

С уважением.


 
Набережных С. ©   (2006-01-10 17:08) [7]


> френк

2) Даже если ты стопроцентно уверен, что с твоим ActiveX будут работать только из программ, написанных в дельфи, все равно не стоит выносить наружу дельфийский класс, иначе огребешь проблем, не сомневайся. Лучший вариант - интерфейс, как уже было сказано wal ©. В крайнем случае можно возвращать HDC.

3) Если в D5, то правь руками, проглотит. Если в D7, то что-то не так сдалал. В семерке должно нормально обрабатываться, если рекорды описаны в библиотеке типов. В D6 - не знаю, не имел дела.

4) В любом случае снаружи должны быть видны только интерфейсы, никаких классов. Видимо, нечто, напоминающее аггрегацию, но универсального способа нет или мне неизвестен, нужно смотреть "по месту". Только будь очень внимателен, чтобы не создать замкнутых ссылок.


 
френк   (2006-01-10 17:40) [8]

огромное вам всем Человеческое спасибо! буду разбираться. вы предали мне уверенности.

wal ©   (10.01.06 16:56) [6]

> В COM-OLE нету никаких указателей, а тем более канвасов.
>  Нужно или в рамках COM создать аналог канваса, либо искать
> иной путь.


знаю что нет указателей, вы простите, я слишком вольно терминами употреблял в своей речи в том посте )

wal ©   (10.01.06 16:56) [6]

> В кратце то же самое, в COM-OLE набор допустимых типов данных
> весьма  невелик, но variant в их число входит, а через вариант
> можно передать все что угодно, в том числе и дакую структуру,
>  изобразив ее в виде вариантного массива.


т.е. по сути поля структуры становятся элементами массива... а так как у нас variant по сути проглатывает любой тип, то мы имеем аналог структуры. точно! щас понял ) спасибо, не доперло сходу.

Набережных С. ©   (10.01.06 17:08) [7]

> 2) Даже если ты стопроцентно уверен, что с твоим ActiveX
> будут работать только из программ, написанных в дельфи,
> все равно не стоит выносить наружу дельфийский класс, иначе
> огребешь проблем, не сомневайся. Лучший вариант - интерфейс,
>  как уже было сказано wal ©. В крайнем случае можно возвращать
> HDC.


прошу прощение, но по сути я должен предоставить внешней среде доступ к канве внутреннего VCL-ядра моего ActiveX. я запутался. не смотря на то что Canvas не поддерживает созданный мною новый интерфейс (ICanvas, к примеру)... брррр... мне никогда не хватало твердой руки гуру рядом ) не могу понять чем мне поможет сей интерфейс (


> 3) Если в D5, то правь руками, проглотит. Если в D7, то
> что-то не так сдалал. В семерке должно нормально обрабатываться,
>  если рекорды описаны в библиотеке типов. В D6 - не знаю,
>  не имел дела.


у меня семерка. рекорды вроде корректно описаны. правлю руками - ругается, что мол не может. не допустимый тип. тут wal вроде дело говорит относительно вариантного массива, хотя хотелось бы именно так, через рекорды )


> 4) В любом случае снаружи должны быть видны только интерфейсы,
>  никаких классов. Видимо, нечто, напоминающее аггрегацию,
>  но универсального способа нет или мне неизвестен, нужно
> смотреть "по месту". Только будь очень внимателен, чтобы
> не создать замкнутых ссылок.


пока для меня самое тяжелое. вообще смутно себе представляю реализацию (


 
Набережных С. ©   (2006-01-10 19:34) [9]


> френк   (10.01.06 17:40) [8]


> правлю руками - ругается, что мол не может. не допустимый
> тип

Блин, я не обратил внимания, что речь идет о событиях:((
Прошу извинить.

Дельфи, и не только она, строит вызов событий на диспинтерфейсах, при этом она не умеет автоматически вызывать методы, содержащие типы, котрые нельзя целиком поместить в вариант. Простыми способами это не обойти. А сложные я не пробовал, потому рекомендовать не могу. Хотя и вижу пару возможных вариантов решения, но с каждым надо отдельно плотно разбираться, особенно в части совместимости.

> не смотря на то что Canvas не поддерживает созданный мною
> новый интерфейс (ICanvas, к примеру)... брррр... мне никогда
> не хватало твердой руки гуру рядом ) не могу понять чем
> мне поможет сей интерфейс (

Зато этот интерфейс может поддерживать твой ActiveX и через него предоставлять доступ к методам и свойствам своей канвы.


 
Набережных С. ©   (2006-01-10 19:39) [10]

Да, совсем забыл с расстройства:) Может быть есть смысл использовать события с набором параметров, соответствующих полям рекорда вместо самого рекорда?


 
имя   (2006-01-11 18:17) [11]

Удалено модератором


 
френк   (2006-01-11 18:17) [12]

Набережных С. ©   (10.01.06 19:39) [10]
> события с набором параметров, соответствующих полям рекорда

спасибо что вы тут со мной нянчаетесь )
у меня был такой вариант ( но все уперлось в желательную совместимость и одноименность VCL"я и образованного от него ActiveX"a.

буду сегодня пробовать разные варианты. если что еще обращусь за помощью. так вроде все доделал, немного осталось, по мелочам.


 
имя   (2006-01-11 18:19) [13]

Удалено модератором


 
френк   (2006-01-18 14:09) [14]

прошу помощи, в очередной раз.

помните в самом начале говорил о необходимости сделать вложенные свойства? мастера посоветовали:

wal ©   (10.01.06 15:07) [4]
1. Создай интерфейс IOptions, в нем опиши все методы-свойства TSimpleOptions, в интерфейсе объекта создай свойство Options только для чтения, возвращающее этот интерфейс.

создал необходимый IOptions интерфейс, описал в нем все свойства TSimpleOptions, создал в SimpleComponentX свойство read-only Options которое возвращает IOptions.

первым делом смутило наличие Warning"a
HRESULT _stdcall Options([out, retval] IOptions ** Value /*Warning: unable to validate structure name: */ );

во-вторых не совсем понимаю как я должен вернуть интерфейс...

function TSimpleComponentX.Get_Options: IOptions;
begin
// ?
end;

прошу навести меня на путь истиный.

Набережных С. ©   (10.01.06 19:34) [9]
Зато этот интерфейс может поддерживать твой ActiveX и через него предоставлять доступ к методам и свойствам своей канвы.

прошу прощение за наглость, можно хотя бы небольшой пример или толковое пояснение? (


 
wal ©   (2006-01-18 16:05) [15]


> function TSimpleComponentX.Get_Options: IOptions;
> begin
> // ?
> end;
Возвратить инткрфейс IOptions какого-либо объекта. В простейшем случае самого себя. Типа того:

IOptions = interface(...)
function Get_Value:WideString;stdcall;//safecall
procedure Set_Value(const Value:WideString);stdcall;//safecall
property Value:WideString read Get_Value write Set_Value;
end;

ISomeObject = interface(...)
function Get_Options: IOptions;stdcall;//safecall
property Options: IOptions read Get_Options;
end;
...

type
TOptions = class(...)
...
public
property Value ...;
end;

TSomeXObject = class(..., ISomeObject, IOptions)
private
FOptions: TOptions
protected
function Get_Options: IOptions;stdcall;//safecall
function Get_Value:WideString;stdcall;//safecall
procedure Set_Value(const Value:WideString);stdcall;//safecall
end;
...
function TSomeXObject.Get_Options: IOptions;
begin
 Result := Self as IOptions
end;

function TSomeXObject.Get_Value:WideString;
begin
 Result := FOptions.Value
end;

procedure TSomeXObject.Set_Value(const Value:WideString);
begin
 FOptions.Value := Value
end;


Можно на основе TOptions создать отдельный объект и возвращать его.
Основная идея в том, что совершенно неважно, как это реализовано внутри. Снаружи всегда будет Obj.Options.Value

С уважением.


 
френк   (2006-01-18 19:33) [16]

ммм... может у меня сложилось ложное мнение, но я так понимаю что мой ActiveX Control, за исключение непосредственно тел процедур / функций я править могу только из под редактора Type Library. т.к. после обновления оного происходит автоматическая кодогенерация. поэтому давайте отталкиваться от него...

в общем каким то чудом после того как был описан интерфейс IOptions и добавлен через (Insert Interface...) в Implements раздел CoClass"a произошло чудо. необходимые мне свойства из IOptions были описаны каким то необычным макаром в деле TSimpleComponentX в общем с указанием на то что это свойства и методы именно IOptions (говорю необычным, так как чудо это длилось не долго - изучить толком не смог). После каких то манипуляций получилось так, что все это дело сбросилось и в итоге они описаны как свойства / методы именно TSimpleComponentX"a, без указания привязки к IOptions. Как я не пытался вернуть - так и не смог. В чем может быть сложность?

Может я несколько непонятно пояснил щас =(


 
Набережных С. ©   (2006-01-18 21:47) [17]


> френк   (18.01.06 14:09) [14]


> прошу прощение за наглость

Да ладно, сочтемся как-нибудь:)))

> можно хотя бы небольшой пример или толковое пояснение? (

Не, пример мне лень писать:)
Объявляешь в библиотеке типов интерфейс

IMyCanvas = interface(IDispatch)
[...]
- тут методы, которые тебе нужны.
end;

Затем добавляешь этот интерфейс своему ActiveX. Реализуешь его методы в компоненте, а в них вызовы перенаправляешь своей канве, типа Self.Canvas.Draw...
Естественно, типы нужно использовать Ole-совместимые. Например, передавать HBitmap, а не TBitmap. Соответственно, и некоторые методы придется реализовывать на API, например, использовать BitBlt(Self.Canvas.Handle...) вместо Canvas.Draw. Примерно так.
В принципе, на этом можно остановиться, клиент сможет получить IMyCanvas через любой интерфейс твоего ActiveX, а можно добавить в дефолтный интерфейс контрола метод, который будет возвращать IMyCanvas:

function GetCanvas(out Canvas: IMyCanvas): HResult;
begin
 Result:= QueryInterface(IMyCanvas, Canvas);
end;

Вроде все:)


 
френк   (2006-01-19 05:05) [18]

Набережных С. ©   (18.01.06 21:47) [17]
во ) вот так вот понял =) большое спасибо.

френк   (18.01.06 19:33) [16]
мыслей по этому поводу нет?


 
френк   (2006-01-19 07:18) [19]

еще вопрос который меня страшно волнует )
написал демо для тестирования ActiveX"a. запускается нормально, но не закрывается. никаких exception"ов нету. просто остается висеть в памяти. подумал - может я что накуролесил. с нуля сгенерил ActiveX Control под мой VCL - результат тот же. Висит, поганец в памяти.

в чем может быть причина?



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

Форум: "Corba";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.519 c
2-1188993958
Странник81
2007-09-05 16:05
2007.09.30
Вывод файла на экран


15-1188833908
Gamer_Desktoper
2007-09-03 19:38
2007.09.30
Подскажите настольную игру для ребёнка... скоро ДР.


15-1188374949
schaps
2007-08-29 12:09
2007.09.30
Может есть у кого FastReport 2.45 ( открывает frf)


1-1184513356
KiriX
2007-07-15 19:29
2007.09.30
Как создать графическую форму?


2-1188565851
writebuf(nil);
2007-08-31 17:10
2007.09.30
Проверить ASCII строку





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский