Вверх ↑
Ответов: 1925
Рейтинг: 172
#1: 2020-05-02 00:15:39 ЛС | профиль | цитата
Rysik, а код hiGlobalVar.pas не смотрел? Я в своей программе брал его за основу для таких "суперглобальных" переменных. Вот как пример суперглобальной переменной и процедуры:

Add(GlobalVar,10055018,238,273)
{
}
Add(InlineCode,4856348,259,126)
{
@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,259,168)
{
@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,196,126)
{
Left=100
Top=45
Width=140
Caption="записать текст и ф-цию "
link(onClick,4856348:a,[])
}
Add(Button,15025473,196,168)
{
Left=100
Top=70
Width=140
Caption="получить текст"
link(onClick,9962017:a,[])
}
Add(InlineCode,12655881,259,210)
{
@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,196,210)
{
Left=100
Top=95
Width=140
Caption="исполнить процедуру"
link(onClick,12655881:a,[])
}
Чтобы лучше понимать, надо разобраться с кодом hiGlobalVar.pas - там ключ ко всему.

Возможно, знатоки подскажут, где что можно упростить или улучшить.
карма: 9
1
Голосовали:Rysik