Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.06.2008, 11:43
CW-operator CW-operator вне форума
Прохожий
 
Регистрация: 18.06.2008
Сообщения: 4
Репутация: 10
Вопрос Как заставить прогу на Delphi издавать сигналы (Азбуки Морзе)?

В 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  
Старый 18.06.2008, 11:57
nwn nwn вне форума
Прохожий
 
Регистрация: 18.06.2008
Сообщения: 6
Репутация: 10
По умолчанию

Код:
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  
Старый 18.06.2008, 14:20
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

Проверял, всё работает. И очень даже хорошо
__________________

Ответить с цитированием
  #4  
Старый 18.06.2008, 16:26
nwn nwn вне форума
Прохожий
 
Регистрация: 18.06.2008
Сообщения: 6
Репутация: 10
По умолчанию

Кстати, можно проще:
Код:
Windows.Beep(100,1000);
Но опытные программисты говорят, что в определенных случаях возникают проблемы.

PS. А вообще есть множество готовых программ на ввв.морсе-коде.нет
Ответить с цитированием
  #5  
Старый 18.06.2008, 17:45
CW-operator CW-operator вне форума
Прохожий
 
Регистрация: 18.06.2008
Сообщения: 4
Репутация: 10
По умолчанию

А у меня почему то ничего не получается... (И я знаю почему... ((

Может содскажете где моя тупая башка лажует?
Код:
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: Пользуемся тегами!

Последний раз редактировалось Admin, 18.06.2008 в 20:08.
Ответить с цитированием
  #6  
Старый 18.06.2008, 18:39
nwn nwn вне форума
Прохожий
 
Регистрация: 18.06.2008
Сообщения: 6
Репутация: 10
По умолчанию

Где выдается ошибка?
Попробуй Delphi 7 поставить.
Ответить с цитированием
  #7  
Старый 18.06.2008, 19:16
CW-operator CW-operator вне форума
Прохожий
 
Регистрация: 18.06.2008
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от nwn
Где выдается ошибка?
Попробуй Delphi 7 поставить.

У меня есть только 6-ка (Borland Delphi 6, а не 2006). 7-ку в обозримых окресностях найти не удастся.

Ошибку сейчас не выдает. Выводит форму чистую. Без кнопок и без чего либо. Ничего не звучит, не поет.

Сейчас попробую 6-ку поставить.
Ответить с цитированием
  #8  
Старый 18.06.2008, 19:35
nwn nwn вне форума
Прохожий
 
Регистрация: 18.06.2008
Сообщения: 6
Репутация: 10
По умолчанию

Попробуй просто
Код:
Windows.Beep(100,1000); 
написать например на OnCreate формы.
Ответить с цитированием
  #9  
Старый 18.06.2008, 19:52
CW-operator CW-operator вне форума
Прохожий
 
Регистрация: 18.06.2008
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от nwn
PS. А вообще есть множество готовых программ на ввв.морсе-коде.нет
Почему то очень тормозной тот сайт. А прог (приема на слух) там всего одна. Скачал. Не, моя DOS-овская прога 95-го года была гораздо мощнее и удобнее. Даже сравнивать нечего. Да и кириллицу не передает их прога. А надо и латинницу и кириллицу знать.

Уф, уф, уф. Все таки нужно свою делать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:01.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025