Friday, April 28, 2006

Na závěr snad jen drobnost týkající se adresáře TEMP. Neodpustím si připomínku, že byste neměli zapomenout na odstranění všeho, co sem uložíte. Není nic horšího než to, když některé (i profesionální) aplikace odloží do tohoto adresáře někdy i desítky MB, které poté nesmažou.

Wednesday, April 26, 2006

Výhodou

tohoto řešení je také to, že do onoho informačního souboru můžete umístit prakticky libovolné informace ve formátu, který vám nejlépe vyhovuje (můžete např. použít binární soubor místo textového). Může obsahovat různé informace o novinkách a další doplňující data, která můžete uživateli zobrazovat. Proto zde také neuvádím žádný zdrojový kód, neboť variant je celá řada. Důležitá je pouze celkem jednoduchá myšlenka, která je snad každému jasná. Samozřejmě by bylo elegantnější nestahovat celý soubor, ale stáhnout si jen příslušný text (který se na disk neuloží, pouze do paměti) z daného souboru, nicméně takto popsaný způsob je natolik jednoduchý, že jej zvládne každý, protože se prakticky jedná jen o čtení dat ze souboru.

Tuesday, April 25, 2006

A druhá část?

Teď už je to velmi jednoduché. Předpokládejme, že váš program, který mají uživatelé u sebe nainstalován, "ví" o svojí verzi. Buď tuto informaci uložíte přímo do nějaké konstanty programu, nebo si to aplikace zjistí sama (stejně jako to dělá systém, pokud kliknete na spustitelný soubor pravým tlačítkem a necháte si zobrazit jeho vlastnosti, konkrétně záložku "Verze"). Pokud budete chtít zjistit, zda se na serveru nachází novější verze než ta nainstalovaná, stačí pouze stáhnout (např. do adresáře "TEMP") onen informační soubor způsobem popsaným v minulém díle, přečíst z něj číslo nejnovější verze a porovnat ji s verzí programu na disku. Pokud zjistíte, že je verze již zastaralá, můžete uživateli nabídnout stažení novější verze.

Sunday, April 23, 2006

Nejprve vytvoříme malý textový soubor (může být i binární, viz dále), který bude obsahovat informaci o aktuální verzi. Jako zcela nejjednodušší řešení je textový soubor, který bude obsahovat pouze číslo aktuální (nejnovější) verze. Způsob číslování závisí čistě na vás. Buď můžete použít vlastní jednoduché číslování (např. 0,1,2...n), nebo "klasický" způsob číslování verzí (např. 4.54 apod.). Takto vytvořený soubor umístíte na server k vaší stránce s aplikací a při vytvoření každé nové verze svého programu nesmíte zapomenout aktualizovat také tento informační soubor s verzí.

Saturday, April 22, 2006

Způsobů řešení

je jistě celá řada, ale pokusím se vám nastínit jeden z těch jednodušších, který navíc vychází z minulého příkladu, takže už to nebude taková novinka. Pokud jste minulý díl nečetli, neváhejte a podívejte se na příklad, který popisuje způsob jak stáhnout soubor z Internetu, protože ten právě dnes využijeme. Vlastně ani není potřeba vám předkládat nějaký zdrojový kód, protože vám popíši pouze určitý návrh, jehož implementace závisí na každém z vás. Postup bych rozdělil na dvě části – na tu část, která se týká serveru s vaší aplikací (novou verzí), a na samotnou aplikaci jako takovou (nainstalovanou na disku).

Thursday, April 20, 2006

Tématem dnešního dílu

bude aktualizace aplikací prostřednictvím Internetu, naučíme se zjišťovat, která ikona je přiřazena danému souboru a jaký je jeho typ, a na závěr si ukážeme, jak číst a zapisovat textová data do schránky Windows.
Aktualizace aplikace přes Internet
Minule jsme si ukázali, jak stáhnout z Internetu soubor na svůj disk. Také jsme si slíbili, že se naučíme, jak zjistit, zda je na webu již aktuálnější verze programu než ta, kterou máme (nebo spíše uživatelé našich aplikací) nainstalovánu. Proto se teď budeme věnovat tomuto bezesporu užitečnému tématu.

Wednesday, April 19, 2006

