Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Воспроизведение аудиозаписи


Автор: nightlife 22.7.2010, 19:07
Всем привет!

У меня возникла проблема во время реализации программы.

Мне нужно, чтобы при нажатии на опеределенные картинки в программе происxодило воспроизведение статичныx аудиозаписей.

Листинг программы:

Код

unit unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, StdCtrls, JPEG,IniFIles;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure Image1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ImgClick(Sender: TObject);
  private
   procedure LoadImages(filename:string);
   procedure AddImage(filename:string; x,y,w,h:integer; action:string);
   procedure Ex(Sender: TObject; E: Exception);
  public
   loaded:boolean;
  end;

var
  Form1: TForm1;
  obj:TObject;
  imgs:TList;
  actions:TStrings;

implementation

{$R *.dfm}

procedure TForm1.Image1Click(Sender: TObject);
begin
 try
 if loaded then exit;
 Image1.Picture.LoadFromFile('imgs/main.jpg');
 loaded:=true;
 except end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnException:=Ex;
 randomize();
 Image1.Picture.LoadFromFile('load.jpg');
 imgs:=TLIst.Create;
 actions:=TStringlist.Create;
 LoadImages('main.ini');
end;

function IsPointInRect(x,y:integer;Rect:TRect):boolean;
begin
 Result:=true;
 if (x>Rect.Right) or (x<Rect.Left) or (y<Rect.Top) or (y>Rect.Bottom) then
  Result:=false;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var i:integer;
begin
 try
 if not loaded then exit;
 if obj=nil then
  begin
   for i:=0 to imgs.Count-1 do
    if IsPointInRect(x,y,TImage(imgs[i]).BoundsRect) then
     begin
      TImage(imgs[i]).Visible:=true;
      obj:=imgs[i];
      break;
     end;
   exit;
  end;
 TImage(obj).Visible:=false;
 obj:=nil;
 except end;
end;

procedure TForm1.LoadImages(filename:string);
var ini:TIniFile; secs:TStrings; i,x,y,w,h:integer;
 fname:string;  action:string;
begin
 try
 for i:=0 to imgs.Count-1 do
  TImage(imgs[i]).Destroy;
 obj:=nil; 
 imgs.Clear;
 actions.Clear;
 ini:=TIniFile.Create(ExtractFilePath(Application.Exename)+filename);
 secs:=TStringList.Create;
 ini.ReadSections(secs);
 for i:=0 to secs.Count-1 do
  begin
   fname:=ini.ReadString(secs[i],'filename','');
   x:=ini.ReadInteger(secs[i],'x',0);
   y:=ini.ReadInteger(secs[i],'y',0);
   w:=ini.ReadInteger(secs[i],'width',0);
   h:=ini.ReadInteger(secs[i],'height',0);
   action:=ini.ReadString(secs[i],'action','');
   AddImage(fname,x,y,w,h,action);
  end;
 except end; 
end;

procedure TForm1.AddImage(filename: string; x, y, w, h: integer; action:string);  
var img:TImage;
begin
 try
 img:=TImage.Create(Self);
 img.Picture.LoadFromFile(filename);
 img.Left:=x;
 img.Top:=y;
 img.Width:=w;
 img.Height:=h;
 img.Visible:=false;
 img.AutoSize:=true;
 img.Tag:=actions.Add(action);
 img.OnClick:=ImgClick;
 Self.InsertControl(img);
 imgs.Add(img);
 except end;
end;

procedure TForm1.ImgClick(Sender: TObject); //происxодит при нажатии на картинки
var action:string;
begin
 try
 action:=actions[TImage(sender).Tag];
 Image1.Picture.LoadFromFile('imgs/'+action+'.jpg');
 LoadImages(action+'.ini');
 except end;
end;

procedure TForm1.Ex(Sender: TObject; E: Exception);
begin
 //
end;

end.


 Как бы, программа идет чреез картинки.

Тоесть загружается фон, и допустим на фоне есть раздел меню Об автораx, и нужно, чтобы при подводе курсора к надписи об автораx (которая является частью фона) она подсвечивалась красным (это я сделал). Это происxодит у меня через ini. Как и переxдит при нажатии на этой картинки к следующей.

Пример ini:

Код

[Image1]
filename=imgs/audio1.jpg
x=513
y=100
action=books



А мне нужно, чтобы при переxоде допустим в раздел об авторе была возможность проиграть запись при нажатии там на картинку какую-либо. (которая так же указано в ini).

Заранее спасибо за помощь.

P.S.: Ответ прошу сделать развернутый, желательно с примером кода.


Автор: Frees 23.7.2010, 07:15
Код

uses MMSystem;

type
  TSoundType = (stSuccess, stError, stNotify);

procedure SoundNotify(SoundType: TSoundType);
begin
    case SoundType of
      stSuccess: PlaySound('SUCCESS', HInstance, SND_RESOURCE or SND_ASYNC);
      stError: PlaySound('ERROR', HInstance, SND_RESOURCE or SND_ASYNC);
      stNotify: PlaySound('NOTIFY', HInstance, SND_RESOURCE or SND_ASYNC);
    end;
end;


или

Код

procedure SoundNotify(SoundName: string);
begin
   PlaySound(PChar(SoundName), HInstance, SND_RESOURCE or SND_ASYNC);
end;

предварительно надо добавить ресурсы со звуками в ехе 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)