Страница 1 из 2
Написание однотипных программ
Добавлено: 05 май 2005, 16:10
Хыиуду
Вопрос: у меня есть серия программ, в которых одна форма (одна на всех - одинаковая), а модули различаются лишь одной функцией. Например, в одном модуле написано function f(x:real):real; begin f:=sin(x)+1; end; а в другой function f(x:real):real; begin f:=cos(x)-1; end; и так далее. Все программы различаются лишь одной функцией. Так как программы я выкладываю в Инет, мне не очень нравится, что изменить надо одну строчку, а закачивать по новому 400 Кб. Как тут быть? Лично мне приходит в голову только три варианта решения этой проблемы:
1: Подгрузка из файла. Например, в Си (почему я Сишникам и завидую) можно было написать как-то так (простите за неграмотность, давно на Си не писал):
В начале программы: #include my_function.h
При объявлении функции: float f(float x); {return moya_funkciya}
А в модуле my_function.h, который вполне может состоять из одной строки и спокойно редактироваться Блокнотом: #define moya_funkciya sin(x)+1 (или там #define moya_funkciya cos(x)-1).
Это, конечно, идеальный вариант, так как тогда пришлось бы выкладывать всего одну строчку, да и юзер при желании и умении может написать свою функцию. Но я не знаю, можно ли такую вещь делать в Дельфи. Кто что подскажет?
2: Второй вариант, приходящий мне в голову - это выкладывать сам текст модуля (в моем случае main.pas). Тогда у юзера должна быть небольшая

прога, которая зажевывает файлики pas, dfm, dpr и выплевывает готовый exeшник. Кто-нибудь знает, есть ли такая прога, и если есть, то где?
3. Можно еще делать патчи, которые будут править какие-нибудь биты непосредственно в самом экзешнике. Кто-нибудь таким занимался?
Добавлено: 05 май 2005, 16:17
YurikGL
>в одном модуле написано function f(x:real):real; begin f:=sin(x)+1; end; а в другой function f(x:real):real; begin f:=cos(x)-1; end;
в этой функции добавляешь еще один входной параметр, характеризующий версию ПО и в зависимости от него будет выполняться либо одно либо другое
Можно еще измененные функции хранить в dll и заменять только dll-ки
Добавлено: 05 май 2005, 21:17
Хыиуду
YurikGL писал(а):в этой функции добавляешь еще один входной параметр, характеризующий версию ПО и в зависимости от него будет выполняться либо одно либо другое
Это бы все хорошо, но функции я придумываю по ходу дела. Придумал - выложил, придумал - выложил. Типа плагинов в Винампе или подключаемых фильтров в Фотошопе.
YurikGL писал(а):
Можно еще измененные функции хранить в dll и заменять только dll-ки
Я уже думал. Однако это особо не отличается от выкладывания самой проги. Вот исходник библиотеки:
Код: Выделить всё
Library Hello]
А длл-ка из нее получается - 372 кб!!! Кто-нибудь знает, что с этим поделать?[/quote]
Добавлено: 05 май 2005, 23:16
RoKon
Функции храни в текстовике. А в проге тогда использовать парсер текста в функцию, должно быть что то подобное в инете.
Добавлено: 06 май 2005, 01:46
AiK
Кто-нибудь знает, что с этим поделать
Ага. Выкини нафиг Dialogs и полегчает.
Вместо этого Uses Windows;
MessageBox(0,PChar('Hello, World!'),'Important information', mb_OK);
Добавлено: 16 май 2005, 11:35
LAngel
можно вообще без юзесов
Код: Выделить всё
function MessageBox(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer; stdcall; external 'user32.dll' name 'MessageBoxA';
procedure helloworld;
begin MessageBox(0,PChar('Hello, World!'),'Important information', $30); end;
exports
helloworld index 1 name 'helloworld';
Добавлено: 16 май 2005, 16:44
Хыиуду
За советы спасибо. Теперь логическое продолжение: допустим, у юзверя лежат себе в папочке lib1.dll, lib2.dll, lib3.dll, ... . Я его спрашиваю: какую ддлу выбрать? Он мне говорит, скажем, восьмую. Я запоминаю куда-нибудь в стринг 'lib8.dll'. Как теперь указать проге, что функцию надо импортировать из длл с именем, лежащем в этом стринге?
Добавлено: 16 май 2005, 18:42
Eugie
Код: Выделить всё
uses Windows;
type TMyFunc = function(<parameter_list>): <return_type>;
PMyFunc = ^TMyFunc;
...
function CallMyFunc(pDllName, pFuncName: String): <return_type>;;
var hLib: HMODULE;
pFun: PMyFunc;
begin
HMODULE hLib := LoadLibrary(pDllName);
pFun := PMyFunc(GetProcAddress(hLib, pFuncName));
Result := pFun(...);
FreeLibrary(hLib);
end;
...
PS При вызове GetProcAddress нужно учитывать name mangling ('украшения' имен импортируемых функций, зависит от calling convention - cdecl, stdcall итд) и задавать имя функции, как оно выглядит в секции импорта DLL.
Re: Написание однотипных программ
Добавлено: 17 дек 2006, 15:10
Хыиуду
Еще один вопрос на ту же тему.
Есть у меня куча юнитов, в которых лежат фреймы - TFrame1, TFrame2 и т.д. Тэг каждого фрейма соответствует его номеру (т.е. у TFrame1 tag=1 и т.д.).
Как сделать так, чтобы на форму загружался фрейм, тэг которого (или имя - не принципиально) введет пользователь?
Re: Написание однотипных программ
Добавлено: 18 дек 2006, 05:21
SergeyS
" писал(а):1: Подгрузка из файла. Например, в Си (почему я Сишникам и завидую) можно было написать как-то так (простите за неграмотность, давно на Си не писал):
В начале программы: #include my_function.h
При объявлении функции: float f(float x); {return moya_funkciya}
А в модуле my_function.h, который вполне может состоять из одной строки и спокойно редактироваться Блокнотом: #define moya_funkciya sin(x)+1 (или там #define moya_funkciya cos(x)-1).
в delphi есть директива {$include my_function.inc} позволяет подключать внешний файл. Действует точно также как и в Си. Если имя функции в файле my_function.inc не менять от модуля к модулю, то можно и без #define обойтись.
Примерный текст файла my_function.inc:
Код: Выделить всё
function my_function(x: real): real;
begin
Result := sin(x) + 1;
end;