![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() Цитата:
Уф, уф, уф. Все таки нужно свою делать. ![]() |