Z Pascal

Prejsť na: navigácia, hľadanie

1. Riešené úlohy


< 1.Prednáška


Tlačidlá a jednoduchý text

1. Text vo formulári

Vložte do formulára komponent TLabel - jednoduchý text. V inšpektore objektov mu zmeňte Font na nejaké veľké písmo a nastavte do Caption nejaký text. Po dvojkliknutí na tento komponent vo formulári sa otvorí procedúra Label1Click: sem napíšte príkaz na zmenu farby fontu (Label1.Font.Color) a zmenu textu tohto komponentu (Label1.Caption).

{{{3}}} {{{3}}}

procedure TForm1.Label1Click(Sender: TObject);
begin
  Label1.Font.Color := clGreen;
  Label1.Caption := 'I love Lazarus';
end;


2. Odpoveď na pozdrav

Do formulára vložte jeden textový komponent (TLabel) - zväčšite mu font (Font) a popis (Caption), napr. na Ako sa máš?. Pod text vložte 3 tlačidlá s textami, napr. Výborne, Mohlo byť lepšie, Zle. Po zatlačení na každé z tlačidiel by sa mal zodpovedajúco zmeniť text, napr. na Je mi ťa ľúto.

{{{3}}} {{{3}}}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := 'Teší ma';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Label1.Caption := 'Škoda';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Label1.Caption := 'Je mi ťa ľúto';
end;


3. Matematický test

Program v textovom komponente vypíše nejakú matematickú úlohu, napr. Koľko je 6 * 7 ?. Tri tlačidlá ponúkajú rôzne odpovede, napr. 40, 42, 44 a ich zatlačenie príslušne reaguje, napr. takto

{{{3}}}

{{{3}}} {{{3}}}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label2.Font.Color := clRed;
  Label2.Caption := '6 * 7 > 40';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Label2.Font.Color := clGreen;
  Label2.Caption := '6 * 7 = 42 ... výborne';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Label2.Font.Color := clRed;
  Label2.Caption := '6 * 7 < 44';
end;


4. Ako uvariť čaj

Vo formulári bude pod sebou 5 textových komponentov, pričom prvý obsahuje text Návod ako uvariť čaj: a všetky ostatné ?. 4 tlačídlá s číslami 1 až 4 postupne priraďuje texty zodpovedajúcim tlačidlám, tak aby sa postupne vypísal návod na varenie čaju.

{{{3}}}

{{{3}}}{{{3}}} {{{3}}}{{{3}}}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label2.Caption := 'nechaj zovrieť vodu';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Label3.Caption := 'vlož do šálky vrecúško čaju';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Label4.Caption := 'zalej vrecúško vriacou vodou';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Label5.Caption := 'po 2 minútach vyber vrecúško';
end;


Grafická plocha

5. Vypisovanie farebných slov

Na každé stlačenie tlačidla sa vypíšte na náhodnej pozícii modré slovo Pascal a červené Lazarus.

{{{3}}}
begin
  Image1.Canvas.Font.Height := 20;
  Image1.Canvas.Font.Color := clRed;
  Image1.Canvas.TextOut(Random(200), Random(150), 'Lazarus');
  Image1.Canvas.Font.Color := clBlue;
  Image1.Canvas.TextOut(Random(200), Random(150), 'Pascal');
end;


6. Veľký text

Vypíšte na náhodné pozície veľký text 'I love Pascal' aj s priesvitným pozadím písma. Farbu textu tiež nastavte náhodnú.

{{{3}}}
begin
  Image1.Canvas.Brush.Style := bsClear;
  Image1.Canvas.Font.Height := 50;
  Image1.Canvas.Font.Name := 'Verdana';
  Image1.Canvas.Font.Style := [fsBold];
  Image1.Canvas.Font.Color := Random(256 * 256 * 256);
  Image1.Canvas.TextOut(Random(200), Random(100), 'I love Pascal');
end;


7. Snehuliak

Nakreslite snehuliaka ako tri biele zväčšujúce sa kruhy na šedom pozadí.