procedure Delay(ms : integer);
var
kdy : integer;
begin
kdy := GetTickCount + ms;
while GetTickCount < kdy do Application.ProcessMessages;
end;
Takto dosáhneme nejen požadované pauzy, ale zároveň nedojde k "zamrznutí" systému na daný interval (pomocí Application.ProcessMessages).

Tuesday, April 18, 2006

Jak vidíte,

jedná se opět o událost stisku tlačítka. Dojde k pokusu o načtení dat a pokud vše proběhne v pořádku, zobrazí se dialog s hledanými daty.
Takto získané informace můžete například klasicky použít v okně "O aplikaci..." Vašeho programu.
Delay ve Windows ? Není problém
Na závěr si ukážeme jeden tip, který možná profesionální programátory rozesměje (nebo rozzlobí a budou hned psát reakce, co že je to zase za hrůzu). Oč se jedná? Pokud přecházíte poprvé z programování pro DOS na Windows a byli jste zvyklí v Turbo (Borland) Pascalu často používat příkaz Delay na pozastavení běhu programu, možná vás překvapilo že pod Windows není. Správně byste se měli podobným příkazům pod Windows vyhnout, protože je celá koncepce programu postavena na odlišných základech. Přesto se však může někdy hodit (třeba při převodu starších programů z DOSu pod Windows, dokud jej celý nepředěláte a podobně). Jedna z možností je prostě nahradit příkaz Delay příkazem Sleep, jehož parametrem je taktéž doba pauzy v ms. Téhož se dá dosáhnout i jednoduchou procedurou, kterou si napíšeme.

Monday, April 17, 2006

Nemusím snad připomínat

