Написание однотипных программ

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Вопрос: у меня есть серия программ, в которых одна форма (одна на всех - одинаковая), а модули различаются лишь одной функцией. Например, в одном модуле написано 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. Можно еще делать патчи, которые будут править какие-нибудь биты непосредственно в самом экзешнике. Кто-нибудь таким занимался?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

>в одном модуле написано function f(x:real):real; begin f:=sin(x)+1; end; а в другой function f(x:real):real; begin f:=cos(x)-1; end;

в этой функции добавляешь еще один входной параметр, характеризующий версию ПО и в зависимости от него будет выполняться либо одно либо другое

Можно еще измененные функции хранить в dll и заменять только dll-ки
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

YurikGL писал(а):в этой функции добавляешь еще один входной параметр, характеризующий версию ПО и в зависимости от него будет выполняться либо одно либо другое
Это бы все хорошо, но функции я придумываю по ходу дела. Придумал - выложил, придумал - выложил. Типа плагинов в Винампе или подключаемых фильтров в Фотошопе.
YurikGL писал(а): Можно еще измененные функции хранить в dll и заменять только dll-ки
Я уже думал. Однако это особо не отличается от выкладывания самой проги. Вот исходник библиотеки:

Код: Выделить всё

Library Hello]
А длл-ка из нее получается - 372 кб!!! Кто-нибудь знает, что с этим поделать?[/quote]
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
RoKon
Сообщения: 82
Зарегистрирован: 27 мар 2005, 12:24
Откуда: Saransk City
Контактная информация:

Функции храни в текстовике. А в проге тогда использовать парсер текста в функцию, должно быть что то подобное в инете.
The trurh is out there...
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Кто-нибудь знает, что с этим поделать
Ага. Выкини нафиг Dialogs и полегчает.

Вместо этого Uses Windows;

MessageBox(0,PChar('Hello, World!'),'Important information', mb_OK);
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

можно вообще без юзесов :)

Код: Выделить всё

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';
С уважением, Lost Angel...
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

За советы спасибо. Теперь логическое продолжение: допустим, у юзверя лежат себе в папочке lib1.dll, lib2.dll, lib3.dll, ... . Я его спрашиваю: какую ддлу выбрать? Он мне говорит, скажем, восьмую. Я запоминаю куда-нибудь в стринг 'lib8.dll'. Как теперь указать проге, что функцию надо импортировать из длл с именем, лежащем в этом стринге?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Код: Выделить всё

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.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Еще один вопрос на ту же тему.
Есть у меня куча юнитов, в которых лежат фреймы - TFrame1, TFrame2 и т.д. Тэг каждого фрейма соответствует его номеру (т.е. у TFrame1 tag=1 и т.д.).
Как сделать так, чтобы на форму загружался фрейм, тэг которого (или имя - не принципиально) введет пользователь?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

&quot писал(а):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;
Ответить