Saturday, December 30, 2006

function AppIsResponding(ClassName : string) : boolean;
const
TIMEOUT = 50;

var
Res: DWORD;
h: HWND;
begin
h := FindWindow(PChar(ClassName), nil);
if h <> 0 then
result := SendMessageTimeout(H, WM_NULL, 0, 0, SMTO_NORMAL or SMTO_ABORTIFHUNG, TIMEOUT, Res) <> 0
else
ShowMessage(Format('%s nenalezeno!',[ClassName]));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if AppIsResponding('Notepad') then ShowMessage('Aplikace odpovídá.');
end;
V příkladu je vidět použití pro Poznámkový blok. V těle samotné funkce je konstanta, které určuje časový interval čekání na odezvu v milisekundách.

Wednesday, December 27, 2006

Test, zda aplikace odpovídá či ne

Upřímně řečeno, tento tip se asi moc v praxi neuplatní, ale proč si to nevyzkoušet. Jistě víte, že pokud se nějaká aplikace jak se říká "kousne" neboli přestane systému z nějakého důvodu odpovídat (což sice nemusí vždycky znamenat její pád, ale obvykle tomu tak je), zobrazí se po čase dialog k uzavření aplikace (nebo se počká, zda začne znovu odpovídat). Nebudeme se teď raději zabývat tím, jak moc spolehlivě tento proces funguje či spíše nefunguje (hovoříme-li o Windows 9x), a zkusíme si sami zjistit, zda daná aplikace odpovídá.

Sunday, December 24, 2006

Nutno ovšem poznamenat, že funkce vám vrátí hodnotu i v tom případě, že právě není žádný spořič v ovládacích panelech obrazovky vybrán. Když se do ovládacích panelů podíváte a nastavíte spořič obrazovky na "není", sice logicky nebudete moci měnit dobu jeho aktivace (tato volba je „disablovaná“), ale přesto tam je původní hodnota (neboli hodnota, která bude platná ihned po zvolení nějakého spořiče) vidět.

Wednesday, December 20, 2006

spořič

Dneska se podíváme nejprve na spořič obrazovky, poté si zkusíme otestovat, zda aplikace odpovídá nebo došlo k jejímu pádu, a také se začneme zabývat tiskárnami a vůbec věcmi souvisejícími s tiskem.
Zjištění doby, za kterou se aktivuje spořič obrazovky
Potřebujete-li z nějakého důvodu zjistit, za jaký časový interval se aktivuje spořič obrazovky, můžete využít následující funkci, která vám tuto dobu vrátí v sekundách.
function GetScreenSaverTimeout: Integer;
begin
SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, @result, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(GetScreenSaverTimeout) + ' sekund');
end;

Monday, December 18, 2006

Sice nebude tak hezký jako ten výše zmíněný, ale bude vypadat velmi profesionálně (jako například "~51a4.tmp" ). :)
function GetTempFile(const Extension: string): string;
var
Buffer: array[0..MAX_PATH] OF Char;
aFile : string;
begin
repeat
GetTempPath(Sizeof(Buffer)-1,Buffer);
GetTempFileName(Buffer,'~',0,Buffer);
result := ChangeFileExt(Buffer,Extension);
until not FileExists(result);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GetTempFile('.~tp'));
end;
A rada na úplný závěr dnešního dílu? Sice už se asi možná opakuji, ale nezapomínejte své dočasné soubory po sobě mazat.

Sunday, December 17, 2006

Vytvoření unikátního názvu souboru pro složku TEMP

Často se ve svých aplikacích dostanete do situace, kdy je třeba si některá data dočasně odložit někam na disk, později se k nim vrátit, použít je a smazat. K podobným účelům jak jistě dobře víte slouží systémová složka TEMP. Zde však nastává "problém" s volbou vhodného názvu pro takový dočasný soubor. Jistě, nic nám nebrání si jej nazvat podle libosti třeba "můjdočasnýsoubor.tmp", ale není to příliš profesionální. Můžeme velice snadno využít následující funkci, která nám vytvoří unikátní název, takže nebude kolidovat s ostatními aplikacemi.

Wednesday, December 13, 2006

Zjištění aplikace přidružené k danému typu souboru

