Вверх ↑
Этот топик читают: Гость
Ответов: 1264
Рейтинг: 28
#1: 2020-01-11 16:03:09 ЛС | профиль | цитата
Реально ли как то объявлять функции в IC, глобально, для использования их в других блоках IC?

Использовать uses не вариант, ибо нужно что бы весь код был именно в проекте.

Редактировалось 2 раз(а), последний 2020-01-11 16:05:29
карма: 2

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4637
Рейтинг: 511
#2: 2020-01-12 07:22:02 ЛС | профиль | цитата
Я не понял конечно чем uses не устраивает но как вариант

Add(MainForm,2953706,49,112)
{
}
Add(InlineCode,14427965,259,112)
{
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|0:|5: end;|0:|14:implementation|0:|26:procedure TestIC; stdcall;|5:begin|19: _debug('testIC');|4:end;|0:|7:exports|9: TestIC;|0:|4:end.|
}
Add(Button,12775953,133,112)
{
Left=20
Top=35
link(onClick,3237490:doTest,[])
}
Add(InlineCode,3237490,189,112)
{
WorkPoints=#6:doTest|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,windows,Share,Debug;|0:|4:type|0:|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|48: procedure doTest(var dt: TData; idx: word);|5: |5: end;|0:|14:implementation|0:|29:procedure THiAsmClass.doTest;|3:var|29: TestIC: procedure; stdcall;|13: p: pointer;|5:begin|43: p := GetProcAddress(HInstance, 'TestIC');|19: if p <> nil then |7: begin|16: TestIC := p;|11: TestIC;|6: end;|4:end;|0:|4:end.|
}

карма: 6

0
Ответов: 4637
Рейтинг: 511
#3: 2020-01-12 08:51:03 ЛС | профиль | цитата
Сами то функции может быть и не столь интересны а вот вызов методов других IC тоже ничего сложного

Add(MainForm,2953706,77,112)
{
}
Add(Button,12775953,133,112)
{
Left=20
Top=35
link(onClick,3237490:doTest,[])
}
Add(InlineCode,3237490,189,112)
{
WorkPoints=#6:doTest|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,windows,Share,Debug;|0:|4:type|0:|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|48: procedure doTest(var dt: TData; idx: word);|5: |5: end;|0:|14:implementation|0:|29:procedure THiAsmClass.doTest;|3:var|29: TestIC: procedure; stdcall;|13: p: pointer;|5:begin|51: p := GetProcAddress(HInstance, 'TestICClassExp');|19: if p <> nil then |7: begin|16: TestIC := p;|11: TestIC;|6: end;|4:end;|0:|4:end.|
}
Add(InlineCode,5900510,252,112)
{
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|27: procedure TestICClass;|5: end;|0:|0:|14:implementation|0:|3:var|19: hi: THiAsmClass; |0:|34:procedure THiAsmClass.TestICClass;|5:begin|24: _debug('TestICClass');|4:end;|0:|34:procedure TestICClassExp; stdcall;|5:begin|27: hi := THiAsmClass.Create;|17: hi.TestICClass;|10: hi.Free;|4:end;|0:|7:exports|17: TestICClassExp;|0:|4:end.|
}

карма: 6

0
Ответов: 1264
Рейтинг: 28
#4: 2020-01-12 09:16:26 ЛС | профиль | цитата
andrestudio, спасибо, буду разбираться.

uses не подходит тем, что перед компиляцией, в коде IC меняются данные некоторые, и если IC засунуть в hiasm, в качестве библиотеки, она будет одна на все проекты, а если это останется как IC, то он изолирован ото всех.
жаль что когда то так и не придумали вариант, как вынести некоторые данные за пределы IC, дабы их менять уже в откомпилированом проекте

1

DVR_DEVICE_NAME='123';
DRIVER_SVC_NAME='123';

function IRME(): DWORD;
begin
Result:=CTL_CODE($9562, $2700, 0, 1 or 2);
end;


разных модулей с одним и тем же содержимым очень много, хотел их главную часть собрать в 1 кучу, дабы уменьшить код проекта, потому как само сердце модуля одно и тоже, а вот мелкие кусочки уже разные, делать их как то более универсальными смысла нет, потому как важно сохранить минимализм во всём