{{{3}}}
begin
  Image1.Canvas.Brush.Color := clLtGray;
  Image1.Canvas.FillRect(Image1.ClientRect);
  Image1.Canvas.Brush.Color := clWhite;
  Image1.Canvas.Pen.Color := clWhite;
  Image1.Canvas.Ellipse(100 - 20, 30 - 20, 100 + 20, 30 + 20);
  Image1.Canvas.Ellipse(100 - 35, 85 - 35, 100 + 35, 85 + 35);
  Image1.Canvas.Ellipse(100 - 50, 170 - 50, 100 + 50, 170 + 50);
end;


8. Náhodné obdĺžniky

Každé kliknutie nakreslí náhodný obdĺžnik, v ktorom X je náhodné číslo medzi 0 a 300 a Y je náhodné číslo medzi 0 a 200.

{{{3}}}
begin
  Image1.Canvas.Rectangle(
    Random(300), Random(200), Random(300), Random(200));
end;


9. Vpísaný kruh a štvorec
  1. nakreslite kruh vpísaný do štvorca
  2. nakreslite štvorec vpísaný do kruhu

{{{3}}}{{{3}}}

begin
   Image1.Canvas.Ellipse(100 - 80, 100 - 80, 100 + 80, 100 + 80);
   Image1.Canvas.Rectangle(100 - 80, 100 - 80, 100 + 80, 100 + 80);
end;
begin
  Image1.Canvas.Ellipse(100 - 80, 100 - 80, 100 + 80, 100 + 80);
  // 80 * 0.70 = 56
  Image1.Canvas.Rectangle(100 - 56, 100 - 56, 100 + 56, 100 + 56);
end;


10. Hrubé čiary

Pomocou rôzne hrubých a rôzne zafarbených čiar nakreslite kríž.

{{{3}}}
begin
  Image1.Canvas.Pen.Color := clGreen;
  Image1.Canvas.Pen.Width := 40;
  Image1.Canvas.Line(100, 30, 100, 180);
  Image1.Canvas.Line(50, 80, 150, 80);
  Image1.Canvas.Pen.Color := clWhite;
  Image1.Canvas.Pen.Width := 30;
  Image1.Canvas.Line(100, 30, 100, 180);
  Image1.Canvas.Line(50, 80, 150, 80);
end;


11. Mesiac

Nakreslite mesiac: najprv žltý kruh a potom sa z neho vykusne posunutý modrý kruh.

{{{3}}}
begin
  Image1.Canvas.Brush.Color := clBlue;
  Image1.Canvas.FillRect(Image1.ClientRect);
  Image1.Canvas.Brush.Color := clYellow;
  Image1.Canvas.Pen.Color := clYellow;
  Image1.Canvas.Ellipse(100 - 80, 100 - 80, 100 + 80, 100 + 80);
  Image1.Canvas.Brush.Color := clBlue;
  Image1.Canvas.Pen.Color := clBlue;
  Image1.Canvas.Ellipse(150 - 80, 100 - 80, 150 + 80, 100 + 80);
end;


Celočíselné premenné

12. Vytieňovaný text

Vypíšte modré slová 'I love Pascal' so sivým tieňom. Nezabudnite urobiť priesvitné pozadie písmen.

{{{3}}}
const
  Veta = 'I love Pascal';
var
  X, Y: Integer;
begin
  X := 50;
  Y := 100;
  Image1.Canvas.Brush.Style := bsClear;
  Image1.Canvas.Font.Height := 60;
  Image1.Canvas.Font.Name := 'Verdana';
  Image1.Canvas.Font.Style := [fsBold];
  Image1.Canvas.Font.Color := clLtGray;
  Image1.Canvas.TextOut(X + 6, Y - 6, Veta);
  Image1.Canvas.Font.Color := clBlue;
  Image1.Canvas.TextOut(X, Y, Veta);
end;


13. Rovnostranný trojuholník

Nakreslite rovnostranný trojuholník so stranou A. Použite MoveTo a LineTo.

{{{3}}}
const
  A = 200;
  Vyska = Round(A * 0.877);   // Sqrt(3)/2 je priblizne 0.877
