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