Всем привет!
У меня возникла проблема во время реализации программы.
Мне нужно, чтобы при нажатии на опеределенные картинки в программе проис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.: Ответ прошу сделать развернутый, желательно с примером кода.
|