var
  X, Y: Integer;
begin
  X := 100;
  Y := 200;
  Image1.Canvas.MoveTo(X, Y);
  Image1.Canvas.LineTo(X + A div 2, Y - Vyska);
  Image1.Canvas.LineTo(X + A, Y);
  Image1.Canvas.LineTo(X, Y); 
end;


14. Vyfarbený trojuholník

Nakreslite vyfarbený rovnostranný trojuholník so stranou A. Použite príkaz Polygon. Tento príkaz dostáva ako parameter postupnosť vrcholov (Point), ktoré postupne pospája (spojí aj posledný s prvým) a túto oblasť zafarbí farbou štetca. Napr.

Image1.Canvas.Polygon([Point(X1, Y1), Point(X2, Y2), ...]);
{{{3}}}
const
  A = 200;
  Vyska = Round(A * 0.877);
var
  X, Y: Integer;
begin
  X := 100;
  Y := 200;
  Image1.Canvas.Brush.Color := Random(256 * 256 * 256);
  Image1.Canvas.Polygon([
     Point(X, Y),
     Point(X + A div 2, Y - Vyska),
     Point(X + A, Y)]);
end;


15. Náhodné štvorec, trojuholník, kruh

Zadefinujte tri tlačidlá, ktoré na náhodné pozície nakreslia:

  • červený štvorec so stranou dĺžky A,
  • žltý rovnostranný trojuholník so stranou dĺžky A,
  • modrý kruh s priemerom A.
{{{3}}}
const
  A = 50;

procedure TForm1.Button1Click(Sender: TObject);
var
  X, Y: Integer;
begin
  X := Random(Image1.Width - A);
  Y := Random(Image1.Height - A);
  Image1.Canvas.Brush.Color := clRed;
  Image1.Canvas.Rectangle(X, Y, X + A, Y + A);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  X, Y: Integer;
begin
  X := Random(Image1.Width - A);
  Y := Random(Image1.Height - A);
  Image1.Canvas.Brush.Color := clYellow;
  Image1.Canvas.Polygon([
           Point(X + A div 2, Y),
           Point(X, Y + Round(A * 0.877)),
           Point(X + A, Y + Round(A * 0.877))]);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  X, Y: Integer;
begin
  X := Random(Image1.Width - A);
  Y := Random(Image1.Height - A);
  Image1.Canvas.Brush.Color := clBlue;
  Image1.Canvas.Ellipse(X, Y, X + A, Y + A);
end;


16. Náhodne v štvorcovej sieti

Opravte predchádzajúci príklad, aby boli farebné útvary náhodne generované len v štvorcovej sieti so štvorčekom veľkosti A.

  • Riešenie je len pre prvý útvar - pre ostatné je to úplne analogické.
{{{3}}}
procedure TForm1.Button1Click(Sender: TObject);
var
  X, Y: Integer;
begin
  X := A * Random(Image1.Width div A);
  Y := A * Random(Image1.Height div A);
  Image1.Canvas.Brush.Color := clRed;
  Image1.Canvas.Rectangle(X, Y, X + A, Y + A);
end;


17. Náhodné machule

Vykreslite na obrazovku kruh náhodnej farby, pričom obvod aj výplň má rovnakej farby. Polomer kruhu má náhodnú veľkosť od 1 do 50.

{{{3}}}
var
  X, Y, R: Integer;
begin
  Image1.Canvas.Pen.Color := Random(256 * 256 * 256);
  Image1.Canvas.Brush.Color := Image1.Canvas.Pen.Color;
  R := Random(50) + 1;
  X := Random(Image1.Width - 2 * R) + R;
  Y := Random(Image1.Height - 2 * R) + R;
  Image1.Canvas.Ellipse(X - R, Y - R, X + R, Y + R);
end;

For cyklus

18. Čísla na uhlopriečke

Vypíšte čísla 1..20 na uhlopriečku grafickej plochy. Na výpis čísel musíme použiť funkciu IntToStr, ktorá prevedie číslo na text. Do príkazu TextOut musíme ako tretí parameter uviesť text a číslo by tu spôsobilo chybu.

