![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
В 95-м году на Турбо Паскале 7.0 я написал прогу-тренажер для обучения приему на слух Азбуки Морзе. Но прога была для DOS и сейчас не работает под Виндами XP и Visto'й.
Сейчас решил перелопатить прогу под Винду в Delphi. С интерфейсом разобрался, с вводом текста вроде тоже. Но вот убейте, не пойму как заставить Delphi "звуки издавать" через звукашку ( и/или через системный динамик). Какой компонент или что там отвечает за вывод звука? Мне нужно чтобы можно было вводить тон (частоту) и длительность и чтобы прога начала звучать соответственно... Что то вроде стандартных ТурбоПаскалевских ------------------------------ PROCEDURE Err; const st = 70; ton = 2000; begin sound(ton); delay(st); nosound; delay(st); end; ---------------------------- И вообще насколько код ТрубаПаскалю соответствует коду Delphi Pascal ??? (Для инфы у меня Delphi 4, но могу поставить 6-й). Спасибо за помощь и советы! |
|
#2
|
|||
|
|||
|
Код:
procedure SetPort(address, Value:Word);
var
bValue: byte;
begin
bValue := trunc(Value and 255);
asm
mov dx, address
mov al, bValue
out dx, al
end;
end;
function GetPort(address:word):word;
var
bValue: byte;
begin
asm
mov dx, address
in al, dx
mov bValue, al
end;
GetPort := bValue;
end;
procedure Sound(Freq : Word);
var
B : Byte;
begin
if Freq > 18 then
begin
Freq := Word(1193181 div LongInt(Freq));
B := Byte(GetPort($61));
if (B and 3) = 0 then
begin
SetPort($61, Word(B or 3));
SetPort($43, $B6);
end;
SetPort($42, Freq);
SetPort($42, Freq shr 8);
end;
end;
procedure NoSound;
var
Value: Word;
begin
Value := GetPort($61) and $FC;
SetPort($61, Value);
end;
procedure Beep(Tone, Duration: Word);
begin
if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then
Windows.Beep(Tone, Duration)
else
begin
Sound(Tone);
Windows.Sleep(Duration);
NoSound;
end;
end;И потом, например, при VCL: Код:
procedure TForm1.Button1Click(Sender: TObject); begin Beep(100,100); end; PS. Не забудь функции(и процедуры) объявить |
|
#3
|
||||
|
||||
|
Проверял, всё работает. И очень даже хорошо
![]() |
|
#4
|
|||
|
|||
|
Кстати, можно проще:
Код:
Windows.Beep(100,1000); PS. А вообще есть множество готовых программ на ввв.морсе-коде.нет |
|
#5
|
|||
|
|||
|
А у меня почему то ничего не получается...
(И я знаю почему... ((Может содскажете где моя тупая башка лажует? Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure SetPort(address, Value:Word);
procedure Sound(Freq : Word);
procedure NoSound;
procedure Beep(Tone, Duration: Word);
procedure Button1Click (Sender: TObject);
function GetPort(address:word):Word;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{-------------------------------------------------------------}
procedure TForm1.SetPort(address, Value:Word);
var
bValue: byte;
begin
bValue := trunc(Value and 255);
asm
mov dx, address
mov al, bValue
out dx, al
end;
end;
function TForm1.GetPort(address:word):word;
var
bValue: byte;
begin
asm
mov dx, address
in al, dx
mov bValue, al
end;
GetPort := bValue;
end;
procedure TForm1.Sound(Freq : Word);
var
B : Byte;
begin
if Freq > 18 then
begin
Freq := Word(1193181 div LongInt(Freq));
B := Byte(GetPort($61));
if (B and 3) = 0 then
begin
SetPort($61, Word(B or 3));
SetPort($43, $B6);
end;
SetPort($42, Freq);
SetPort($42, Freq shr 8);
end;
end;
procedure TForm1.NoSound;
var
Value: Word;
begin
Value := GetPort($61) and $FC;
SetPort($61, Value);
end;
procedure TForm1.Beep(Tone, Duration: Word);
begin
if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then
Windows.Beep(Tone, Duration)
else
begin
Sound(Tone);
Windows.Sleep(Duration);
NoSound;
end;
end;
{--------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
begin
Beep(1000,100);
end;
{-------------------------------------- }
end.Последний раз редактировалось Admin, 18.06.2008 в 20:08. |
|
#6
|
|||
|
|||
|
Где выдается ошибка?
Попробуй Delphi 7 поставить. |
|
#7
|
|||
|
|||
|
Цитата:
У меня есть только 6-ка (Borland Delphi 6, а не 2006). 7-ку в обозримых окресностях найти не удастся. Ошибку сейчас не выдает. Выводит форму чистую. Без кнопок и без чего либо. Ничего не звучит, не поет. Сейчас попробую 6-ку поставить. |
|
#8
|
|||
|
|||
|
Попробуй просто
Код:
Windows.Beep(100,1000); |
|
#9
|
|||
|
|||
|
Цитата:
Уф, уф, уф. Все таки нужно свою делать. ![]() |