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

Tipy a triky v Delphi, díl 135. - tipy pro komponentu ListBox

Jan Šindelář - 21.4.2004

Začneme od zmiňované offline verze seriálu. Neustále si o ni píšete, takže opět po čase připomínám, že díly 1 až 100 naleznete ke stažení v podobě nápovědy Windows na konci stého dílu. Dnes mám pro vás ale dobrou zprávu. Ozval se mi jeden ze čtenářů, pan Pavel Polívka, který vytvořil jednoduchou aplikaci, která slouží právě pro offline prohlížení seriálu a to v podobě jednotlivých HTML souborů. Největší výhoda je aktualizace přes internet, takže si můžete pravidelně či jednou za čas doplnit do programu chybějící díly pouhým kliknutím. Odkaz na stažení a další informace najdete zde a chci tímto ještě jednou poděkovat autorovi za tuto užitečnou pomůcku, kterou jistě řada čtenářů s radostí přivítá.

Teď už ale pojďme k dnešnímu tématu, kterým je ListBox. Nejprve si ukážeme, jak prvky ListBoxu metodou drag and drop uchopit a přemístit do připraveného Editu. Na formulář si umístíme ListBox a Edit. Dále musíme nastavit v Object Inspectoru u vlastnosti DragMode komponenty ListBox hodnotu dmAutomatic. O zbytek se pak postará samotný Edit, přičemž v jeho událostech nejprve nastavíme, aby přijímal objekty drag and drop (událost OnDragOver) a dále zajistíme zpracování přesouvaného textového řetězce z ListBoxu v události OnDragDrop.

Náš dnešní zdrojový kód si ještě doplníme o další maličkost. Je-li délka řádku (chcete-li šířka sloupce) v ListBoxu malá a nevejde se do něj celý text, pokud obsahuje příliš mnoho znaků, můžeme to elegantně vyřešit kontextovou nápovědou. Velice jednoduchým postupem zajistíme zobrazení celého textu jako kontextové nápovědy (hintu) po najetí myší na příslušný řádek. Nejprve musíme nastavit ve vlastnostech ListBoxu položku ShowHint na hodnotu True. Zbytek pak vyřešíme v události OnMouseMove, kdy nejprve zjistíme, na který řádek právě kurzor myši ukazuje a pak jen nastavíme jeho hodnotu jako text nápovědy.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Edit1: TEdit;
    procedure Edit1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
    procedure Edit1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept := True;
end;

procedure TForm1.Edit1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  (Sender as TEdit).Text := (Source as TListBox).Items[(Source as TListBox).ItemIndex]
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
var lstIndex: Integer;
begin
  with ListBox1 do
    begin
      lstIndex := SendMessage(Handle, LB_ITEMFROMPOINT, 0, MakeLParam(x, y));
      if (lstIndex >= 0) and (lstIndex <= Items.Count) then Hint := Items[lstIndex]
      else Hint := ``;
    end;
end;

end.

To je pro dnešek vše a ještě jednou připomínám novou offline verzi seriálu, která určitě stojí za vyzkoušení.