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

Tipy a triky v Delphi, díl 34. - Pohyblivý text v titulkovém pruhu; Drobná úprava dialogu pro otevření souboru; Uložení a načtení RTF souboru z resources; Umístění obrázku na pracovní plochu

Jan Šindelář - 20.3.2002

Pohyblivý text v titulkovém pruhu

Začneme opět něčím vizuálním. Ukážeme si, jak velmi jednoduchým až primitivním způsobem s využitím Timeru animovat (či chcete-li rolovat) text v titulkovém pruhu okna. Jaká je možnost využití takového efektu? Buď pouze pro efekt samotný a nebo v případě příliš dlouhého textu v titulku.

Umístěte tedy na formulář Timer a nastavte vhodný časový interval. To je velmi důležité i s ohledem na délku titulku. Zbytek kódu, tedy hlavně událost OnTimer, vypadá takto:

.
.
.
private
  { Private declarations }
  Titulek : String;
.
.
.

procedure TForm1.FormCreate(Sender: TObject);
begin
Titulek := `  Sem umístěte text vašeho titulkového pruhu aplikace  `;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
var
    i : Integer;
begin
    Application.Title := Titulek;
    Form1.Caption := Titulek;
    For i := 1 to Length(Titulek) do Titulek[i] := Application.Title[i+1];
    Titulek[Length(Titulek)] := Application.Title[1];
end;

Nezapomeňte vložit před i za text titulku vhodnou mezeru, aby došlo k dostatečnému oddělení.

Drobná úprava dialogu pro otevření souboru

Chcete-li mít svoji aplikaci upravenu do posledního detailu přesně podle vašich představ včetně každého Labelu a tlačítka, možná vám vaši snahu kazí některé systémové dialogy, kde toho na první pohled moc změnit nelze (alespoň po vizuální stránce). Jistě, můžete si vytvořit své vlastní dialogy, ale možná bude snadnější přece jen upravit ty standardní. Jeden z nejčastěji používaných systémových dialogů je ten na výběr souboru a jeho drobnou úpravu si právě teď ukážeme. Úprava bude spočívat ve změně popisků u nejdůležitějších objektů v dialogu, tedy tlačítek "Otevřít" a "Storno", a dále popisky u typu souboru, názvu souboru a složky. Poslední věc, která zbývá, je titulek samotného okna dialogu, ale ten – jak jistě dobře víte – lze nastavit v Object Inspectoru.

K příkladu potřebujeme knihovnu CommDlg. Celý příklad funguje tak, že si zjistíme "identifikační čísla" jednotlivých prvků (tedy kromě tlačítek, na ně lze odkazovat "rovnou") a na jejich základě pak přepíšeme jejich popisky přímo v dialogu, k čemuž nám bude nápomocná funkce SendMessage. Čísla jednotlivých prvků najdete ve zdrojovém kódu v konstantách a samotný kód je umístěn v události OnShow příslušného OpenDialogu.

.
.
.
uses  CommDlg;
.
.
.

procedure TForm1.OpenDialog1Show(Sender: TObject);

const
  LB_FILETYPES_ID = 1089;
  LB_FILENAME_ID = 1090;
  LB_DRIVES_ID = 1091;

  Str1 = `&Otevřít`;
  Str2 = `&Storno`;
  Str3 = `&Typ souboru`;
  Str4 = `&Název`;
  Str5 = `S&ložka`;

var  hOpenDialog: HWND;

begin
  hOpenDialog := GetParent(OpenDialog1.Handle);
  SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, idOk, Longint(PChar(Str1)));
  SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, idCancel, Longint(PChar(Str2)));
  SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, LB_FILETYPES_ID, Longint(PChar(Str3)));
  SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, LB_FILENAME_ID, Longint(PChar(Str4)));
  SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, LB_DRIVES_ID, Longint(PChar(Str5)));
end;

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

Uložení a načtení RTF souboru z resources

Práci s resources jsme si už ukazovali v poslední době dvakrát a tento příklad popisuje, jak s pomocí resources přímo do souboru naší aplikace přidat dokumenty ve formátu RTF. Postup vytváření souboru resources je opět stejný, takže jej zkrátíme a nebudeme již detailně popisovat (zájemce o detailní postup odkazuji například na 32. díl seriálu) a ukážeme si hlavně způsob, jak takto "v aplikaci uložený" dokument zobrazit uživateli.

Nejprve tedy vytvořte a zkompilujte resources soubor s tímto obsahem:

TESTDOC RCDATA "test.rtf"

Soubor test.rtf pochopitelně musí být při kompilaci dostupný, takže si vytvořte nějaký takový testovací dokument, třeba ve WordPadu či Wordu. Pak jej již obvyklým způsobem přidáme do našeho projektu:

.
.
.
implementation

{$R *.DFM}
{$R textres.res}
.
.
.

A zbývá nám hlavní část: zobrazit dokument uživateli. K tomu použijeme jak jinak než komponentu RichEdit, kterou umístěte na formulář. Dokument pak do ní načteme tímto způsobem:

procedure TForm1.Button1Click(Sender: TObject);
var
  rs : TResourceStream;
begin
  rs := TResourceStream.Create(hinstance, `TESTDOC`, RT_RCDATA);
  try
    Richedit1.PlainText := False;
    Richedit1.Lines.LoadFromStream(rs);
  finally
    rs.Free;
  end;
end;

Umístění obrázku na pracovní plochu

Ne, tento tip se nebude v žádném případě týkat tapety pracovní plochy, i když k tomu možná nadpis trochu svádí. Ukážeme si něco, co bude zřejmě opět patřit spíše do kategorie legrácek na odreagování a experimentování než k vážnému použití. Naučíme se umístit na libovolné souřadnice pracovní plochy obrázek. Berte to jako menší úvod do příštího pokračování našeho seriálu, kdy se trošku zaměříme na grafiku a témata s ní související.

Ale vraťme se k našemu příkladu. Tento velmi jednoduchý postup načte obrázek (bitmapu) a poté jej zobrazí na požadovaných souřadnicích desktopu. Pochopitelně nedochází k žádnému překreslování, takže jakmile místo na ploše, kde se obrázek nachází, překryjete například oknem nějaké aplikace, obrázek jednoduše zmizí.

A teď se už můžete pustit do experimentování a hraní a vytvořit si například vhodným střídáním obrázků zajímavou animaci či jiný efekt.

procedure TForm1.Button1Click(Sender: TObject);
var
  Picture: TPicture;
  Desktop: TCanvas;
  X, Y: Integer;
begin
  Picture := TPicture.Create;
  Desktop := TCanvas.Create;
  Picture.LoadFromFile(`c:\obrazek.bmp`);
  Desktop.Handle := GetWindowDC(0);
  X := 100;
  Y := 100;
  Desktop.Draw(X, Y, Picture.Graphic);
  ReleaseDC(0, Desktop.Handle);
  Picture.Free;
  Desktop.Free;
end;