Вверх ↑
Ответов: 1429
Рейтинг: 50
#1: 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]