Práva

 

Tuto komponentu lze používat zdarma a bez omezení. Zdrojový kód je možné modifikovat pro své účely. Vše, co je součástí tohoto archivu (soubory CalcCRC.pas, DX81Reg.pas, HexDump.pas, MediaSource.pas, SelectForm.pas, SelectZIP.pas, TGA.pas, ZIPEditForm.pas, ZIPStream.pas, dále obsah adresáře Examples) , lze šířit bez omezení pouze v nezměněné podobě. Modifikovaný zdrojový kód se nesmí bez dohody s autorem (zdeno6@seznam.cz) dále šířit, lze šířit pouze přeloženou aplikaci.

Komponenta využívá zlib knihovnu, napsanou v jazyce C a importovanou do Delphi (obj soubory), jejíž autoři a práva jsou uvedena níže (vyjmuto z originálu):

 

Copyright notice:

 

(C) 1995-1996 Jean-loup Gailly and Mark Adler

 

This software is provided 'as-is', without any express or implied warranty.  In no event will the authors be held liable for any damages  arising from the use of this software.

 

Permission is granted to anyone to use this software for any purpose,  including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:

 

1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.

2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.

3. This notice may not be removed or altered from any source distribution.

TMediaSource

 

Jedná se o nevizuální komponentu, která byla vytvořena za účelem přístupu k obsahu souborů, přičemž byl kladen důraz na transparentnost umístění cílového souboru. V současné verzi přistupuje komponenta k souborům, které jsou uloženy na disku, v zip archivu nebo ve zdrojích (přesněji v zipu, který je umístěn ve zdroji).

Funkce pro práci se zipem jsou maximálně zjednodušeny, vzhledem k zaměření na čtení ze zipu, a omezují tak práci se zipy. Zde jsou možnosti, které tato komponenta poskytuje:

-         podpora kompresní metody None (bez komprese) a Deflate/Inflate (pro všechny stupně komprese)

-         hesla nejsou podporována

-         rozdělení zipu není podporováno

-         možnost dekomprese přímo do paměti (bez vytváření dalších souborů)

-         možnost dekomprese z vytvořeného TStreamu (pro použití metod LoadFromStream jiných komponent)

-         ukládání do zipu je možné jen z celého připraveného souboru v paměti

-         uložený komprimovaný soubor je udržován v paměti, do zipu se zapíše až voláním metody SaveZIPToStream (eliminuje se tak doba potřebná ke složení zipu)

-         kontrola chyb (CRC) není prováděna

 

Vlastnosti:

 

