HiAsm - Конструктор программ

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » HiAsm - Конструктор программ » Нестандартные решения » Переменные, функции, события между IC


Переменные, функции, события между IC

Сообщений 1 страница 4 из 4

1

Как вызвать процедуру из одного IC в другом IC?
Как передать глобальную переменную между IC?
Как вызвать события в одном IC из другого IC?

Всё это решается в данных примерах!

Код:
Add(GlobalVar,10055018,266,357)
{
 Name="any_global_var_name"
}
Add(InlineCode,4856348,266,217)
{
 @Hint=#59:Здесь записываем в глобальные переменные данные и процедуру|
 WorkPoints=#1:a|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|33:uses kol,Share,Debug,hiGlobalVar;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|9:   public|42:    procedure a(var dt:TData; index:word);|5: end;|0:|18://procedure globF;|0:|14:implementation|0:|54:procedure globF(s:string); //Наша глобальная процедура|5:begin|50: _debug('Сообщение в глобальной процедуре: ' + s);|4:end;|0:|24:procedure THiAsmClass.a;|5:begin|76: dtString( ForceGVar('any_global_var_name')^, 'значение нашей переменной' );|88: //any_global_var_name - имя глобальной переменной, куда записываются данные типа TData,|75: //поэтому к TData мы приводим строку с помощью ф-ции dtString из Share.pas|0:|70: dtInteger( ForceGVar('any_global_var_name_proc')^, integer(@globF) );|90: //А в эту глоб. переменную (any_global_var_name_proc) записываем адрес процедуры/функции,|46: //которая нужна для глобального использования|4:end;|0:|4:end.|
 AddHint(45,0,189,26,@Hint)
}
Add(InlineCode,9962017,266,259)
{
 @Hint=#41:Здесь получаем из глоб. переменной данные|
 WorkPoints=#1:a|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|33:uses kol,Share,Debug,hiGlobalVar;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|9:   public|42:    procedure a(var dt:TData; index:word);|5: end;|0:|14:implementation|0:|24:procedure THiAsmClass.a;|5:begin|88: //Получение значения глоб. переменной any_global_var_name: с помощью ForceGVar получаем|88: //связанный с этой переменной указатель на данные типа TData, разыменовываем и приводим|11: //к string|55: _debug( ToString(ForceGVar('any_global_var_name')^) );|17: //_hi_OnEvent();|4:end;|0:|4:end.|
 AddHint(44,-1,144,26,@Hint)
}
Add(Button,1483621,203,217)
{
 Left=15
 Top=35
 Width=155
 Caption="записать текст и процедуру"
 link(onClick,4856348:a,[])
}
Add(Button,15025473,203,259)
{
 Left=15
 Top=60
 Width=155
 Caption="получить текст"
 link(onClick,9962017:a,[])
}
Add(InlineCode,12655881,266,301)
{
 @Hint=#44:Здесь вызываем из глоб. переменной процедуру|
 WorkPoints=#1:a|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|33:uses kol,Share,Debug,hiGlobalVar;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|9:   public|42:    procedure a(var dt:TData; index:word);|5: end;|0:|14:implementation|0:|24:procedure THiAsmClass.a;|97:var gpname:procedure(s:string); //объявляем процедурную переменную такого же типа, как наша globF|5:begin|37: //Исполнение глоб. процедуры/функции|88: //Получаем указатель из глоб. переменной и записываем его в нашу процедурную переменную|72: gpname := pointer( ToInteger(ForceGVar('any_global_var_name_proc')^) );|0:|47: //Проверяем, что указатель не пуст, и вызываем|60: if @gpname <> nil then gpname('а это переданный параметр');|17: //_hi_OnEvent();|4:end;|0:|4:end.|
 AddHint(46,1,150,26,@Hint)
}
Add(Button,7510949,203,301)
{
 Left=15
 Top=85
 Width=155
 Caption="исполнить процедуру"
 link(onClick,12655881:a,[])
}
Add(MainForm,15096150,203,546)
{
 Position=1
 link(onCreate,7866380:a,[])
}
Add(InlineCode,7866380,266,560)
{
 @Hint=#56:Здесь записываем в глобальную переменную адрес процедуры|
 WorkPoints=#1:a|
 EventPoints=#8:OurEvent|9:OurEvent1|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|33:uses kol,Share,Debug,hiGlobalVar;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|9:   public|23:    OurEvent:THI_Event;|24:    OurEvent1:THI_Event;|42:    procedure a(var dt:TData; index:word);|5: end;|21:var thic:THiAsmClass;|0:|22://procedure globEvent;|0:|14:implementation|0:|82:procedure globEvent; //Наша глобальная процедура - специально для события OurEvent|5:begin|28: _hi_OnEvent(thic.OurEvent);|4:end;|0:|83:procedure globEvent1; //Наша глобальная процедура - специально для события OurEvent|5:begin|29: _hi_OnEvent(thic.OurEvent1);|4:end;|0:|24:procedure THiAsmClass.a;|5:begin|14: thic := self;|75: dtInteger( ForceGVar('any_global_var_name_proc1')^, integer(@globEvent) );|90: //А в эту глоб. переменную (any_global_var_name_proc) записываем адрес процедуры/функции,|46: //которая нужна для глобального использования|76: dtInteger( ForceGVar('any_global_var_name_proc2')^, integer(@globEvent1) );|4:end;|0:|4:end.|
 link(OurEvent,11179310:doMessage,[])
 link(OurEvent1,13721235:doMessage,[(306,573)(306,608)])
 AddHint(53,-49,188,26,@Hint)
}
Add(InlineCode,16588685,266,644)
{
 @Hint=#44:Здесь вызываем из глоб. переменной процедуру|
 WorkPoints=#1:a|1:b|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|33:uses kol,Share,Debug,hiGlobalVar;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|9:   public|42:    procedure a(var dt:TData; index:word);|42:    procedure b(var dt:TData; index:word);|5: end;|0:|14:implementation|0:|24:procedure THiAsmClass.a;|91:var gpname:procedure; //объявляем процедурную переменную такого же типа, как наша globEvent|5:begin|37: //Исполнение глоб. процедуры/функции|88: //Получаем указатель из глоб. переменной и записываем его в нашу процедурную переменную|73: gpname := pointer( ToInteger(ForceGVar('any_global_var_name_proc1')^) );|0:|47: //Проверяем, что указатель не пуст, и вызываем|31: if @gpname <> nil then gpname;|4:end;|0:|24:procedure THiAsmClass.b;|21:var gpname:procedure;|5:begin|73: gpname := pointer( ToInteger(ForceGVar('any_global_var_name_proc2')^) );|31: if @gpname <> nil then gpname;|4:end;|0:|4:end.|
 AddHint(46,1,150,26,@Hint)
}
Add(Button,4704984,203,644)
{
 Left=15
 Top=145
 Width=140
 Caption="Событие"
 link(onClick,16588685:a,[])
}
Add(Message,11179310,315,560)
{
 Message="Событие OurEvent"
}
Add(Message,13721235,315,602)
{
 Message="OurEvent1"
}
Add(Button,15182043,203,686)
{
 Left=15
 Top=170
 Width=140
 Caption="Событие1"
 link(onClick,16588685:b,[(251,692)(251,657)])
}
Add(InfoTip,802849,175,168)
{
 Info=#27:Переменные, методы между IC|44:Переменные можно считать в обычном GlobalVar|
 Font=[MS Sans Serif,8,1,0,1]
 Frame=2
 Width=365
 Height=284
 Margin=3
}
Add(InfoTip,13503753,175,469)
{
 Info=#16:События между IC|
 Font=[MS Sans Serif,8,1,0,1]
 Frame=2
 Width=365
 Height=270
 Margin=3
}
Add(InlineCode,9990335,651,217)
{
 @Hint=#48:Здесь записываем в св-во окна данные и процедуру|
 WorkPoints=#1:a|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,windows;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|9:   public|42:    procedure a(var dt:TData; index:word);|5: end;|0:|18://procedure globF;|0:|14:implementation|0:|54:procedure globF(s:string); //Наша глобальная процедура|5:begin|50: _debug('Сообщение в глобальной процедуре: ' + s);|4:end;|0:|24:procedure THiAsmClass.a;|5:begin|52: SetProp(ReadHandle, 'int_global_var_name', 951753);|72: //SetProp (winapi) связывает с окном переменную integer (т.н. свойство)|88: //Тут для окна ReadHandle (mainform) уст. св-во int_global_var_name со значением 951753|0:|67: SetProp(ReadHandle, 'int_global_var_name_proc', integer(@globF) );|87: //А здесь в св-во int_global_var_name_proc окна ReadHandle (mainform) уст. адрес globF|4:end;|0:|53://Так же есть winapi-функции RemoveProp и EnumPropsEx|51://EnumPropsEx работает через ф-цию обратного вызова|0:|4:end.|
 AddHint(45,0,182,26,@Hint)
}
Add(InlineCode,10216896,651,259)
{
 @Hint=#35:Здесь получаем из св-ва окна данные|
 WorkPoints=#1:a|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,windows;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|9:   public|42:    procedure a(var dt:TData; index:word);|5: end;|0:|14:implementation|0:|24:procedure THiAsmClass.a;|5:begin|84: //GetProp получает значение свойства int_global_var_name окна ReadHandle (mainform)|52: _debug(GetProp(ReadHandle, 'int_global_var_name'));|17: //_hi_OnEvent();|4:end;|0:|4:end.|
 AddHint(44,-1,172,26,@Hint)
}
Add(Button,3546972,588,217)
{
 Left=185
 Top=35
 Width=155
 Caption="записать число и процедуру"
 link(onClick,9990335:a,[])
}
Add(Button,9585226,588,259)
{
 Left=185
 Top=60
 Width=155
 Caption="получить число"
 link(onClick,10216896:a,[])
}
Add(InlineCode,12160868,651,301)
{
 @Hint=#38:Здесь вызываем из св-ва окна процедуру|
 WorkPoints=#1:a|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,windows;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|9:   public|42:    procedure a(var dt:TData; index:word);|5: end;|0:|14:implementation|0:|24:procedure THiAsmClass.a;|97:var gpname:procedure(s:string); //объявляем процедурную переменную такого же типа, как наша globF|5:begin|37: //Исполнение глоб. процедуры/функции|85: //Получаем указатель из свойства int_global_var_name_proc окна ReadHandle (mainform)|49: //и записываем его в нашу процедурную переменную|70: gpname := pointer( GetProp(ReadHandle, 'int_global_var_name_proc') );|0:|47: //Проверяем, что указатель не пуст, и вызываем|60: if @gpname <> nil then gpname('а это переданный параметр');|17: //_hi_OnEvent();|4:end;|0:|4:end.|
 AddHint(46,1,178,26,@Hint)
}
Add(Button,9894186,588,301)
{
 Left=185
 Top=85
 Width=155
 Caption="исполнить процедуру"
 link(onClick,12160868:a,[])
}
Add(InfoTip,4825946,560,168)
{
 Info=#45:Переменные, методы между IC (SetProp/GetProp)|40:Передача только integer (в т.ч. pointer)|
 Font=[MS Sans Serif,8,1,0,1]
 Frame=2
 Width=365
 Height=235
 Margin=3
}
Add(Label,3262055,595,119)
{
 Left=185
 Top=15
 Width=158
 Height=17
 Font=[MS Sans Serif,8,4,0,1]
 Caption="SetProp/GetProp                        "
}
Add(Button,6131637,203,385)
{
 Left=15
 Top=110
 Width=155
 Caption="получить текст через GVar"
 link(onClick,16389501:doMessage,[])
}
Add(Message,16389501,266,385)
{
 link(Message,10055018:Var,[])
}

Отредактировано 3042 (2022-12-10 22:47:35)

+1

2

3042 (для доп. информации)
Для обмена переменными (либо в качестве указателей) в контексте своего приложения можно использовать API функции как SetProp и GetProp
Для примера применял в своих светодиодах.

0

3

andrestudio, забрал в копилку и дополнил код в первом посте.
Из плюсов GlobalVar вижу то, что данные можно также получить в обычном компоненте GlobalVar (показано в примере).
А по SetProp и GetProp можно получить все установленные таким образом свойства окна (через EnumPropsEx).

Так что тут куча выбора!

0

4

Ну ребят вы такие умные умеете писать коды, тогда и пишите на форумах Delphi что тут то забыли со своими кодами, где пояснение как это работает!!!

0


Вы здесь » HiAsm - Конструктор программ » Нестандартные решения » Переменные, функции, события между IC


Рейтинг форумов | Создать форум бесплатно