HEd 2000 - programátorská příručka

Tato příručka by měla sloužit k základnímu porozumění, jak je celý program naprogramován a k nastínění použitých postupů a programových struktur.

Celý program byl vytvořen v programovacím jazyku Borland Delphi 3.0 Client/Server. V jednom formuláři frmMain je umístěn jeden panel pnlMenu, který obsahuje celou nástrojovou lištu a tlačítka pro volby nejběžnějších funkcí. Zbývající část obsahuje komponentu TRichEdit v programu nazvanou reMain (re - RichEdit) Celou plochu okna ještě doplňuje StatusBar ( komponenta TStatusBar ) pro zobrazování delšího nápovědného textu ke všem tlačítkům obsaženým v základním okně.

Základní práci se soubory zajišťují standartní dialogy pro otevření souboru TOpenDialog a pro jeho uložení TSaveDialog. Položky nabídky volají stejné metody jako tlačítka vlevo od nástrojové lišty. Práce se schránkou využívá metod objektu reMain ( CopyToClipboard, CutToClipboard a PasteFromClipboard ). Další tlačítko uchovává způsob vkládání tagů pomocí procedury InsertText(ins:string;lineMode:boolean); která se ji předává jako druhý parametr. Prvním parametrem je text vkládaného tagu ve speciálním formátu. Protože dva znaky, které obsahuje proměnná ins jsou interpretovány jinak než jen zobrazeny. Znak zpětného apostrofu "`" označuje místo, kde bude umístěn eventuálně označený text a znak svislítka "¦" je místem, kde se po vložení tagu zobrazí kurzor. Většinou se jedná o místo, kam uživatel s největší pravděpodobností po vložení značky bude vkládat nějaké hodnoty z klávesnice.

Dalším tlačítko slouží k zapínání/vypínání panelu, který obsahuje chybová hlášení po syntaktické kontrole dokumentu. Je zobrazen v dolní části aplikace a je reprezentován komponentou TListBox s názvem lbError. Jeho existence je ještě spojená se seznamem ErrList, který v sobě udržuje všechna místa, kde se program při kontrole přišel na chybu. Po kliknutí na komponentu lbError se z tohoto seznamu najde požadované umístění v dokumentu a program na toto místo přejde kurzorem.

Následující tlačítko pro vkládání speciálních znaků, které by se jinak v dokumentu nedali normálním způsobem napsat a musí být použito konvence &nějakýtext; toto tlačítko pracuje ve stejném principu jako všechna další, která vyvolávají pomocné formuláře. V každém takovém pomocném formuláři byla vytvořena metoda Execute, někdy s parametrem, která vrací string vygenerovaný na základě změn formuláře. Ten je potom předán proceduře InsertText, která vše vloží do editovaného dokumentu ( reMain.Text ). V tomto případě je vygenerován požadovaný znak a po potvrzení je vložen do reMain.Text na místo reMail.SelStart.

Dalším velmi důležitým tlačítkem je sbSyntaxCheck ( TSpeedButton ) pro kontrolu syntaxe HTML dokumentu podle specifikace 4.01. Kontrola syntaxe se skládá ze dvou částí. Tou první je ověření všech tagů a jejich parametrů, zda jsou podle specifikace platné a potom následuje kontrola jejich ukončování a vnořování do sebe. Jsou použity dvě datové struktury, které se načítají ze souboru html.dat. Tam je obsaženo tolik řádků, kolik je ve specifikaci tagů. Na každém řádku je na začátku jméno značky a následují parametry oddělené středníkem. Poslední parametr musí být také oddělen středníkem z důvodu jejich vyhledávání. (předpokládá se, že žádný parametr ve svém názvu neobsahuje znak středníku) Vyhledávají se totiž jako ';' + parametr + ';' aby byl nalezen parametr celý a ne pouze jeho část. Seznam tagů je uložen v objektu typu TStringList nazvaném TagArray a všechny parametry jsou v seznamu TStringList se jménem ParamArray.

Kontrola syntaxe prochází dokument od začátku, pokud je neprázdný, dokud není konec dokumentu (znak #0) Prochází znak po znaku, dokud nenarazí na < potom očekává nějaký tag. Jeho jméno a parametry načte a konroluje, zda jsou obsaženy v pomocných seznamech. Jestli ano, tak probíhá vše bez problémů, ale pokud narazí na nějaký problém, tak volá proceduru ReportErr, která slouží k obsloužení nalezené chyby. Přidá chybu do lbError a také do ErrList, aby ji bylo možno později rychle nalézt. Protože dokument může být napsán jakýmikoliv písmeny, tak se používá konverze na velká písmena u jmen tagů a na malá u jmen parametrů. Kvůli parametrům jsou tagy komentář a DOCTYPE zpracovávány zvlášť, neboť u nich není žádný specifický parametr, který by se dalo kontrolovat. Po kontrole tagu následuje zjištění, zda je tag párový. Pokud je, tak se zařadí na zásobník, který pomáhá při zjišťování, zda jsou tagy správně ukončované. Pokud se opět narazí na nějaký problém, ať je to ukončení tagu, který není na zásobníku nebo naopak jeho neukončení, volá se ohlašovací procedura ReportErr. Pro zjištění párovosti tagů je v programu ještě vytvořen TStringList se jménem NoPairTags, který obsahuje všechny nepárové tagy a CustomPairTags pro tagy, které jsou párové volitelně. Ty se do zásobníku neukládají. Všechny tyto struktury jsou načítány ze souboru html.dat, jehož struktura je následující:

   [P | N | O]jmenoTagu;param1;param2;param3;....;

P párový tag
N nepárový tag
O volitelně párový, tedy tag, který může a nemusí být ukončen
Následuje jméno tagu a potom všechny jeho parametry.

Zobrazení souboru pomocí posledního tlačítka rychlé volby je zařízeno spuštěním dokumentu HTML přímo ve windows tímto řádkem kódu:

ShellExecute(Handle, 'open', PChar(FileName), nil, nil, SW_SHOW);

Spustí se aplikace asociovaná s příponou HTML a v ní se tento dokument otevře. Standartně je to Microsoft Internet Explorer.

Ošetření všech tlačítek v nástrojové liště vpravo je stejné. Pokud je to tlačítko bez dalšího doplňujícího formuláře, tak se po jeho odklepnutí do textu vloží pomocí procedury InsertText požadovaný tag. Všechny jsou uvedeny jako konstanty na začátku programu pojmenované jako tagJMENO. Tedy např. pro centrování textu je to konstanta tagCenter, apod. Pokud je k tlačítku vytvořen ještě nějaký doplňkový dialog, tak je tu možnost stisku pravým tlačítkem, které tento dialog vyvolá metodou Execute a po jeho ukončení do dokumentu vloží vrácený string.

Ostatní programátorské obraty jsou komentovány přímo ve zdrojovém kódu aplikace a měly by být podle mě dostatečné.

Kontakt na autora: krylm@email.cz