purebasic.info

PureBasic forum
Текущее время: Вт янв 16, 2018 2:07 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Пн мар 28, 2016 3:26 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11077
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
В PB аналогом класса в виртуальными методами является интерфейс.
А вот как портировать, зависит от того что должно получится в итоге.
Примеры создания классов из процедур. viewtopic.php?f=8&t=2278
http://purebasic.mybb.ru/viewtopic.php?id=496
http://bascomavr.3bb.ru/viewtopic.php?id=1576#p18161

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Пн мар 28, 2016 3:57 pm 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Спасибо Петр.
Но я уже в процессе разбора кода понял что это интерфейс.
Проблема в том что я теряюсь в описании самого интерфейса, т.е. процедур.
Я так понял что все friend long (и тп) и virtual void.
Може я путаю где начинается описание интерфейса? В public или раньше?
И еще интересен вопрос по блоку protected: куда его девать


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Пн мар 28, 2016 4:54 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
cherri123 писал(а):
И еще интересен вопрос по блоку protected: куда его девать

Так же как и в пурике. Объяви эти переменные как protected, а если не будут с другими пересекаться, то можно и так оставить.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Пн мар 28, 2016 5:06 pm 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
поясните еще одну фишку
вот функция(процедура)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function DispatchEffectClass(e: PAEffect; Opcode, Index: VstInt32; Value: VstIntPtr; ptr: pointer; opt: single): VstIntPtr; cdecl;
var
   obj : AudioEffect;
begin
  obj := e^.vObject;
 
  if opCode = effClose then
  begin
    obj.Dispatcher(opCode, index, value, ptr, opt);
    obj.Free;
    Result := 1;
    Exit;
  end;
 
  Result := obj.dispatcher(opCode, index, value, ptr, opt);
end;



далее в коде
Код:
1
FEffect.dispatcher := dispatchEffectClass;


т.е. по ПБ FEffect\dispatcher(бла, бла)=?... а вот как это изобразить?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Пн мар 28, 2016 6:51 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11077
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
MrF писал(а):
Объяви эти переменные как protected
Так не получится. Потому что они должны быть доступны во всех процедурах, сходящих в класс. Обычно их размещают в структуре и передают в первом аргументе как This экземпляра класса.

cherri123 писал(а):
далее в коде
Код:
1
FEffect\dispatcher = @dispatchEffectClass()


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Ср мар 30, 2016 8:34 am 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Цитата:
Код:
1
FEffect\dispatcher = @dispatchEffectClass()



