Živě.cz o počítačích a internetu

Tipy a triky v Delphi - díl 176.

Jan Šindelář 16.3.2005

Dnes tu máme dva krátké tipy, které už se jinam nevešly. První nám umožní lépe nastavit vzhled dialogu pro otevření souboru, druhý tip se zase týká přehrávání více zvuků současně.

Začneme jednoduchým tipem, který souvisí s dialogem pro otevření souboru. Každá nová verze Windows nabízí vylepšené možnosti tohoto dialogu, ale vsadím se, že většina uživatelů o nich nemá ani tušení. Málokdo z běžných uživatelů tedy tuší o existenci tlačítka pro změnu stylu zobrazení souborů (resp. jeho existenci ignorují) právě v dialogu pro otevření souboru.

Kromě klasického seznamu tak máme k dispozici i zobrazení v podobě ikon, detailního seznamu či dokonce náhledů (Windows XP). A to už se dostáváme k Delphi. Co kdybychom chtěli zařídit, aby se dialog pro otevření souboru zobrazil právě v některé z těchto nestandardních podob? Přímo nastavením vlastností komponenty OpenDialog toho nedosáhneme, takže si musíme poradit jinak a jako tradičně to bude pomocí zpráv systému. Příslušnému dialogu pošleme zprávu, která ho přepne do požadovaného zobrazení.

K dispozici máme několik variant, které jsou nadefinovány jako konstanty. Jediná drobná vada na kráse je to, že k přepnutí do požadovaného stylu zobrazení dojde až po zobrazení samotného dialogu, takže na okamžik může "probliknout" standardní zobrazení v podobě seznamu.

Druhým tipem zabrousíme do oblasti multimédií a ukážeme si jeden ze způsobů, jak přehrát současně více zvuků. Použijeme knihovnu MMSystem a přehrát můžeme zvuky nejen ve formátu WAV, ale třeba i MP3 a podobně. Celou záležitost vyřešíme tím, že budeme posílat pomocí funkce MCISendString příslušné příkazy. Nejprve zařízení otevřeme, poté pošleme seznam souborů k přehrání a nakonec opět uzavřeme.

Oba dnešní příklady jsou v následujícím společném zdrojovém kódu. Na formulář umístíme pouze dvě tlačítka a OpenDialog. Nezapomeňte rovněž na zmiňovanou knihovnu MMSystem.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MMSystem;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure OpenDialog1Show(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    procedure WMUser(var msg: TMessage); message WM_USER + 1;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  LARGEICON = 28713;
  SMALLICON = 28714;
  LIST = 28715;
  REPORT = 28716;
  THUMBNAIL = 28717;
  TILE = 28718;

procedure TForm1.WMUser(var msg: TMessage);
var
  Dlg: HWND;
  Ctrl: HWND;
begin
  Dlg := msg.WParam;
  Ctrl := FindWindowEx(Dlg, 0, PChar(`SHELLDLL_DefView`), nil);
  if Ctrl <> 0 then SendMessage(Ctrl, WM_COMMAND, THUMBNAIL, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDialog1.Execute;
end;

procedure TForm1.OpenDialog1Show(Sender: TObject);
var
  Dlg: HWND;
begin
  Dlg := GetParent((Sender as TOpenDialog).Handle);
  PostMessage(Handle, WM_USER+1, Dlg, 0);
end;

procedure SendMCICommand(const Cmd: string);
var
  Error: Integer;
  ErrMsg: array[0..254] of char;
begin
  Error := mciSendString(PChar(Cmd), nil, 0, 0);
  if Error <> 0 then
  begin
    MCIGetErrorString(Error, ErrMsg, 255);
    MessageDlg(StrPas(ErrMsg), mtError, [mbOK], 0);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SendMCICommand(`open waveaudio shareable`);
  SendMCICommand(`play "zvuk1.wav"`);
  SendMCICommand(`play "zvuk2.wav"`);
  SendMCICommand(`play "zvuk3.wav"`);
  SendMCICommand(`close waveaudio`);
end;

end.

Ještě drobná připomínka na závěr. Příslušné zvukové soubory, které chceme přehrávat, mohou být i ve formátu MP3, jak již bylo řečeno. Zdrojový kód se tím nijak nemění, pouze jako parametry uvedeme tyto soubory. A pochopitelně můžeme přehrávat současně různé typy souborů.