Lekce 13 - Přehled proměnných, StringGrid a Pagecontrol
Začněme takovým malým přehledem:
Proměnná | Hodnoty | Velikost |
INTEGER | -2147483648 až 2147483647 | 4 bajty (32 bitů) |
CARDINAL | 0 až 4294967295 | 4 bajty (32 bitů) |
ShortInt | -128 až 127 | 1 bajt (8 bitů) |
SmallInt | -32768 až 32767 | 2 bajty (16 bitů) |
LongInt | -2147483648 až 2147483647 | 4 bajty (32 bitů) |
Int64 | -9223372036854775808 až 9223372036854775808 | 8 bajtů (64 bitů) |
Byte | 0 až 255 | 1 bajt (8 bitů) |
Word | 0 až 65535 | 2 bajty (16 bitů) |
LongWord | 0 až 4294967295 | 4 bajty (32 bitů) |
Jistě jste si všimli, že Integer má hodnotu stejnou, jako LongInt a Cardinal jako LongWord.
Proměnná | Hodnoty | DM | Velikost |
REAL | 5.0 x 10−324 až 1.7 x 10308 | 15-16 | 8 bajtů |
Real48 | 2.9 x 10−39 až 1.7 x 1038 | 11-12 | 6 bajtů |
Single | 1.5 x 10−45 až 3.4 x 1038 | 7-8 | 4 bajty |
Double | 5.0 x 10−324 až 1.7 x 10308 | 15-16 | 8 bajtů |
Extended | 3.6 x 10^-4951 až 1.1 x 104932 | 19-20 | 10 bajtů |
Comp | -9223372036854775807 až 9223372036854775807 | 19-20 | 8 bajtů |
Currency | -922337203685477.5808 až 922337203685477.5807 | 19-20 | 8 bajtů |
DM = počet ukládaných (a zobrazovatelných) desetinných míst
Zde je opět shodný Real a Double. Prostě Real (a stejně tak i Integer a Cardinal) je takový všeobecnější a ostatní typy jsou přesnější. Jestliže tedy víte, že číslo bude jen třeba od nuly do sta, ušetřete v paměti 3 bajty a použijte ShortInt nebo Byte! Každý bajt paměti se hodí!
To bychom měli souhrn čísel. Nyní ještě pár vychytávek pro string:
Proměnná | Počet znaků | Velikost |
ShortString | 255 | 2 bajty až 256 bajtů |
AnsiString (string) | 2147483648 | 4 bajty až 2 gigabajty |
WideString | 1073741824 | 4 bajty až 2 gigabajty |
Proč má AnsiString víc znaků než WideString? AnsiString má méně symbolů. Pokud tedy chcete napsat nějaký opravdu hodně dlouhý text, použijte WideString a pokud kratší, stačí ShortString. A teď konečně ty vychytávky:
JAK NAPSAT APOSTROF V DELPHI?
OK, informuji celkem pozdě!
Buďto si přepnete klávesnici na Anglickou, nebo stisknete levý Alt a na
numerické klávesnici naťukáte 39.
JAK NAPSAT APOSTROF DO STRINGU?
Pomocí dvou apostrofů!
Ukázka: Napis := 'Hello, you''re clever!' {Napis bude: Hello, you're clever!}
FINTA:
Nemusíte psát
'řádek 1'+#13+'řádek 2'
ale stačí
'řádek 1'#13'řádek2'
Ještě vás seznámím s jednou funkcí a potom se pustíme do témata třináctky:
StringPromenna := BoolToStr(BooleanPromenna, True); // Je-li proměnná BooleanPromenna:Boolean; True, // potom je StringPromenna:string; 'True'. // Je-li proměnná BooleanPromenna:Boolean; False, // je StringPromenna:string; 'False'.
StringPromenna := BoolToStr(BooleanPromenna, False); // Je-li proměnná BooleanPromenna:Boolean; True, // je StringPromenna:string; '-1'. // Je-li proměnná BooleanPromenna:Boolean; False, // je StringPromenna:string; '0'.
Neboli:
StringPromenna := BoolToStr(BooleanPromenna, True);
Je to samé jako:
if BooleanPromenna then StringPromenna := 'True' else StringPromenna := 'False';
A
StringPromenna := BoolToStr(BooleanPromenna, False);
Je to samé jako:
if BooleanPromenna then StringPromenna := '-1' else StringPromenna := '0';
StringGrid a DrawGrid
Konečně se ale pusťme do něčeho úplně nového! V menu objektů zvolte záložku Additional a tam by čtvrtý zleva měl být: STRINGGRID. Je to vlastně TABULKA! A konečně se dozvíte, jak na ni... Nejprve si popišme položky v Properties v Object Inspectoru:
- ColCount - celkový počet sloupců
- Color - barva pozadí tabulky
- DefaultColWidth - základní šířka sloupce
- DefaultDrawing - automatické vykreslování políček tabulky
- DefaultRowHeight - základní výška řádku
- FixedColor - barva pevných políček tabulky *
- FixedCols - počet pevných sloupců *
- FixedRows - počet pevných řádků *
- GridLineWidth - šířka čáry oddělující políčka
- RowCount - celkový počet řádků
*: pevná políčka jsou ta krajní s nápisem, např. dne a hodiny v rozvrhu. V příkladě ta šedá políčka:
den\hodina | 0. | 1. | 2. | 3. |
Pondělí | Tv | Aj | M | F |
Úterý | D | Vv | Čj |
Ještě jste si jistě všimly položky Options, která se dělí na spoustu Booleanů:
- goFixedVertLine - zobrazovat vertikální (svislou (od shora dolů)) dělicí čáru u pevných polí
- goFixedHorzLine - zobrazovat horizontální (vodorovnou (zleva doprava)) dělicí čáru u pevných polí
- goVertLine - zobrazovat vertikální (svislou (od shora dolů)) dělicí čáru u obyčejných polí
- goHorzLine - zobrazovat horizontální (vodorovnou (zleva doprava)) dělicí čáru u obyčejných polí
- goDrawFocusSelected - vybrané políčko tabulky se vybarví
- goRowSizing - možnost měnění velikosti řádků
- goColSizing - možnost měnění velikosti sloupců
- goRowMoving - možnost přesouvání řádků na jiný řádek
- goColMoving - možnost sloupců na jiný sloupec
- goEditing - uživatel může vpisovat svůj text do tabulky
- goTabs - šířka čáry oddělující políčka
- goRowSelect - kliknutím se vybere celý řádek
- goAlwaysShowEditor - pokud je goEditing True, začne se text v poli editovat hned po prvním kliknutí (jinak až po druhém)
POZOR! Přemísťovat, měnit velikost a editovat text uživatel nemůže u pevných sloupců!
Vedle StringGridu je také DrawGrid. O tom si nic říkat nebudeme, protože je to vlastně skoro to samé. StringGrid je totiž vylepšení DrawGrid. V DrawGridu například nemůžete jednoduchým způsobem do každého pole vložit jiný text! Doteď znáte základ! Nyní však musíte umět s tabulkou pracovat v programu! Začněme textem v políčkách! K tomu slouží položka CELLS:
StringGrid.Cells[sloupec, radek] := 'libovolný text';
POZOR: číslo sloupců a řádků (sloupec a radek) začínají nulou! Př:
sloupec 0, řádek 0 | sloupec 1, řádek 0 | sloupec 2, řádek 0 |
sloupec 0, řádek 1 | sloupec 1, řádek 1 | sloupec 2, řádek 1 |
sloupec 0, řádek 2 | sloupec 1, řádek 2 | sloupec 2, řádek 2 |
Takže pokud do levého rohu tabulky Tabulka chcete napsat ROZVRH, zadáte:
Tabulka.Cells[0, 0] := 'ROZVRH';
Co můžeme ale dělat dál? StringGrid má Canvas. Což je velmi užitečné. Můžete si vkládat obrázky, kreslit různé tvary, prostě cokoli, co Canvas umí. Je to stejný typ Canvasu, jako u okna. Většina speciálních funkcí tabulky se dá využít pouze s vypnutým automatickým vykreslováním políček. Ještě vám řeknu jednu, kterolze použít kdykoli a pak se pustíme do těch speciálních...
StringGrid.RowHeights[CisloRadku] := VyskaRadku;
Místo CisloRadku zadáte číslo řádku (0 až počet řádků minus jedna) a místo VyskaRadku zadáte Integer, nebo číslo, které určí, kolik pixelů bude mít určený řádek na výšku. A co sloupec? Ten lze měnit také:
StringGrid.ColWidths[CisloSloupce] := SirkaSloupce;
Místo CisloSloupce zadáte číslo sloupce (0 až počet sloupců minus jedna) a místo SirkaSloupce zadáte Integer, nebo číslo, které určí, kolik pixelů bude určený sloupec široký. Takže když chcete levý sloupec a horní řádek tabulky Rozvrh udělat velké 25 pixelů, napíšete:
Rozvrh.RowHeights[0] := 25; Rozvrh.ColWidths[0] := 25;
A nyní se vrhněme na specialitu. Základem bude, že zvolíte OnDrawCell v ObjectInspectoru v záložce Events. Vytvoří se vám procedura. Pokud si pojmenujete StringGrid jako Tabulka a okno jako Okno, bude mít procedura tento tvar:
procedure TOkno.TabulkaDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin end;
Nejprve se nakreslí mrížka a pak se pro každé pole spustí tato procedura! Mezi begin a end samozřejmě budete psát text, ale co vše nám určují všechny ty netradiční proměnné? ACol je číslo sloupce a ARow je číslo řádku. Rect je TRect, který vás odkáže na políčko (když zadáte StringGrid.Canvas.Rectangle(Rect);, nakreslí se vám do každého pole (pokud to neupřesníte pomocí if) čtverec). Do Rect se nepočítají místa, kde je mřížka. A State? TGridDrawState má tyto možnosti:
- gdSelected - pole, které se vykresluje je vybráno
- gdFocused - pole je jedno z ostatních vybraných
gdFixed - vykreslované pole je pevné
Pokud nechápete první dvě, zde vám to ještě upřesním: Uživatel kliknul na pole (je tedy vybrané) a poté táhnul k jinému poli (tím vznikla ostatní vybraná pole). Pokud máte goDrawFocusSelected v Options jako False, zobrazí se vám vybrané pole bílé, ale okolo bude rámeček čárkovanou čarou a ostatní vybraná jsou zobrazená jinou barvou (standardně modrou). Pokud pouze kliknete, nebudou ostatní vybraná pole! Jestliže máte nastaveno goDrawFocusSelected na True, budou všchny vybrané položky jednou barvou (standard je modrá), včetně té první. Ukázka:
pevné pole | obyčejné pole | obyčejné pole | obyčejné pole | obyčejné pole |
pevné pole | 1. vybrané p. | vybrané pole | vybrané pole | obyčejné pole |
pevné pole | vybrané pole | vybrané pole | vybrané pole | obyčejné pole |
pevné pole | obyčejnépole | obyčejné pole | obyčejné pole | obyčejnépole |
pevné pole | obyčejnépole | obyčejné pole | obyčejné pole | obyčejné pole |
A nyní zobrazení, když je goDrawFocusSelected False:
pevné pole | obyčejné pole | obyčejné pole | obyčejné pole | obyčejné pole |
pevné pole | 1. vybrané p. | vybrané pole | vybrané pole | obyčejné pole |
pevné pole | vybrané pole | vybrané pole | vybrané pole | obyčejné pole |
pevné pole | obyčejné pole | obyčejné pole | obyčejné pole | obyčejné pole |
pevné pole | obyčejné pole | obyčejné pole | obyčejné pole | obyčejné pole |
Ale co psát do té procedury? Tak třeba do každého pole nakreslit jiný obrázek. Nebo do každého pole umístit text jiným fontem. Zde se seznámíte s další funkcí Canvasu:
Canvas.TextRect(Rect, Zleva, Shora, Text);
Rect je typu TRect a určuje místo, kde se bude psát Text typu string (či podobného). Zleva a Shora jsou Integery určující pozici textu. Př. pro tabulku do procedury OnDrawCell:
StringGrid.Canvas.TextRect(Rect, Rect.Left, Rect.Top, StringGrid.Cells[ACol, ARow]);
Co nám to udělá? Zakreslí text, který jsem zadali pro vykreslované pole. Má to tu výhodu, že můžete změnit Font písma, pomocí položky Font v Canvas. A ještě u jedné procedury můžeme využít jednu specialitu:
OnMouseDown (nebo OnMouseUp).
A jakou specialitu?
StringGrid.MouseToCell(X, Y, Sloupec, Radek);
Tato procedura (ano, museli použít proceduru a ne funkci, protože jsou dva výstupy) vám vrátí ze souřadnic v tabulce (v pixelech (X a Y)) číslo sloupce (Sloupec) a řádku (Radek).
Aby nebyl 7.bod příliš krátky, tak zde doplním informaci o Booleanu, kterou jsem se nedávno dozvěděl a která vám jistě ulehčí programování. Můžete totiž napsat:
Button1.Visible := 1 < 0;
Co se stane? Button1. Visible bude False. Takže místo:
if X < Y then AnoNe := True else AnoNe := False;
(Kde AnoNe je Boolean a X a Y jsou Integery) můžete napsat:
AnoNe := X < Y;
Což je mnohem jednodušší. Takže to shrňme: Pokud je zadaný výraz pravdivý, zastupuje True, pokud ne, je to False.
PageControl
Když už po dlouhé době poznáváte nový objekt, obeznámím vás rovnou
se dvěma. S tabulkou a se záložkovýmmenu. Teda aspoň tak jsem si to
pojmenoval. Protože vůbec nevím, jak se to řekne česky . Anglicky je to Page Control.
No, ale pusťme se do popisu položek apod. Druhé zleva ve Win32 je
PAGECONTROL. Je to to, co máte nahoře v Delphi, kde si vybíráte objekty.
Pojďme ale na položky v Properties v Object Inspectoru:
- HotTrack - má se změnit barva textu záložky, na kterou ukazuje kurzor?
- Images - každá položka může mít svůj obrázek ze seznamu obrázků (ImageListu), který zde zadáte
- MultiLine - Zadáte-li True, budou položky uspořádány pod sebe, jako ve Windows v oknech s nastavením, pokud False, budou v jednom řádku a budou se posouvat 2ma šipečkami
- OwnerDraw - zadáte-li True, přestanou se vykreslovat popisky a obrázky jednotlivých položek.
- RaggedRight - při MultiLine jako True se napravo udělá volné místo, zadáte-li True. Pokud False, budou položky až ke kraji.
- ScrollOpposite - při MultiLine jako True se řádky seřadí odspoda nahoru a pokud nižší řádky, než je ten, ze kterého je vybrána záložka se posunou pod obsah položky. Pokud zadíte FixedColor jako False, budou se řádky položek vždy vyměňovat.
- Style - nastavíte styl zobrazení záložek:
- tsButtons-záložky budou vypadat jako tlačítka a řádky záložek se nebudou měnit (tlačítka pouze zůstanou zamáčknutá)
- tsFlatButtons-záložky budou vypadat jako tlačítka s nastavením Flat na True (takže budou placatá) a řádky záložek se nebudou měnit (tlačítka pouze zůstanou zamáčknutá)
- tsTabs-klasické Windowsovské záložky
- TabHeight - výška záložek (té části s popiskem)
- TabPosition - nastavíte styl zobrazení záložek:
- tpBottom-záložky budou umístěny pod jejich obsahem
- tsLeft-záložky budou umístěny nalevo od jejich obsahu
- tsRight-záložky budou umístěny napravo od jejich obsahu
- tsTop-záložky budou umístěny nad jejich obsahem
- RowWidth - šířka záložek (té části s popiskem)
Ale jak přidat ty položky? Čtěte dál!
Klikněte na PageControl pravým tlačítkem a zvolte New Page. Vytvoří se nová položka. Až jich takto vytvoříte více, můžete mezi nimi přepínat buď pomocí pravého tlačítka a Next/Previous Page, nebo tak, že kliknete na vámi zvolenou položku v ukázkovém okně, nebo ji zvolíte v Object Inspectoru v položce ActivePage. Poté co ji máte zvolenou,, klikněte na pole pod výběrem položek, kde boudou vámi určené objekty. V Object inspectoru se zobrazí nové vlastnosti záložky, která je typu TTabSheet:
- Highlighted - má mít záložka modré pozadí jejího popisku?
- *ImageIndex - číslo obrázku ze zvoleného ImageListu který se má zobrazit vedle popisku
- PageIndex - číslo záložky, podle kterého se záložky řadí
A jak umístit na záložku objekty? Jednoduše! Zvolíte záložku a potom je umístíte stejně jako do Panelu! Ještě vám řeknu jeden tip a pustíme se do příkladu! Pokud děláte dlouhý program, můžete si deset řádků označit (jakoby takový odkaz) a kdykoli se k tomu řádku rychle vrátit. Jak? Na určeném řádku klikněte pravým tlačítkem, zvolte Toggle Bookmarks a tam si zvolte číslo odkazu (0-9). Odkaz se vám zobrazí nalevo od textu. Pokud zadáte to samé číslo jinde, odkaz se přesune tam. A jak najít odkaz zpět? Tentokrát po stisknutí pravého myšítka klikněte na Goto Bookmarks a tam zvolte číslo hledaného odkazu. Delphi vás k němu pošle!
Program
A nyní příklad: UBOHÁ NAPODOBENINA EDITORU PRO KP MAZE
OBJEKTY, KTERÉ BUDETE POTŘEBOVAT A JEJICH NASTAVENÍ:
Form (to je to základní okno):
- Caption = Bludiště
- Name = Okno
- Height = 380
- Width = 312
StringGrid (to je tabulka, kterou jsme poznávali):
- ColCount = 30
- Color = clSilver
- DefaultColWidth = 10
- DefaultRowHeight = 10
- FixedCols = 0
- FixedRows = 0
- GridLineWidth = 0
- Heigt = 304
- Left = 0
- Name = Tabulka
- RowCount = 30
- ScrollBars = ssNone
- Top = 0
- Width = 304
Button (to je tlačítko):
- Caption = Všude jenom zdi
- Height = 25
- Left = 152
- Name = VsudeZed
- Top = 328
- Width = 152
Button (to je tlačítko):
- Caption = Všude jenom zem
- Height = 25
- Left = 0
- Name = VsudeZem
- Top = 328
- Width = 152
ColorBox (Additional vpravo):
- Hint = Barva zdí
- Left = 152
- Name = Zed
- Selected = clMaroon
- ShowHint = True
- Top = 304
- Width = 152
ColorBox (Additional vpravo):
- Hint = Barva podlahy
- Left = 0
- Name = Zem
- Selected = clSilver
- ShowHint = True
- Top = 304
- Width = 152
A nyní už jenom zdrojový kód (s trochou popisků):
Prvně ale předdefinujte společnou proměnnou:
Zdi : array [0..29, 0..29] of Boolean;
A potom už můžete pracovat! Tato procedura se spustí při vytvoření Okna:
procedure TOkno.FormCreate(Sender: TObject); var X,Y : Integer; begin for X := 0 to 29 do for Y := 0 to 29 do Zdi[X,Y] := False; end;
Do každého políčka pole Booleanů zvaného Zdi se umístí False (což značí, že tam není zeď). Ale jdeme dál. Tato procedura se spustí při vykreslování každého políčka tabulky Tabulka:
procedure TOkno.TabulkaDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Zdi[ACol, ARow] then Tabulka.Canvas.Brush.Color := Zed.Selected else Tabulka.Canvas.Brush.Color := Zem.Selected; Tabulka.Canvas.Pen.Color := Tabulka.Canvas.Brush.Color; Tabulka.Canvas.Rectangle(Rect); end;
Pokud je na souřadnicích buňky v poli Zdi True (to znamená, že je zde zeď), nastaví se barva výplně v Canvasu Tabulky na stejnou barvu, jako má ColorBox Zed. Jinak se barva nastaví podle ColorBoxu Zem. Dále se barva pera Canvasu Tabulky změní na tu samou, jako je výplň. A nakonec se onou barvou nakreslí obdélník do políčka Tabulky, které se zrovna vykresluje. Tím program nekončí! Nějak se musí určit, kde budou zdi a kde ne. Určíme to stisknutím tlačítka myši na Tabulce:
procedure TOkno.TabulkaMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Sloupec, Radek : Integer; begin Tabulka.MouseToCell(X,Y,Sloupec,Radek); if ssLeft in Shift then Zdi[Sloupec,Radek] := True else if ssRight in Shift then begin Zdi[Sloupec,Radek] := False; Tabulka.Invalidate; end; end;
Nejprve jsme si předdefinovali Sloupec a Radek a potom jsme si do těchto Integerů vložili sloupec a řádek tabulky, kam se zmáčklo (zjištěním ze souřadnic myši). Pokud bylo zmáčknuto levé tlačítko, místo se souřadnicemi Sloupec, Radek v poli Zdi se nastaví na True. Pokud je stisknuté pravé tlačítko, bude to False (a Tabulka se překreslí příkazem Invalidate). Tím jsou splněny základní funkce ale my, jako programátoři si můžeme pohrát a udělat program s více možnostmi. A proto jsme také vložili ty dva ColorBoxy. Zde máte společnou proceduru pro změnu u obou (standardně se tak jmenovat nebudou, ale já jsem si to tak pro přehlednost pojmenoval:
procedure TOkno.Change(Sender: TObject); begin Tabulka.Invalidate; Tabulka.Color := Zem.Selected; end;
Tato procedura nám akorát překreslí Tabulku, aby se změnily barvy a nastaví barvu Tabulky na barvu zdí. Tlačítko VsudeZem po kliknutí vyvolá:
procedure TOkno.VsudeZemClick(Sender: TObject); var X,Y : Integer; begin for X := 0 to 29 do for Y := 0 to 29 do Zdi[X,Y] := False; Tabulka.Invalidate; end;
A to provede změnu všech políček pole na zem a Tabulku překreslí, aby byla změna vidět! A VsudeZed udělá:
procedure TOkno.VsudeZedClick(Sender: TObject); var X,Y : Integer; begin for X := 0 to 29 do for Y := 0 to 29 do Zdi[X,Y] := True; Tabulka.Invalidate; end;
Je to vlastně opak VsudeZem. Všude v poli Zdi budou True, neboli zdi... A
aby se nemuselo pro pokládání a bourání zdí, opíšeme (okopírujeme -
nejsme zaostalci... ) obsah
procedury TabulkaMouseDown do procedury, která se spustí posuvem myši po
Tabulce:
procedure TOkno.TabulkaMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Sloupec, Radek: Integer; begin Tabulka.MouseToCell(X,Y,Sloupec,Radek); if ssLeft in Shift then Zdi[Sloupec,Radek] := True else if ssRight in Shift then begin Zdi[Sloupec,Radek] := False; Tabulka.Invalidate; end; end;
HOWGH (nebo jak se to píše!?) Domlu... Dopsal jsem! Ale vy nepřestaňte!
Nyní máte o důvod víc! Programy, programy a návody k nim ..

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 483x (241.21 kB)
Aplikace je včetně zdrojových kódů v jazyce Delphi