Спс то что нужно 8)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Ср мар 30, 2016 4:31 pm 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Еще один вопрос...
Есть структура
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
; //------------------------------------------------------------------------------
; // Structure used For #effEditGetRect.
; //------------------------------------------------------------------------------
CompilerIf Defined(ERect,#PB_Structure) = 0
Structure ERect Align #PB_Structure_AlignC
 
        top.w;
        left.w;
        bottom.w;
        right.w;
       
EndStructure
CompilerEndIf



она участвует как стороны хоста так и со стороны подключаемого плагина.
Как видно структура описывает высоту и длину окна на стороне хоста.
Код:
1
2
3
4
 
effGetSizeWindow(*myAEffect,@Rect)
*rec.ERect=Rect
ResizeWindow(hwnd2,#PB_Ignore,#PB_Ignore,*rec\left+*rec\right,*rec\bottom+*rec\top)



где effGetSizeWindow(*myAEffect,@Rect)
Код:
1
2
3
4
Procedure effGetSizeWindow(*Effect.AEffect,*rect.ERect)
  *Effect\Dispatcher(*Effect, #effEditGetRect, 0, 0, *rect, 0.0)
  ProcedureReturn *rect
EndProcedure



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

Я не пойму как передать от плагина к хосту эти данные.

Вот есть код на с++
/
Код:
1
2
3
4
5
6
/-----------------------------------------------------------------------------
long AEffGUIEditor::getRect (ERect **ppErect)
{
        *ppErect = ▭
        return true;
}



ПыСы
...может я не слишком ясно написал?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Ср мар 30, 2016 4:50 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11077
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
Попробуй так.
Код:
1
2
3
4
5
6
Global gRect.Rect
 
Procedure getRect(*ppErect.Integer)
  *ppErect\i = @gRect
  ProcedureReturn #True
EndProcedure


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Пт апр 01, 2016 8:57 am 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Петр спс! Все заработало :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Пн апр 04, 2016 2:41 pm 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
еще вопрос
хост крашится после
Код:
1
CloseLibrary()



кусок кода для хоста
Код:
1
2
3
4
5
 
  effEditClose(*myAEffect); закрытие окна эдитора
  effClose(*myAEffect);      закрытие плагина
  CloseLibrary(1);  
 



что характерно что с другими плагинами все норм

со стороны плагина

инициализация:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
ProcedureC Create(*audioMaster.pDispatcher)
 
  Protected *this.AEffect
  *this= AllocateMemory(SizeOf(AEffect))
  InitializeStructure(*this,AEffect)
  If *this
   
    *Host=*audioMaster
   
    With *this
     
              gRect\top=0
              gRect\left=0
              gRect\right=200
              gRect\bottom=600
             
              \magic            =#kEffectMagic
              \dispatcher       =@dispatchEffectClass()
              \process          =@processClass()
              \setParameter     =@setParameterClass()
              \getParameter     =@getParameterClass()
              \processReplacing =@processClassReplacing()
              ;\numParams        =1
             
              \numInputs        =2
              \numOutputs       =2
              \flags            =#effFlagsHasEditor
              \resvd1           =0
              \resvd2           =0
              \initialDelay     =0
              \realQualities    =0
              \offQualities     =0
              \ioRatio          =1
              \vObject          =?_VSTPlugIn_
              \user             =0
              \uniqueID         ='NoEf'
              \version          =1
             
      EndWith
  Else
  EndIf
 
  ProcedureReturn *this
EndProcedure



и процедура закрытия:
Код:
1
2
3
4
Procedure close(*IPlugin)
  FreeMemory(*IPlugin)
  ProcedureReturn 0
EndProcedure



может я что-то не так?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Пн апр 04, 2016 2:51 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11077
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
Включи OnError в DLL и может покажет где ошибка.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Вт апр 05, 2016 2:25 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
cherri123 писал(а):
Еще один вопрос...
Есть структура
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
; //------------------------------------------------------------------------------
; // Structure used For #effEditGetRect.
; //------------------------------------------------------------------------------
CompilerIf Defined(ERect,#PB_Structure) = 0
Structure ERect Align #PB_Structure_AlignC
 
        top.w;
        left.w;
        bottom.w;
        right.w;
       
EndStructure
CompilerEndIf



она участвует как стороны хоста так и со стороны подключаемого плагина.
Как видно структура описывает высоту и длину окна на стороне хоста.
Код:
1
2
3
4
 
effGetSizeWindow(*myAEffect,@Rect)
*rec.ERect=Rect
ResizeWindow(hwnd2,#PB_Ignore,#PB_Ignore,*rec\left+*rec\right,*rec\bottom+*rec\top)



где effGetSizeWindow(*myAEffect,@Rect)
Код:
1
2
3
4
Procedure effGetSizeWindow(*Effect.AEffect,*rect.ERect)
  *Effect\Dispatcher(*Effect, #effEditGetRect, 0, 0, *rect, 0.0)
  ProcedureReturn *rect
EndProcedure



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

Я не пойму как передать от плагина к хосту эти данные.

Вот есть код на с++
/
Код:
1
2
3
4
5
6
/-----------------------------------------------------------------------------
long AEffGUIEditor::getRect (ERect **ppErect)
{
        *ppErect = ▭
        return true;
}



ПыСы
...может я не слишком ясно написал?

Так понял что функция копирует структуры если так то нужно сделать так или вовсе без параметров или через функцию копирования памяти по адресам. :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
CompilerIf Defined(ERect,#PB_Structure) = 0
Structure ERect Align #PB_Structure_AlignC
        left.l
        top.l;
        right.l
        bottom.l;    
EndStructure
CompilerEndIf
 
Global rect.Rect
 rect\left=33
 rect\top=88
 rect\right=33
rect\bottom=75
Global *erect.ERect
*erect=AllocateMemory(SizeOf(ERect))
 
Procedure getRect()
        *erect= @rect
        ProcedureReturn #True
 EndProcedure
 Procedure getRect1(*ppErect);локальный тип также как будет и структура локальной
        CopyMemory(*ppErect,@rect,16)
        ProcedureReturn #True
EndProcedure
     
   getRect()
 Debug *erect\bottom
     
    rect\bottom=175
     getRect1(*erect)
Debug *erect\bottom  
   
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Вт апр 05, 2016 2:48 pm 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Ну в принципи так и есть.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Вт апр 05, 2016 3:44 pm 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
нашел из-за чего возникает ошибка
Код:
1
2
3
4
5
6
7
8
 
  ProcedureC open_Editor(*ptr)
    SysWindow=*ptr
    UseGadgetList(SysWindow)
    CanvasGadget(1,0,0,20,20)
 
    ProcedureReturn #True
  EndProcedure



если я использую
Код:
1
UseGadgetList(SysWindow)

то при выгрузке либы возникает карш ошибка.
Если нет то канвас не отображается в окне. Можно ли как нибудь обойти это?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: BitBox
СообщениеДобавлено: Чт апр 07, 2016 8:41 am 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 354
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Ни кто не сталкивался с такой задачей: отобразить гаджет драйвера в родительском окне самой программы?

Просто я для отображения использую свое окно без бердюров и прикрепляю через Parent_() к родительскому окну.
Что не есть гуд. В других ВСТ плагинах видимо как то реализовано по другому?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Yahoo [Bot] и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB