![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Господа, помогите сделать.
есть несколько модулей (init1,init2) с полностью идентичными процедурами (имя процедуры, переменные) нужно сделать так чтоб можно было выбрать из списка алгоритм расчета (совпадает с именем модуля) и программа выполнялась только по тем процедурам что в выбранном модулe. ниже привел схему, которая работает с DLL но не с модулями Код:
unit algoritm1;
procedure Input(A,B,C:integer; Rez1:integer);
procedure OutPut(G:integer; Rez2:integer);
procedure Run(F:integer; Rez3:integer);
exports
Input name 'Input',
OutPut name 'OutPut',
Run name 'Run';
begin
end.
unit algoritm2;
procedure Input(A,B,C:integer; Rez1:integer);
procedure OutPut(G:integer; Rez2:integer);
procedure Run(F:integer; Rez3:integer);
exports
Input name 'Input',
OutPut name 'OutPut',
Run name 'Run';
begin
end.
unit General;
type
TG_input = procedure (A,B,C:integer; Rez1:integer);
TG_Output = procedure (G:integer; Rez2:integer);
TG_Run = procedure (F:integer; Rez3:integer);
var
input :TG_input;
Output :TG_Output;
Run :TG_Run;
implementation
procedure TForm1.ListBox1MouseDown();
var
lbox :string;
begin
lbox:=ListBox1.Items.Strings[ListBox1.ItemIndex];
@input:=getProcAddress( lbox ,'Input');
@Output:=getProcAddress( lbox ,'Output');
@Run:=getProcAddress( lbox ,'Run');
end;
end. |
|
#2
|
||||
|
||||
|
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyBeep = procedure(dwFreq, dwDuration: DWORD);
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure MyBeep(dwFreq, dwDuration: DWORD);
begin
Windows.Beep(dwFreq, dwDuration);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
p: TMyBeep;
begin
@p:=@Unit1.MyBeep;
p(1000, 100);
end;
end. |
|
#3
|
|||
|
|||
|
не совсем так. в данном случае Unit1- должно быть string
|
|
#4
|
||||
|
||||
|
в данном случае Unit1 вообще не нужно и написано для примера:
Код:
@p:=@MyBeep; |
|
#5
|
|||
|
|||
|
тогда это не то что нужно. смысл в том чтоб по имени модуля запускать процедуры. причем имя модуля задается символьно. количество модулей бесконечно и поэтому нельзя "привязаться" к ним жестко (Unit1.MyBeep)
|
|
#6
|
||||
|
||||
|
тогда не понятно зачем это нужно? почему конечному пользователю нужно знать имена всех модулей, тем более что их бесконечное число)))
|
|
#7
|
|||
|
|||
|
модуль я выбираю из падающего списка (string) и потом мне нужно преобразовать этот стринг в "имя модуля.имя процедуры"
|
|
#8
|
||||
|
||||
|
Код:
var
p: TMyBeep;
begin
case ComboBox1.ItemIndex of
0: @p:=@Unit1.MyBeep;
1: @p:=@Unit2.MyBeep;
end;
p(1000, 100);
end; |
|
#9
|
||||
|
||||
|
а какой смысл хранить в каждом модуле одну и ту же процедуру?
|
|
#10
|
|||
|
|||
|
такую схему реализации откинул изначально, ввиду ее неудобности (большое кол-во проценур в каждом модуле)
я в самом начале показал реализованную схему для DLL. хотел бы что указатели на процедуры можно было бы записать аналогичним способом для модулей. @input:=getProcAddress( lbox ,'Input'); getProcAddress -работает для dll (где lbox-имя файла dll, Input-имя процедуры в файле dll). может есть аналогичный оператор для перевода имени модуля в ссылку? смысл хранить одну и туже процедуру в модуле состоит в том, чтоб можно было через "управляющий" модуль просто реализовать ссылку на нужный модуль с аналогичным название процедуры. такая схема проста в отлавливании багов и служит фундаментом для тестирования будующих dll процедуры не есть полностью одинаковые, у них одинаковые названия но алгоритмы разные Последний раз редактировалось stas77, 19.06.2012 в 13:15. |
|
#11
|
|||
|
|||
|
если есть глобальные переменные между модулями, то наверно можно сделать, чтобы модули добавляли туда указатели, но имя модуля придётся в каждом модуле продублировать в константе какой-нибудь
чем dll не подошли? |
|
#12
|
|||
|
|||
|
dll тестировать неудобно, а так помодульно отладиться можно и уже потом создать окончательный dll
|
|
#13
|
||||
|
||||
|
Цитата:
|
|
#14
|
|||
|
|||
|
как пошагово протестировать dll если вылазит ошибка?
приходится создавать модуль в программе со всеми процедурами dll и пошагово тестировать. так вот хотелось бы сначала оттестировать в отдельном модуле а потом уж записать в dll. у меня написан интерфейс программы, а к нему уже динамически подключаются нужные dll. |
|
#15
|
|||
|
|||
|
Оставлю ссылку тут. Код из последнего сообщения по моему мнению вполне понятен.
p.s. эх... все больше ценю 1С... в данном случае за наличие оператора Выполнить(Строка); который выполняет код в строке... |