Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
#16: 2010-09-20 13:34:50 ЛС | профиль | цитата
Если я правильно понял, то исполняемая функция должна находиться в IC и вызываться из Dll. Это некий прообраз CallBack функции, те, функции обратного вызова

А че написал на Delphi, а не на KOL, не проще было бы, у нас же возможно тоже компилить dll без установки Delphi и его библиотек

карма: 22

0
Ответов: 3349
Рейтинг: 233
#17: 2010-09-20 13:58:21 ЛС | профиль | цитата
Чтобы вызвать событие в длл должна происходить какое либо действие.
А в другом случае я не представляю как можно такое сделать.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#18: 2010-09-21 08:59:47 ЛС | профиль | цитата
Ivann, Спасибо!, Шикарно!
Но я, не могу узнать, работает оно или нет. Поскольку, не могу скомпилировать реальную DLL.

Произошла странность:
В виде приложения код DLL работает, а в виде библиотеки - выдает ошибку:
[Error] MyDll.dpr(53): Incompatible types: 'method pointer and regular procedure'


#pas
library MyDll;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, midi;

{$R *.res}
type
TEFunc = procedure(n:PChar) of object;


procedure DoMidiInData(const aDeviceIndex: integer; const aStatus, aData1, aData2: byte);
var
lHour, lMin, lSec, lMSec: Word;
cha1:PChar;
func:TEFunc;
begin
// skip active sensing signals from keyboard
if aStatus = $FE then Exit;


try
// print the message log
DecodeTime( now, lHour, lMin, lSec, lMSec );

cha1:=PChar(Format( '[%.2d:%.2d:%.2d:%.3d] %s: <Status> %.2x, <Data 1> %.2x <Data 2> %.2x',
[ lHour, lMin, lSec, lMSec,
MidiInput.Devices[aDeviceIndex],
aStatus,
aData1,
aData2 ] ));

func(cha1); //возвращает значение в HiAsm

finally

end;
end;





procedure Mess(func:TEFunc); //создание списка входов
var cha:PChar;
begin
cha:= PChar(Midiinput.Devices[0]);
func(cha);

// MidiInput.Open(0); // выбор входа
// MidiOutput.Open(2); //выбор выхода

MidiInput.OnMidiData := DoMidiInData; //Старт работы (тут указывается функция, на которую возвращать данные)

end;


exports
Mess;
begin

end.






А необходимый midi.pas вот:

code_20702.txt
------------ Дoбавленo в 08.59:
В виде обычного приложения, вот это компилируется (хотя это тоже самое)

#pas
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Midi, StdCtrls, SyncObjs, CheckLst;

type
TForm1 = class(TForm)
memLog: TMemo;
lbxInputDevices: TCheckListBox;
lbxOutputDevices: TCheckListBox;
procedure FormCreate(Sender: TObject);

private

public
procedure DoMidiInData( const aDeviceIndex: integer; const aStatus, aData1, aData2: byte );
end;

var
Form1: TForm1;

implementation
{$R *.dfm}





procedure TForm1.DoMidiInData(const aDeviceIndex: integer; const aStatus,
aData1, aData2: byte);
var
i: integer;
lHour, lMin, lSec, lMSec: Word;
begin
// skip active sensing signals from keyboard
if aStatus = $FE then Exit;


memLog.Lines.BeginUpdate;
try
// print the message log
DecodeTime( now, lHour, lMin, lSec, lMSec );
memLog.Lines.Insert( 0, Format( '[%.2d:%.2d:%.2d:%.3d] %s: <Status> %.2x, <Data 1> %.2x <Data 2> %.2x',
[ lHour, lMin, lSec, lMSec,
MidiInput.Devices[aDeviceIndex],
aStatus,
aData1,
aData2 ] ));
finally
memLog.Lines.EndUpdate;
end;
end;



procedure TForm1.FormCreate(Sender: TObject); //Создание формы
begin

// MidiInput.Open( 0 ); // выбор входа
// MidiOutput.Open( 2); //выбор выхода

lbxInputDevices.Items.Assign( MidiInput.Devices ); //создание списка входов
lbxOutputDevices.Items.Assign( MidiOutput.Devices );//создание списка выходов

MidiInput.OnMidiData := DoMidiInData; //Старт работы (тут указывается функция, на которую возвращать данные)

end;


end.



карма: 0

0
файлы: 2code_20701.txt [1.2KB] [139], code_20702.txt [6.6KB] [127]
Ответов: 3349
Рейтинг: 233
#19: 2010-09-21 13:25:36 ЛС | профиль | цитата
Вроде бы procedure of object нельзя использовать в программе без очереди сообщений, но лучше спроси у nesco или у кого нибудь более грамматных чем я.
------------ Дoбавленo в 13.25:
Можно попрбовать посылать указатель на процедуру из ic и уже в самом ic производить нужные действия.
карма: 1

0
Разработчик
Ответов: 4698
Рейтинг: 426
#20: 2010-09-21 13:43:55 ЛС | профиль | цитата
Ivann писал(а):
у кого нибудь более грамматных чем я.

Мда, уж... точно
login писал(а):
Произошла странность:
В виде приложения код DLL работает, а в виде библиотеки - выдает ошибку:
[Error] MyDll.dpr(53): Incompatible types: 'method pointer and regular procedure'