Редактировалось 4 раз(а), последний 2020-01-12 09:21:21
карма: 2

0
Ответов: 1264
Рейтинг: 28
#5: 2020-04-29 13:23:12 ЛС | профиль | цитата
каким образом можно объявить в IC, глобальную переменную для всех IC ?

Редактировалось 2 раз(а), последний 2020-04-29 13:27:43
карма: 2

0
Ответов: 1700
Рейтинг: 120
#6: 2020-04-29 13:49:39 ЛС | профиль | цитата
Rysik, вот так:
unit Gvaruse;

interface
var
IFS3: Integer;
DIMBL : array[0..20] of integer;


implementation


end.
Делаешь Gvaruse.pas и где хочешь юзать, там и вставляешь: uses Kol,Gvaruse,Share;

Предвидя дальнейшее развитие событий, советую прикручивать в таких случаях скриптовые языки LUA, Python к своим проектам.

Редактировалось 2 раз(а), последний 2020-04-29 14:04:48
карма: 5

0
Ответов: 1264
Рейтинг: 28
#7: 2020-04-29 14:06:10 ЛС | профиль | цитата
flint2 писал(а):
Rysik, вот так:
unit Gvaruse;

interface
var
IFS3: Integer;
DIMBL : array[0..20] of integer;


implementation


end.
Делаешь Gvaruse.pas и где хочешь юзать, там и вставляешь: uses Kol,Gvaruse,Share;



Спасибо, попробую
карма: 2

0
Ответов: 4309
Рейтинг: 670
#8: 2020-05-01 11:54:29 ЛС | профиль | цитата
Можно создать один IC, содержащий все необходимые методы и глобальные данные. Выбрать меню "Правка"-"Копировать ссылку", и "Вставить" в нужные места. Тогда все вставленные копии могут использовать общие данные. Если это работает с IC. Но в копиях тогда ничего нельзя будет менять.

Редактировалось 1 раз(а), последний 2020-05-01 11:54:47
карма: 23

0
Ответов: 1264
Рейтинг: 28
#9: 2020-05-01 20:39:59 ЛС | профиль | цитата
Хотел загнать Handle например, во все нужные IC, дабы не таскать за собой никакие Gvar или же линии
карма: 2

0
Ответов: 1886
Рейтинг: 164
#10: 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 - там ключ ко всему.

Возможно, знатоки подскажут, где что можно упростить или улучшить.
карма: 7
1
Голосовали:Rysik
Ответов: 1264
Рейтинг: 28
#11: 2020-05-02 13:21:04 ЛС | профиль | цитата
3042 писал(а):
Чтобы лучше понимать, надо разобраться с кодом hiGlobalVar.pas - там ключ ко всему.


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

отлично работает
карма: 2

0
Ответов: 142
Рейтинг: 7
#12: 2020-11-02 13:23:06 ЛС | профиль | цитата
Подскажите как запустить из одного IC, событие в другом IC (_hi_OnEvent)?
Или это плохая затея?

Редактировалось 1 раз(а), последний 2020-11-02 13:25:58
карма: 0

0
Ответов: 4309
Рейтинг: 670
#13: 2020-11-02 14:33:42 ЛС | профиль | цитата
В том IC, который вызывает, нужно получить ссылку на объект другого IC.
Вызвать как _hi_OnEvent(ic2.onMyEvent).
А чтобы получить ссылку, второй IC должен куда-то глобально сохранить Self, откуда первый IC её прочитает.
карма: 23

0
Ответов: 142
Рейтинг: 7
#14: 2020-11-02 15:51:48 ЛС | профиль | цитата
Netspirit, Спасибо, но без примера не осилю, пол дня уже долблюсь
карма: 0

0
Ответов: 4637
Рейтинг: 511
#15: 2020-11-02 17:11:50 ЛС | профиль | цитата
Joiner, сделай Unit с классом, в нём сделай propety Event с парами функций типа GetEvent и SetEvent и передавай/читай ссылки как посоветовал коллега Netspirit. Можно и без класса с глобальной переменной но это только если твои хотелки между двумя IC
карма: 6

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)