{{{3}}}
var
  I: Integer;
begin
  for I := 1 to 20 do
    Image1.Canvas.TextOut(I * 16, I * 12, IntToStr(I));
end;


19. Čísla vo štvorci 10x10

Vypíšte čísla 1..100 do štvorca 10x10

  • po stĺpcoch
  • po riadkoch
{{{3}}}
{{{3}}}
var
  I, J, Cislo: Integer;
begin
  Cislo := 0;
  for J := 1 to 10 do
    for I := 1 to 10 do
    begin
      Cislo := Cislo + 1;
      Image1.Canvas.TextOut(J * 16, I * 12, IntToStr(Cislo));
      // Image1.Canvas.TextOut(I * 16, J * 12, IntToStr(Cislo));
    end;
end;


20. Vytieňovaný text

Vypíšte modré slová 'I love Pascal' so sivým šikmým tieňom.

{{{3}}}
const
  Veta = 'I love Pascal';
var
  I, X, Y: Integer;
begin
  X := 50;
  Y := 100;
  Image1.Canvas.Brush.Style := bsClear;
  Image1.Canvas.Font.Height := 60;
  Image1.Canvas.Font.Name := 'Verdana';
  Image1.Canvas.Font.Style := [fsBold];
  Image1.Canvas.Font.Color := clLtGray;
  for I := 1 to 15 do
    Image1.Canvas.TextOut(X + I, Y - 2 * I, Veta);
  Image1.Canvas.Font.Color := clBlue;
  Image1.Canvas.TextOut(X, Y, Veta);
end;


21. Trojuholníková pyramída

Nakreslite n-poschodovú trojuholníkovú pyramídu pomocou MoveTo a LineTo. Veľkosť strany trojuholníka je konštanta A.

{{{3}}}

Všimnite si, že toto riešenie kreslí pyramídu jedným ťahom. Keď odkomentujete zakomentované časti, spomalí sa kreslenie tak, že bude vidieť jeho priebeh (príkazmi Sleep(30); Form1.Repaint;).

const
  N = 10;
  A = 50;
  Vyska = Round(A * 0.877);
var
  I, J, X, Y, XX: Integer;
begin
  X := 50;
  Y := Image1.Height - 30;
  Image1.Canvas.MoveTo(X, Y);
  for I := N downto 1 do
  begin
    XX := X;
    for J := 1 to I do
    begin
      Image1.Canvas.LineTo(XX + A div 2, Y - Vyska);
      // Sleep(30); Form1.Repaint;
      XX := XX + A;
      Image1.Canvas.LineTo(XX, Y);
      // Sleep(30); Form1.Repaint;
    end;
    Image1.Canvas.LineTo(X, Y);
    // Sleep(30); Form1.Repaint;
    Y := Y - Vyska;
    X := X + A div 2;
  end;
end;


22. Vyfarbená trojuholníková pyramída

Nakreslite N-poschodovú farebnú trojuholníkovú pyramídu. Farebné trojuholníky kreslite pomocou Polygon. Veľkosť strany trojuholníka je konštanta A.

{{{3}}}
const
  N = 10;
  A = 50;
  Vyska = Round(A * 0.877);
var
  I, J, X, Y, XX: Integer;
begin
  X := 50;
  Y := Image1.Height - 30;
  Image1.Canvas.Brush.Color := clYellow;
  Image1.Canvas.Polygon([
           Point(X, Y),
           Point(X + N * A div 2, Y - N * Vyska),
           Point(X + N * A, Y)]);
  Image1.Canvas.Brush.Color := clBlue;
  for I := N downto 1 do
  begin
    XX := X;
    for J := 1 to I do 
    begin
      Image1.Canvas.Polygon([
           Point(XX, Y),
           Point(XX + A div 2, Y - Vyska),
           Point(XX + A, Y)]);
      XX := XX + A;
    end;
    Y := Y - Vyska;
    X := X + A div 2;
  end;
end;


23. Funkcia sínus

Nakreslite priebeh funkcie sínus.