(a určitě jste toto varování slyšeli mnohokrát), že musíte dávat pozor, co děláte a neměnit položky, o kterých nevíte co znamenají, protože byste mohli napáchat celkem dost škod včetně totálního zlikvidování systému. :)
Pomocí výše zmíněného programu však můžete registry pohodlně a bezpečně procházet a hledat zajímavé větve, které pak můžete použít pro náš příklad. Ten je udělán tak, že informace pouze čte a nic nezapisuje, takže žádné nebezpečí nehrozí. Nyní již však k naší ukázce:
procedure TForm1.Button1Click(Sender: TObject);
var key:string;
Reg: TRegIniFile;
uzivatel,spolecnost,system,verze:string;
begin
key:='\Software\Microsoft\Windows\CurrentVersion';
Reg:=TRegIniFile.Create;
try
Reg.RootKey:=HKey_Local_Machine;
if Reg.OpenKey(key,False) then
begin
uzivatel:='Uživatel: '+Reg.ReadString(key,'RegisteredOwner', '');
spolecnost:='Společnost: '+Reg.ReadString(key,'RegisteredOrganization', '');
system:='Systém: '+Reg.ReadString(key,'ProductName', '');
verze:='Verze: '+Reg.ReadString(key,'VersionNumber', '');
ShowMessage(uzivatel+#13+spolecnost+#13+system+#13+verze);
end;
finally
Reg.Free;
end;
end;

Sunday, April 16, 2006

registry

Když jsme se už dnes trochu zabývali registry, nebudeme je ještě hned opouštět a ukážeme si, jak získat některé informace o systému. V registrech Windows je těchto informací obrovská spousta a zjistit se dá téměř cokoliv. Pro příklad si ukážeme, jak zjistit jméno registrovaného uživatele (to jméno, které se zadává při instalaci systému, neplést s uživatelským jménem), název společnosti, jméno a verzi systému. Příklad je dostatečně názorný a pokud budete chtít, není problém dané položky nahradit jinými (které Vás třeba zajímají více). Stačí jen najít v registrech danou větev a položku. K tomu můžete použít například program Editor registru dodávaný s Windows. Pokud náhodou nevíte, kde jej najít a jak ho spustit (protože není uveden ve Start menu ani nikde jinde), najdete ho v adresáři Windows pod názvem Regedit.exe

Friday, April 14, 2006

function Online : boolean;
var
reg : TRegistry;
buff : dword;
begin
reg:= tregistry.Create ;
Reg.RootKey:=HKey_local_machine;
if reg.OpenKey('\System\CurrentControlSet\Services\RemoteAccess',false) then
begin
reg.ReadBinaryData('Remote Connection',buff,sizeof(buff));
result := buff = 1;
reg.CloseKey ;
reg.Free ;
end;
end;

Thursday, April 13, 2006

První způsob:

K němu je potřeba knihovna WinInet, takže opět nezapomeňte přidat do Uses. Samotná funkce vrací True, pokud jsme připojeni, False pokud nejsme.
function Online : boolean;
begin
result := (InternetGetConnectedState(nil, 0))
end;
Druhý způsob:
V tomto případě zase využijeme služeb knihoven StdCtrls a Registry. Stejně jako v předchozím příkladu nám funkce vrátí True nebo False podle stavu připojení.

Wednesday, April 12, 2006

Po stisknutí tlačítka

dojde k pokusu o stažení souboru. Pokud bude spojení úspěšně navázáno a započne samotné stahování, bude program čekat na dokončení akce. Po stažení se zobrazí příslušný dialog nebo informace o chybě.
Jak otestovat, zda jsme online ?
Způsobů je poměrně dost, jejich funkčnost a univerzálnost je různá. Ukážeme si teď dva způsoby. Jeden je opravdu superkrátký na jeden řádek, druhý pracuje s registry. Oba jsou otestovány pod systémem Windows 98 pro běžné modemové spojení.

Tuesday, April 11, 2006

Nejprve přidejte do Uses knihovny URLMon

a ShellApi, které budeme potřebovat. Vlastní funkce bude vypadat takto:
.
.
.
Uses URLMon, ShellApi;
.
.
.

function DownloadFile(Zdroj, Cil: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(Zdroj), PChar(Cil), 0, nil) = 0;
except
Result := False;
end;
end;
Opravdu velmi jednoduché. Funkci můžeme použít například v události po stisku tlačítka takto:
procedure TForm1.Button1Click(Sender: TObject);
const
ZdrojovySoubor = '/soubor.exe';
CilovySoubor = 'c:\soubor.exe';
begin
if DownloadFile (ZdrojovySoubor, CilovySoubor) then ShowMessage('Stažení souboru bylo úspěšné')
else ShowMessage ('Chyba při stahování souboru ' + SourceFile)
end;

Friday, April 07, 2006

Stahování souborů z internetu, zjišťování stavu připojení či získávání informací z registru Windows.

To jsou hlavní témata dnešního dílu.
Download souborů
V dnešních aplikacích se již pomalu stává standardem nabídnout uživateli možnost stažení nové verze programu z domovských stránek produktu. Nebudeme se teď zabývat problémem, jak zjistit, zda verze na webu je novější než ta, kterou máme nainstalovanou. To si necháme pro některý z příštích dílů seriálu. Dnes se podíváme na to, jak funguje samotné stažení daného souboru. Budeme potřebovat v podstatě pouze dva parametry, jedním je přesná adresa souboru a druhým je místo na disku, kam se soubor uloží.

Wednesday, April 05, 2006

procedure TForm1.Button1Click(Sender: TObject);
var
adresar:string;
maska:string;
begin
screen.Cursor:=crHourGlass;
listbox1.Items.Clear;
adresar:=edit1.Text;
maska:=edit2.Text;
if adresar[length(adresar)]<>'\' then adresar:=adresar+'\';
Najdi(adresar+maska);
screen.Cursor:=crDefault;
end;
A to je pro dnešek vše. Příště se mimo jiné znovu trochu podíváme na práci s internetem v našich aplikacích.

Sunday, April 02, 2006

Ale teď již k vlastnímu příkladu.

Nejprve umístěte na formulář dva Editboxy (jeden pro adresář a druhý pro masku), jedno tlačítko a jeden ListBox. Vlastní zdrojový kód se bude skládat ze dvou procedur:
procedure Najdi(mask:string);
var
search:TSearchRec;
verz:string;
such:string;
begin
such:=ExtractFileName(mask);
verz:=ExtractFilePath(mask);
if verz[length(verz)]<>'\' then verz:=verz+'\';
if FindFirst(mask,$23,search)=0 then
begin
repeat
form1.ListBox1.Items.Add(verz+search.Name);
Application.ProcessMessages;
until FindNext(search)<>0;
end;
if FindFirst(verz+'*.*',fadirectory,search)=0 then
begin
repeat
if ((search.Attr and fadirectory)=fadirectory) and (search.name[1]<>'.') then
begin
Najdi(verz+search.name+'\'+such);
end;
until FindNext(search) <>0;
FindClose(search);
end;
end;