Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 -9223372036854­77.5808 až 9223372036854­77.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.Can­vas.Rectangle(Rec­t);, 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 :-D. 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 :-) ..

Delphi

 

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 480x (241.21 kB)
Aplikace je včetně zdrojových kódů v jazyce Delphi

 

Předchozí článek
RES soubory a INI soubory
Všechny články v sekci
Delphi
Přeskočit článek
(nedoporučujeme)
Doplnění - While cyklus, Canvas a tisk
Článek pro vás napsal Kukensius
Avatar
Uživatelské hodnocení:
1 hlasů
Jméno: Lukáš Kučera alias Kukensius<br/> Narození: říjen 1987 (ve znamení vah)<br/> Bydliště: Jihlava, Česká Republika<br/> Studium: 1. ročník magisterského studia<br/> Škola: Vysoké učení technické v Brně<br/> Fakulta: Fakulta elektrotechniky ...
Aktivity