![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() а какой смысл хранить в каждом модуле одну и ту же процедуру?
Поживу - увижу, Доживу - узнаю, Выживу - учту. ![]() [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#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С... в данном случае за наличие оператора Выполнить(Строка); который выполняет код в строке... |