SourceList – odvozen od TCollection, každá položka v tomto seznamu představuje soubory, které mají společné umístění (v souboru, adresáři, zip, adresář se zipy, zdroj). Typ položky udává vlastnost SourceType, bližší informace poskytuje vlastnost Path (její význam závisí na použitém typu. SourceList je určen hlavně pro design mod, za běhu není většinou nutné k této položce přistupovat.

Metody:

 

function LoadFile(const SourceName:string;const FileName:string;const ZipName:string):TStream;

           

Vrací objekt odvozen z TStream, ze kterého je možné číst obsah souboru.

SourceName – název položky v SourceList, pokud je ‘’,  prochází se všechny položky (od poslední k první uvedené v SourceList), dokud se soubor nenalezne

FileName – název souboru (může být včetně relativní cesty, není možno použít masku)

ZipName – název zipu, ve kterém se má hledat, pokud je ‘’, prochází se všechny zipy

Pokud soubor neexistuje, vrací nil.

 

function FindFirst(const SourceName:string;const FileName:string;const ZipName:string;var FindRec:TFindFileRec):Boolean;

 

Zahájení vyhledávání všech souborů, jejichž název včetně relativní cesty odpovídá zadanému parametru FileName (může být použita maska). Prohledávání podadresářů není implementováno. Parametry SourceName a ZipName omezují prohledávání jako u funkce LoadFile. Funkce vyplní strukturu FindRec, která se předává dalším funkcím (FindNext a  FindClose).

Pokud je návratová hodnota false, soubor není nalezen, pokud je true, ze struktury FindRec je možné určit název nalezeného souboru (FindRec.frFile:PChar), název položky (FindRec.frSourceName:string), název zipu (FindRec.frZipName:string).

 

function FindNext(var FindRec:TFindFileRec):Boolean;

 

Opakované volání této funkce postupně nalézá další soubory, které vyhovují kritériím, zadaných u funkce FindFirst. Pokud  další soubor neexistuje, návratová hodnota je false a vyhledávání by mělo být ukončeno voláním FindClose.

 

procedure FindClose(var FindRec:TFindFileRec);

 

Ukončení vyhledávání (uvolnění alokované paměti). Měla by být volána, pokud je návratová hodnota funkce FindNext false.

 

Editor vlastnosti SourceList

 

Označte komponentu TMediaSource, a klikněte na tlačítko [...] v Object Inspectoru. Otevře se okno pro přidávání položek (obr.1).

 

Obr.1

 

Prvním tlačítkem v ToolBaru položky přidáváte, druhým mažete, dalšími přehazujete pořadí (pořadí může mít vliv na celkové chování). Označením položky můžete měnit její vlastnosti (obr.2).

 

Obr.2

 

Name – jméno položky (nemusí být zadáno).

Path – bližší upřesnění

SourceType – typ položky (stFile, stResource, stZIP)

 

Editor vlastnosti Path

 

Význam této vlastnosti se liší od použitého typu položky:

stFilepro tuto položku Path udává  umístění adresář, kde jsou soubory umístěné, je možné použít i relativní cestu (“..\Data\“). Vždy musí být ukončen opačným lomítkem. Stisknutím tlačítka [...] v Object Inspectoru se otevře dialog. Nalezením adresáře a stiskem tlačítka Otevřít se aktuální cesta přepíše do Path (vždy se jedná o úplnou cestu). Maska souboru není platná.

 

stZIP Path udává adresář, kde jsou archivy umístěny, může být uveden konkrétní zip (“a.zip“), nebo maska (“*.pk3“). Na příponě nezáleží. Komponenta zkouší, zda vyhovující soubory jsou zipy (testuje se signatura), proto uvedením (“*.*“) se vyberou jen archivy. Kliknutím na [...] v Object Inspektoru se zobrazí seznam vyhovujících zipů (obr.3).

 

Obr.3

 

 

Nové umístění zipů, včetně masky je možné zvolit kliknutím na tlačítko Nová cesta… Výběrem některého uvedeného archivu je možné ho editovat (tlačítko Upravit..).

 

stResource – hodnota Path nemá význam, pouze tlačítko [...] v Object Inspectoru umožňuje editovat zip, který je umístěn ve zdrojích (resources).

 

Integrovaný editor zipů

 

Je určen k editaci archivů uložených na disku a je jediným způsobem, jak ovlivňovat obsah zipu, který je umístěn ve zdrojích. Náhled okna je na obr.4.

Obr. 4

 

Vlevo je zobrazena adresářová struktura, vpravo obsah vybraného adresáře. Procházení je podobné jako v Průzkumníkovi. Položky je možné mazat (klávesa DEL), přidávat (přetažením souborů z průzkumníka na toto okno), vytvářet adresáře (druhé tlačítko v Toolbaru), přejmenovávat soubory a adresáře (jednoduché kliknutí na označenou položku). Součásti tohoto editoru jsou prohlížeče, které se vyvolají dvojkliknutím na vybraný soubor). Prozatím je implementován editor obrázků (jpg, bmp, tga – včetně alfa kanálů), editor textu (otevře se, pokud v prvních 256 znacích souboru jsou jen ASCII znaky, a zároveň délka souboru nesmí být větší než 64kB) a hexadecimální editor (pokud není možné použít výše uvedené editory).

V textovém a hex. editoru je možné provádět změny a tyto změny uložit (volí se úroveň komprese).

 

Pozn.: komprese je asi 2xpomalejší než např. u WinZIPu, dekomprese je srovnatelná.

 

 

Dodatek k použití komponenty

 

Komponenta byla vyvinuta po vzoru Quake III Arena, kde jsou soubory umístěné v zipu s příponou pk3. Současně je možné přidávat do stejného adresáře jiné archivy (např. s jinou mapou, zbraněmi, boty apod.), s kterýma se pracuje, jako kdyby byly součástí jednoho zipu. Některé soubory nahrazují starší se stejným jménem (např. arena.txt – seznam map) a můžou tak změnit i výchozí vlastnosti. Soubory také mohou být do adresáře rozbaleny, a opět se na funkci nic nemění.

Takového chování se docílí takto:

-         do SourceListu se vloží 3 položky

-         první bude typu stZIP s odkazem na výchozí zip (např. pak0.pk3)

-         druhá, rovněž stZIP, bude mít nastavenou masku (*.pk3), ta bude zahrnovat všechny archivy s příponou pk3 (s výjimkou pak0.pk3, neboť ten je otevřen první položkou s výlučným módem přístupu fmShareExclusive, proto jej žádná jiná neotevře)

-         třetí bude stFile s nastavenou cestou, ta zahrne volné soubory

Při prohledávání se postupuje od poslední položky k první, proto se upřednostní volný soubor na disku (např. při vyvíjení), pak se prohledávají přidané archivy (které mohou obsahovat inovované verze některých souborů) a naposled výchozí zip v první položce.

 

Použití komprimace vede k nárustu výsledného kódu asi o 25kB až 60kB (záleží na nastavení kompilace a rozsahu použití). Proto ji nemá smysl používat, pokud se tento nárust kompresí nevykompenzuje.

 

Napište mi

 

Připomínky, kritika, pochvala, nové nápady jsou vítány! Kontakt : zdeno6@seznam.cz

 

Vytvořeno dne 16.června 2003.