Pokud potřebujete zjistit jaká aplikace je přidružena k danému typu souboru (dokumentu), můžete to velmi snadno provést pomocí funkce FindExecutable. Ta je součástí knihovny ShellAPI a následující zdrojový kód ukazuje její použití:
procedure TForm1.Button1Click(Sender: TObject);
var app : PChar;
begin
GetMem(app, 255);
FindExecutable('test.txt','c:\', app);
Application.MessageBox(App, 'Informace o souboru', mb_ok + mb_iconinformation);
end;

Tuesday, December 12, 2006

procedure WipeFile(filename : String);
var
buffer : array [0..4095] of byte;
max, n : LongInt;
i : Integer;
fs : TFileStream;

procedure RandomizeBuffer;
var
i: Integer;
begin
for i:= Low(buffer) to High(buffer) do buffer[i] := Random(256);
end;

begin
fs := TFilestream.Create(filename, fmOpenReadWrite or fmShareExclusive);
try
for i := 1 to 3 do
begin
RandomizeBuffer;
max := fs.Size;
fs.Position := 0;
while max > 0 do
begin
if max > Sizeof(buffer) then n := sizeof(buffer)
else n := max;
fs.Write( Buffer, n );
max := max - n;
end;
FlushFileBuffers(fs.handle);
end;
finally
fs.free;
end;
Deletefile(filename);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WipeFile('c:\soubor.exe');
end;

Monday, December 11, 2006

Bezpečné smazání souboru

Pokud smažete soubor běžným způsobem, jistě dobře víte, že jej lze obnovit. Nemám teď na mysli pouze ten případ, kdy používáte Koš, ale soubor lze různými prostředky obnovit i když jej smažete rovnou. Ne že by to snad nějak vadilo (někdy spíše naopak), protože to může být někdy poslední záchrana jak zpět získat ztracená data. Ovšem v tom případě, že jsou data určitým způsobem citlivá a nechcete, aby se k nim dostal někdo cizí právě jejich obnovením po smazání, je třeba použít trošku jiný způsob mazání. Funkce, kterou si teď ukážeme, provede smazání poněkud bezpečnějším způsobem, protože nejprve soubor přepíše náhodnými daty a teprve poté jej smaže běžným způsobem. Když se jej někdo poté pokusí obnovit, podaří se mu to sice, ale dostane jen náhodná data.

Sunday, December 10, 2006

procedure TForm1.Button1Click(Sender: TObject);
var pozice : integer;
begin
pozice := ScanFile('c:\soubor.txt', Form1.Edit3.Text, true);
if pozice<>-1 then ShowMessage('Pozice: '+IntToStr(pozice))
else ShowMessage('Nenalezeno');
end;

Wednesday, December 06, 2006

if pPos <> Nil then
begin
result := FileSize - bytesRemaining + LongInt( pPos ) - LongInt( pBuf );
break;
end;
pScan := StrEnd( pScan );
Inc( pScan );
end;
if pPos <> Nil then break;
bytesRemaining := bytesRemaining - bytesToRead;
if bytesRemaining > 0 then
begin
seek( F, FilePos(F)-Length( forString ));
bytesRemaining := bytesRemaining + Length( forString );
end;
end;
finally
CloseFile( F );
If SearchFor <> Nil then StrDispose( SearchFor );
If pBuf <> Nil then FreeMem( pBuf, BufferSize );
end;
end;

Monday, December 04, 2006

try
SearchFor := StrAlloc( Length( forString )+1 );
StrPCopy( SearchFor, forString );
if not caseSensitive then AnsiUpper(SearchFor);
GetMem( pBuf, BufferSize );
filesize := System.Filesize( F );
bytesRemaining := filesize;
pPos := Nil;
while bytesRemaining > 0 do
begin
if bytesRemaining >= BufferSize then bytesToRead := Pred(BufferSize)
else bytesToRead := bytesRemaining;
BlockRead( F, pBuf^, bytesToRead, bytesToRead );
pEnd := @pBuf[ bytesToRead ];
pEnd^:= #0;
pScan := pBuf;
while pScan < pEnd do
begin
if not caseSensitive then AnsiUpper(pScan);
pPos := StrPos( pScan, SearchFor );

Sunday, December 03, 2006

na pokracovani

function ScanFile( Const filename : String; Const forString : String; caseSensitive : Boolean ): LongInt;
Const
BufferSize= $8001;

Var
pBuf, pEnd, pScan, pPos : Pchar;
filesize : LongInt;
bytesRemaining : LongInt;
bytesToRead : Integer;
F : File;
SearchFor : Pchar;
oldMode : Word;
Begin
Result := -1;
If (Length(forString) = 0) or (Length(filename) = 0) Then Exit;
SearchFor := Nil;
pBuf := Nil;
AssignFile( F, filename );
oldMode := FileMode;
FileMode := 0;
Reset( F, 1 );
FileMode := oldMode;

Saturday, December 02, 2006

Vyhledání řetězce v souboru

xUž jsme si v našem seriálu ukazovali, jak se dá celkem snadno vyhledat soubor na disku. Nyní si ukážeme další užitečnou věc a tou je vyhledání požadovaného řetězce v daném souboru. Funkce nám vrátí pozici řetězce v souboru nebo -1 v případě, že řetězec nebyl v souboru nalezen. Parametrem funkce je prohledávaný soubor, dále hledaný řetězec a logická proměnná, určující zda má být hledání citlivé na rozlišování velkých či malých písmen.