Как вызвать процедуру из одного 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)