Saturday, July 29, 2006

Test na možnost otevření souboru

Pokud hodláte pracovat s nějakým souborem, ne vždy je to možné, a to z několika důvodů. Daný soubor právě používá systém, jiná aplikace a podobně a k souboru zkrátka nemáme přístup, protože je momentálně používán někým jiným. Ukážeme si jednoduchou funkci, která nám zjistí, jestli je se souborem možno pracovat, nebo je právě používán:
function JePouzivan(soubor : string ) : boolean;
var HFileRes : HFILE;
begin
Result := false;
if not FileExists(soubor) then exit;
HFileRes := CreateFile(pchar(soubor), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then CloseHandle(HFileRes);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if JePouzivan('c:\VasSoubor.exe') then ShowMessage('Soubor je používán')
else ShowMessage('Soubor máte k dispozici');
end;

Tuesday, July 25, 2006

Předpokládejme,

že máte například někde na hlavním formuláři aktuální adresář uložen v běžně používané komponentě Label. Lépe řečeno, řetězec s celou cestou aktuálního adresáře potřebujete vměstnat do Labelu. Nejprve nastavte jeho vlastnost Autosize na False a poté ručně zvolte vhodnou maximální délku. Nyní již zbývá jen upravit samotný řetězec, který poté necháme Label zobrazit. Ten upravíme tímto jedním řádkem:
Label1.Caption:=MinimizeName(Cesta, Label1.Canvas,Label1.Width);
Proměnná Cesta je typu String a obsahuje původní celou a nezkrácenou cestu. Ve výsledném Labelu se již zobrazí výsledný zkrácený řetězec.

Thursday, July 20, 2006

Zobrazení zkrácené cesty

A na závěr tu máme jeden, troufám si tvrdit, velice užitečný tip opravdu pro každého. Často se stává, že celková cesta i samotný název souboru jsou dohromady natolik dlouhé, že se nevejdou celé do titulků oken a různých dalších zobrazovacích prvků aplikace. V tom případě se takto dlouhý název ořízne a konec není vidět. To je v tom horším případě. Mnohem lepší řešení, které by jste měli používat, je tzv. zkrácený název. Sami jistě dobře víte oč se jedná, celý dlouhý řetězec se upraví tak, že je vidět jen ta nejdůležitější část a ten méně podstatný zbytek je nahrazen trojicí teček. Nyní si ukážeme jak na to. Není třeba vymýšlet žádné vlastní složité postupy, pomůže nám knihovna FileCtrl.

Monday, July 17, 2006

Nejdůležitějším parametrem

celé ukázky je CSIDL_HISTORY, což je zrovna v tomto konkrétním příkladě nadefinovaná konstanta pro adresář History. Příklad by tedy nebyl úplný bez kompletního seznamu konstant pro ostatní složky, takže zde jej máme:
CSIDL_DESKTOP
CSIDL_INTERNET
CSIDL_PROGRAMS
CSIDL_CONTROLS
CSIDL_PRINTERS
CSIDL_PERSONAL
CSIDL_FAVORITES
CSIDL_STARTUP
CSIDL_RECENT
CSIDL_SENDTO
CSIDL_BITBUCKET
CSIDL_STARTMENU
CSIDL_DESKTOPDIRECTORY
CSIDL_DRIVES
CSIDL_NETWORK
CSIDL_NETHOOD
CSIDL_FONTS
CSIDL_TEMPLATES
CSIDL_COMMON_STARTMENU
CSIDL_COMMON_PROGRAMS
CSIDL_COMMON_STARTUP
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_APPDATA
CSIDL_PRINTHOOD
CSIDL_ALTSTARTUP
CSIDL_COMMON_ALTSTARTUP
CSIDL_COMMON_FAVORITES
CSIDL_INTERNET_CACHE
CSIDL_COOKIES
CSIDL_HISTORY
Překládat jednotlivé položky asi nemá smysl, protože buď je jejich název jasný a nebo se vyskytuje v této podobě i v české verzi Windows.

Thursday, July 13, 2006

.
.
.
uses Shlobj;
.
.
.

procedure TForm1.Button1Click(Sender: TObject);
var
pidl: PItemIDList;
cesta: array[0..MAX_PATH] of char;
begin
SHGetSpecialFolderLocation(Handle, CSIDL_HISTORY, pidl);
SHGetPathFromIDList(pidl,cesta);
ShowMessage(cesta);
end;

Monday, July 10, 2006

Zjištění cest k důležitým systémovým složkám

Často se naskytne potřeba přistupovat k různým systémovým složkám. S prostým předpokladem, že se na každém počítači nachází adresář Windows v kořenovém adresáři disku C a z toho odvozovat vše ostatní je samozřejmě naprostý nesmysl a daleko bychom se nedostali, protože Vám samozřejmě při instalaci nic nebrání v tom, umístit složku Windows, kam si jen vzpomenete. Proto tu máme jednu šikovnou funkci, která nám tyto důležité systémové cesty zjistí (pokud existují). Budeme potřebovat knihovnu Shlobj a jako obvykle si uvedeme příklad v podobě události stisknutí tlačítka.

Saturday, July 08, 2006

Parametry procedury

obsahují jednak strom - TreeView -, který se má použít, dále adresář, případně konkrétní větev a logickou proměnnou, udávající zda se mají či nemají zobrazit též soubory.
Proceduru můžeme například použít v následující ukázce, která zobrazí strom disku C: včetně souborů. Předpokladem je, že Váš projekt obsahuje již připravenou komponentu TreeView (zde konkrétně TreeView1).
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
GetDirectories(TreeView1, 'C:\', nil, True);
end;

Monday, July 03, 2006

Adresářový strom

Zobrazování souborů v adresářovém stromu zná dobře asi každý uživatel Windows. Ukážeme si teď, jak na to. Náš příklad je zjednodušen tím, že budeme zobrazovat pouze názvy souborů a adresářů bez jejich odpovídajících ikonek. To však není problém případně dodělat, pokud budete chtít. Něčemu podobnému jsme se zde již věnovali, takže inspiraci máte.
Nyní tedy již vlastní zdrojový kód:
procedure GetDirectories(Tree: TTreeView; Directory: string; Item: TTreeNode; IncludeFiles: boolean);
var
SearchRec: TSearchRec;
ItemTemp: TTreeNode;
begin
Tree.Items.BeginUpdate;
if Directory[length(Directory)] <> '\' then Directory := Directory + '\';
if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then
begin
repeat
if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then
begin
if (SearchRec.Attr and faDirectory > 0) then
Item := Tree.Items.AddChild(Item, SearchRec.Name);
ItemTemp := Item.Parent;
GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles);
Item := ItemTemp;
end
else if IncludeFiles then
if SearchRec.Name[1] <> '.' then
Tree.Items.AddChild(Item, SearchRec.Name);
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
Tree.Items.EndUpdate;
end;