{{{3}}}
var
  X: Integer;
begin
  Image1.Canvas.MoveTo(0, 100);
  for X := 1 to Image1.Width - 1 do
    Image1.Canvas.LineTo(X, Round(100 - 80 * Sin(X * Pi / 180)));
end;
24. Kreslenie kruhu

Pomocou funkcií Sin a Cos a príkazov MoveTo a LineTo nakreslite kružnicu.

  • Všimnite si, že druhá verzia riešenia kreslí 72 uholník namiesto 360 uholníka z prvého riešenia.
{{{3}}}
var
  X, Y, R, Uhol: Integer;
begin
  X := 100;
  Y := 100;
  R := 80;
  Image1.Canvas.MoveTo(X + R, Y);
  for Uhol := 1 to 360 do
    Image1.Canvas.LineTo(
             X + Round(R * Cos(Uhol * Pi / 180)),
             Y - Round(R * Sin(Uhol * Pi / 180)));
end;
var
  X, Y, R, Uhol, I: Integer;
begin
  X := 100;
  Y := 100;
  R := 80;
  Uhol := 0;
  Image1.Canvas.MoveTo(X + R, Y);
  for I := 1 to 72 do
  begin
    Inc(Uhol, 5);
    Image1.Canvas.LineTo(
             X + Round(R * Cos(Uhol * Pi / 180)),
             Y - Round(R * Sin(Uhol * Pi / 180)));
   end;
end;


25. Kreslenie lúčov

Využite riešenie predchádzajúcej úlohy a nakreslite tieto dva obrázky:

{{{3}}}
{{{3}}}
  • V 2. riešení sme namiesto dvojice príkazov MoveTo a LineTo použili iba jeden príkaz Line.


var
  X, Y, R, Uhol, I: Integer;
begin
  X := 100;
  Y := 100;
  R := 80;
  Uhol := 0;
  for I := 1 to 72 do
  begin
    Inc(Uhol, 5);
    Image1.Canvas.MoveTo(X, Y);
    Image1.Canvas.LineTo(
             X + Round(R * Cos(Uhol * Pi / 180)),
             Y - Round(R * Sin(Uhol * Pi / 180)));
   end;
end;
var
  X, Y, Uhol, I: Integer;
begin
  X := 100;
  Y := 100;
  Uhol := 0;
  for I := 1 to 72 do
  begin
    Inc(Uhol, 5);
    Image1.Canvas.Line(X, Y,
             X + Round(2 * I * Cos(Uhol * Pi / 180)),
             Y - Round(2 * I * Sin(Uhol * Pi / 180)));
  end;
end;


26. Farebné sústredné kruhy

Nakreslite 10 sústredných kruhov s polomermi 10, 20, 30, ... 100. Každý kruh bude vyfarbený náhodnou farbou.

{{{3}}}
var
  I, R: Integer;
begin
  for I := 10 downto 1 do
  begin
    R := 11 * I;
    Image1.Canvas.Brush.Color := Random(256 * 256 * 256);
    Image1.Canvas.Ellipse(120 - R, 120 - R, 120 + R, 120 + R);
  end;
end;


27. Náhodné machule

Vykreslite na obrazovku 100 kruhov náhodnej farby, pričom obvod aj výplň majú rovnakej farby. Kruhy majú polomery náhodnej veľkosti od 1 do 50.

  • Kruhy tu kreslíme ako veľmi hrubé úsečky dĺžky 1 (namiesto príkazu Ellipse).
  • Namiesto dvojice príkazov MoveTo a LineTo sme použili jeden príkaz Line.
{{{3}}}
var
  X, Y, R, I: Integer;
begin
  for I := 1 to 100 do
  begin
    Image1.Canvas.Pen.Color := Random(256 * 256 * 256);
    R := Random(50) + 1;
    Image1.Canvas.Pen.Width := 2 * R;
    X := Random(Image1.Width - 2 * R) + R;
    Y := Random(Image1.Height - 2 * R) + R;
    Image1.Canvas.Line(X, Y, X + 1, Y);
  end;
end;