замени определение
#pas
TEFunc = procedure(n:PChar) of object;
на
#pas
TEFunc = procedure(n:PChar);
of object - значит "принадлежит объекту\классу", а у тебя в библиотеке используется процедура вне класса (а вот в программе как раз в классе TForm1).
карма: 10
1
Голосовали:Ivann
Ответов: 3349
Рейтинг: 233
#21: 2010-09-21 13:50:10 ЛС | профиль | цитата
Assasin писал(а):
замени определение

А TEFunc здесь причем?
карма: 1

1
Голосовали:Assasin
Разработчик
Ответов: 4698
Рейтинг: 426
#22: 2010-09-21 13:58:44 ЛС | профиль | цитата
Мда, прошу прощения, выше дана неверная правка, я немного обознался, тебе придется либо загнать
procedure DoMidiInData( const aDeviceIndex: integer; const aStatus, aData1, aData2: byte );
в класс, либо править midi.pas
P.S: предпочтительнее "в классобъект"
карма: 10
0
Ответов: 3349
Рейтинг: 233
#23: 2010-09-21 14:03:04 ЛС | профиль | цитата
login, а зачем ты все это пихаеш в dll?
карма: 1

0
Ответов: 1429
Рейтинг: 50
#24: 2010-09-21 17:53:22 ЛС | профиль | цитата
Ivann, да, этот midi.pas можно и не пихать в DLL. А просто взять и вставить в IC, но я не знаю delphi на столько, чтобы подогонять его под HiAsm.
Он использует какие-то там ресурсы Delphi7.
карма: 0

0
Ответов: 3349
Рейтинг: 233
#25: 2010-09-21 18:03:52 ЛС | профиль | цитата
login писал(а):
Он использует какие-то там ресурсы Delphi7.

Раньше у товарища Assasin-a была подпись Главное понять код а не тупо списать из источника. Или как-то так
Ну вот сначала бы посмотрел что он использует, и как работает, а только потом бы делал.
Сильной привязанности к vcl нет, так что можно портировать без особых усилий;
карма: 1

0
Ответов: 1429
Рейтинг: 50
#26: 2010-09-22 08:04:47 ЛС | профиль | цитата
Ivann, я делал такую попытку, не получилось у меня. И есть еще модули, которые гораздо больше этого, я их не осилю "переработать", и поэтому хочу понимать как работать с DLL. Но мысль мне понятна, буду разбираться с языком.
------------ Дoбавленo в 08.04:
private
fDevices: TStringList;

Чем можно заменить в IC формат TStringList?
Ато он пишет, что не знает такого.
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#27: 2010-09-22 08:48:08 ЛС | профиль | цитата
login писал(а):
Чем можно заменить в IC формат TStringList?

Смотри код штатного компонента StrList, переменная FList
карма: 22

0
Ответов: 1429
Рейтинг: 50
#28: 2010-09-22 10:11:45 ЛС | профиль | цитата
nesco, спасибо, нашел работает.
Скажите, а как вообще надо мыслить, перерабатывая midi.pas в ic код, когда встречаеш вот такое:
begin
fDevices := TStringLIst.create;
end;

TStringLIst - в Delphi7 это обьект, который понимает команды (.create - это команда), и в коде подобных штук много.
А в IC такого понятия нет, хотябы на словах скажите, в какую сторону думать, чтобы такое заменить?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#29: 2010-09-22 10:30:06 ЛС | профиль | цитата
login писал(а):
Все гениальное - просто, но не все гениальное. (c) Login
А фраза то принадлежит Геббельсу
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1429
Рейтинг: 50
#30: 2010-09-22 10:34:25 ЛС | профиль | цитата
Не могу сформировать план действий, что нужно делать, чтобы перерабатывать код под IC.
Можете, коротко, просто на словах, сказать, что надо делать? При попытке компилировать в IC midi.pas возникает аж 20 ошибок.

В инете полно уроков по Delphi7 где советуют всякое: "Devices := Form1.create" то-есть уроков по самой среде борланда. И откуда, вообще можно получить понимание того, почему именно:
Assasin писал(а):
тебе придется либо загнать
procedure DoMidiInData( const aDeviceIndex: integer; const aStatus, aData1, aData2: byte );
в класс, либо править midi.pas
P.S: предпочтительнее "в классобъект"


Я понимаю как устроен код проэкта, что обьявлены процедуры, а ниже их реализация и все такое, и они каждый в своем классе сидят.
Но я, напрочь, не понимаю как программа! работает! Количество взаимосвязей между процедурами, может доходить до нескольких вложений, умножаем это на количество процедур в проэкте, и получаем полнейший дурдом бесконечных переходов. Хождение глазами по этим переходам ничего не дает, поскольку к концу перехода забывается его начало, и забываются переходы других функций.

Негде получить целостную информацию о типах и о последовательности работы чужого, готового проэкта.
Что почитать посоветуете?
------------ Дoбавленo в 10.34:
Tad, я этого не знал, в голове перед телеком неделю назад придумалось.
карма: 0

1
Голосовали:olDjeka
Сообщение
...
Прикрепленные файлы
(файлы не залиты)