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

Tipy a triky v Delphi, díl 22. - Ukazatel průběhu uvnitř tlačítka; Jak nastartovaly Windows?; Jméno přihlášeného uživatele; Vytvoření virtuálního disku; Minimalizace aplikace i s modálními formuláři; Zamezení obnovení velikosti okna poklepáním na titulkový pruh

Jan Šindelář - 19.12.2001

Ukazatel průběhu uvnitř tlačítka

Nejprve si tedy ukážeme jednu zajímavou kombinaci dvou komponent. Umístíme ukazatel průběhu – ProgressBar – přímo do tlačítka. Výsledný efekt je poměrně zajímavý a můžete tak ušetřit někdy drahocené místo na formuláři, který je již přeplněn dalšími vizuálními komponentami.

Po stisknutí tlačítka se uvnitř něj objeví běžný ProgressBar, který indikuje daný průběh a po jeho ukončení zmizí a objeví se opět původní vnitřek tlačítka – jeho nadpis. V naší ukázce je pro demonstraci funkčnosti použit cyklus s funkcí Sleep, kterou v ostré aplikaci samozřejmě nahradíte činností, kterou má vaše aplikace vykonávat.

Jak vidíte v kódu, ProgressBar je umístěn uvnitř tlačítka tak, aby kolem něj vznikl decentní okraj. Jeho velikost si samozřejmě můžete upravit dle vlastních potřeb. Nezapomeňte také ze všeho nejdříve nastavit v Object Inspectoru u použitého ProgressBaru vlasnost Visible na False. Jinak fantazii se meze nekladou, takto můžete použít i jiný něž jen standardní ProgressBar (pokud máte třeba nějaký hezčí jako komponentu), protože toto řešení je poměrně univerzální. A když se to vezme do důsledku, můžete takto (s jistými specifickými omezeními) vlastně kombinovat řadu komponent, které spolu na první pohled nemají moc souvislostí. Chce to jen nápad.

procedure TForm1.FormCreate(Sender: TObject);
begin
ProgressBar1.Parent := Button1;
ProgressBar1.Width := Button1.Width-7;
ProgressBar1.Height := Button1.Height-7;
ProgressBar1.Left := 3;
ProgressBar1.Top := 3;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : byte;
begin
Button1.Enabled := false;
if ProgressBar1.Visible then Exit;
ProgressBar1.Position := 0;
ProgressBar1.Visible := True;
for i := 0 to 99 do
begin
  Sleep(100);
  ProgressBar1.Position := ProgressBar1.Position + 1;
  Application.ProcessMessages;
end;
ProgressBar1.Visible := False;
Button1.Enabled := true;
end;

Jak nastartovaly Windows?

Ne vždycky se podaří systému nastartovat v pořádku a někdy je nutno použít nouzový režim. Pokud je však vaše aplikace „citlivá“ na podobný stav, kdy je systém nastartován jen s omezenými prostředky a nezbytným minimem ovladačů, může se nám hodit podobný stav detekovat a aplikaci případně zakázat start.

procedure TForm1.Button33Click(Sender: TObject);
begin
case (GetSystemMetrics(SM_CLEANBOOT)) of
0 : ShowMessage(`Window nastartovaly běžným způsobem`);
1 : ShowMessage(`Nouzový režim`);
2 : ShowMessage(`Nouzový režim s prací v síti`);
else
ShowMessage(`Nelze zjistit`);
end;
end;

Jméno přihlášeného uživatele

Následující jednoduchá funkce nám zjistí jméno právě přihlášeného uživatele. To můžete využít pro řadu účelů jako třeba ukládání různých konfigurací pro jednotlivé uživatele a podobně.

function UserName: String;
var
  User : PChar;
  i    : DWord;
begin
  i := 1024;
  user := StrAlloc(Succ(i));
  if GetUserName(User, i) then Result := StrPas(User)
                          else Result := `Žádný`;
end;

procedure TForm1.Button34Click(Sender: TObject);
begin
ShowMessage(UserName);
end;

Vytvoření virtuálního disku

Máte-li rozsáhlý disk, můžete se v jeho obsahu snadno ztratit i v tom případě, že jej máte rozdělen na několik oblastí. Pokud potřebujete kupříkladu často přistupovat do jednoho (třeba i více zanořeného) adresáře, může se hodit vytvoření virtuálního disku. Jak se to dá udělat programově nám ukazuje náš příklad:

procedure TForm1.Button35Click(Sender: TObject);
begin
if DefineDosDevice(DDD_RAW_TARGET_PATH, `X:`, PChar(`c:\`)) then ShowMessage(`Virtuální disk "X" byl vytvořen.`)
else ShowMessage(`Při vytváření virtuálního disku došlo k chybě.`);
end;

Minimalizace aplikace i s modálními formuláři

Jistě dobře víte, co to modální režim znamená. Někdy jsou tato okna až otravná, když nejdou minimalizovat. My si teď ukážeme, jak se dá minimalizovat aplikace (minimalizací jejího hlavního formuláře) i v tom případě, že některé modální formuláře (dialogy) obsahuje. Jak jinak v podobných případech, i zde využijeme systém zpráv Windows.

.
.
.
private
procedure WMSyscommand(var Msg: TWmSysCommand); message WM_SYSCOMMAND;

.
.
.
procedure TForm1.WMSysCommand(var Msg: TWmSysCommand);
begin
case (Msg.CmdType and $FFF0) of
  SC_MINIMIZE:
  begin
    Msg.Result := 0;
    EnableWindow(Application.Handle, True);
    Aplication.Minimize;
  end;
  else inherited;
end;
end;

Zamezení obnovení velikosti okna poklepáním na titulkový pruh

Tento tip malinko souvisí s tím předchozím. Opět se týká změny ovladatelnosti okna, opět využijeme zprávy systému. A použití? Těžko říci, to ponechám na vás.

.
.
.
private
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
.
.
.
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
with Message do
  if CmdType and $FFF0 = SC_RESTORE then Result := 0
  else inherited;
end;