P * P * D

Programming Practices in Delphi

Programozási Példák Delphi-ben

Power Programming with Delphi

 

Görbe Mihály

2009-

 

(Programozás kezdőknek és középhaladóknak)

 

Ezen a Web-helyen a Delphi7 programozásával foglalkozom, pontosabban ennek a fejlesztői környezetnek a segítségével próbálok megoldani néhány feladatot, illetve problémát. A Web-hely nem abszolút kezdőknek készül. Az alapok (a VCL elemeinek) bemutatására mindössze egyetlen projektet szánok. Ezt követően különböző problémák egyfajta számítógépes megoldását kívánom ismertetni, a használt programozási környezet lehetőséginek minél szélesebb körű használatával és megismertetésével.

 

Amire a szükség lehet: egy programozási nyelv (célszerűen a Pascal nyelv) alapos ismerete, a legfontosabb algoritmusok ismerete, Objektum Orientált Programozási alapismeretek valamint Windows-os fejlesztői környezetekben való jártasság. Mivel lesznek HTML, Word, Excel és Access kapcsolatok, ezért a Microsof Office alkalmazások felhasználói ismerete, esetleg ezek VB programozásában való eligazodás szintén hasznos lehet az olvasó számára.

 

A Delphi lehetőségeinek csak töredékét, de megítélésem szerint jól és gyakran használható részét fogom ismertetni. Tehát nem felhasználói kézikönyvet szeretnék írni. (Erre sem időm, sem energiám nem lenne, egyébként számos könyv részletesen foglalkozik a nyelv lehetőségeinek ismertetésével magyar nyelven is). A hangsúlyt az adatkezeléssel kapcsolatos problémákra, a nagyméretű programok kezelésére, különböző adminisztrációs feladatok ismertetésére kívánom helyezni, de lesznek grafikus és Web-es alkalmazások is.

 

Az említett előzetes ismeretek elsajátításához számos könyv, Web-hely adhat segítséget. Én a Pascal nyelvvel való ismerkedéshez ajánlom a jelen Web-hely, Turbo Pascal menüpontjában lévő leírásokat, illetve programokat. Akkor kezdjük az alapokkal:

 

 

Alapok

 

Az ilyen oldalak Hello World típusú programokkal szoktak kezdődni. Lehet, hogy a kiírás valami más, a lényeg az, hogy egy nagyon egyszerű project legyen, az abszolút kezdők számára.

 

Én gyakorlatilag egyetlen projektbe, egyetlen lapra (Form-ra) helyeztem el a legfontosabb vizuális vezérlőket, amelyekre kattintva egy egyszerű szöveges ablakban jelennek meg a vezérlővel kapcsolatos legfontosabb tulajdonságok, létrehozásának körülményei, alkalmazási lehetőségei. A vezérlőket nagyjából az eszköztáron való megjelenés sorrendjében helyeztem el a Form-on, oszlop-folytonosan. Lesz majd természetesen olyan program is, amely az itt megjelenített tulajdonságoknál sokkal többet alkalmaz, ilyen lesz például a StrigGrid elem. Aki a vázolt ismeretekkel tisztában van, az ezt a fejezetet nyugodtan kihagyhatja.

 

Egyetlen dologra viszont felhívnám a figyelmet. Ennek a lapnak a végén található a Windows RegEdit olyan beállításának a leírása, mely XP alatt a nyitó szögletes zárójel ([) írását az IDE-ben lehetővé teszi.

 

A továbbiakban feltételezem, hogy az IDE (Itegrated Development Environment = Integrált Fejlesztői Környezet) szerkezetével tisztában van az olvasó. Aki hasonló környezetben programozott már, annak valószínű sok minden egyértelmű, világos.

 

Azért a programrendszer indítását és a környezet alaphelyzetét néhány ScreenShot-tal bemutatnám. A környezet indítása a C:\Program Files\Borland\Delphi7\Delphi32.exe állomány futtatásával történik (természetesen telepítéstől függően - ez az alapértelmezett hely). Ikonja, melyet ShortCut-ként az asztalon elhelyezett parancsikonban is láthatunk:

 

 

A rendszer betöltési ideje (mely gépünk teljesítményétől függően 5-10s) alatt a következő képet látjuk:

 

 

Az IDE a következő képernyővel jelentkezik be:

 

 

Az IDE négy különálló, de természetesen együttműködő ablakból áll.

 

Az első, a képernyő felső részén van, és tartalmazza a címsort, a menüsort, a fontosabb rendszerszintű parancsok ikonjait az eszköztár bal oldalán, majd egy TabControl elemen található a Komponenspaletta, melyből sok fül nem látható, de a jobb oldalon lévő vezérlőelem segítségével, görgetéssel fókuszba hozható:

 

 

A Delphi3-hoz képest hasznos újdonság az Object TreeView ablak, mellyel a Form-on található (tehát már használatba vett) elemeket gyorsan, nevükre való kattintással kiválaszthatjuk (melyen most csak a Form1-et látjuk):

 

 

A harmadik a vizuális elemek (VCL) tulajdonságait és működését beállító Object Inspector, mely egy, két füllel rendelkező TabControl, a baloldali a Properties (Tulajdonságok), jobboldali az Events (Esemény-kezelés). A Properties nézet:

 

 

Valamint az Events nézet:

 

 

A negyedik ablak az igazi szerkesztőablak, és rögtön egy alapértelmezett Form1-el jelenik meg. Lényegében egy programváz van mögötte, mely programot futtatni is lehet, csak épp egy üres Windows-os ablakon kívül semmit nem látunk. Az viszont igaz, hogy működik, méretezhető, áthelyezhető és bezárható, de semmi több. A VCL elemek elhelyezését egy pontrács segíti, alapértelmezésben az elemek ezekhez a pontokhoz igazítottan jelennek meg:

 

 

A VCL elemek elhelyezésének a módja: megkeressük az elemet a Komponenspalettán, egérrel kattintunk rajta (alapszíne világos-szürkére változik, benyomott állapotúnak látszik), majd kattintunk a Form azon pontján, ahová a VCL elem bal felső csúcsát gondoljuk elhelyezni. Az Object Inspector ekkor a neki megfelelő, alapértelmezett értékekre vált át. A többi, már a Form-on elhelyezett VCL elemre való kattintással válnak láthatóvá, az így kiválasztott elem tulajdonságai. Üres területen kattintva, a Form1 tulajdonságai láthatók.

 

A program szerkesztési-időben kétféle megjelenésben kezelhető. A Delphi egy 4GL típusú fejlesztői környezet, azaz a programírás egyik része a vizuális elemek elhelyezését, megjelenési tulajdonságainak (Properties) beállítását jelenti, a másik része a működését, az üzenetek kezelésének leírását, a valódi kódalkotást követeli meg. Attól, hogy egy VCL elem szépen megjelent, még nem biztos, hogy hasznosan működik is. A VCL elemek elhelyezésére szolgál az előző felület.

 

A kódablakra való átváltás a képernyőn Toggle Form/Unit (F12) parancsikonnal, vagy az F12 funkcióbillentyűvel lehetséges (és természetesen vissza is). Az átváltás után a kód láthatóvá válik, melyet fejlesztgethetünk, de teljesen szabadkezet nem kapunk. Majd az egyes programoknál ismertetem a megengedett és kötelező programozási lépéseket.

 

Pascal programozók számára rögtön feltűnhet, hogy nem Program, hanem Unit ablak jelenik meg átváltás után. A 4GL típusú fejlesztői környezetek sajátossága, hogy Project-ekben dolgozik. A Project-hez tartozó állományokat célszerű egyetlen mappában tárolni. Ha ezzel nem foglalkozunk (nem mentünk részeket direkt más mappába), akkor az IDE biztosan mindent abban a mappában hoz létre, melyet a mentéskor megadunk. Legyen például a Project-ünk neve: Minta. Hozzunk létre valamely meghajtón és környezetben egy ilyen nevű mappát (azaz Minta-t, mely név rövid és egyébként kifejezi a Project-ünk tartalmát).

 

 

Ha egyszerre csak kevés változóval és Unit-al dolgozunk, akkor a Code-lap baloldalán lévő ablakot bezárhatjuk, így több hely marad a kód megjelenítésére:

 

 

Mielőtt mentenénk, nézzük meg, hogy a Project-hez milyen szerkeszthető állományok tartoznak. A képernyőn, a harmadik eszköztároló sorban, az első helyen találjuk a parancsikont, melynek neve és funkciója: View Unit (Ctrl+F12). Erre kattintva a Unit-ok listáját láthatjuk:

 

 

Válasszuk a listából a Project1-et és OK. Most már programlistát kapunk, de nem Program1 a neve, hanem Project1. Pascal programozók nagyon jól tudják, hogy a Unit-ok belső és operációs rendszerbeli nevének meg kell egyezni, ez a Delphi-ben is így van. Mentéskor az IDE - a programoknál és a unitoknál egyaránt - az alapértelmezett belső nevet, a mentési névre kicseréli. Kattintás után a következőt láthatjuk:

 

 

Aki a Pascal környezetben Turbo Vision-ban programozott, vagy a szakirodalom által a Pascalban is ajánlott módon OOP alapú rendszereket fejlesztett, az ezzel a listával elégedett lehet. A főprogram tartalmaz Init-et, Create-et és Run-t. Talán a Done hiányzik (?), de azért, mert az ehhez tartozó tevékenységeket a Windows-os környezet, a program leállításakor automatikusan végrehajtja (ablakok zárása, szemétgyűjtés, Heap felszabadítás, egyéb változók és paraméterek nullázása, alapértelmezések visszaállítása).

 

Tegyünk még meg annyit, hogy Project-ünket a létrehozott Minta mappába mentsük le, majd futtassuk. Mentéshez a Save All (Shift+Ctrl+S) parancsikont válasszuk. A felajánlott Bin könyvtárat ne fogadjuk el, válasszuk helyette az általunk létrehozott Minta mappát. Változtassuk meg az alapértelmezett Unit1 nevet UMinta-ra, majd a Mentés következik, ekkor a Project1 jelenik meg a File név mezőben, melyet PMinta-ra írjunk át, majd újra Mentés. Nézzük meg, milyen állományok jöttek létre a Minta mappában:

 

 

Ezután futtassuk a programot a Run (F9) parancsgombbal. A megígért üres ablakot látjuk, az említett tulajdonságokkal:

 

 

Tegyük még meg azt, hogy megnézzük, hogyan változott a Minta mappánk tartalma:

 

 

Mint látható két állománnyal bővült: a PMinta.exe futtatható állománnyal, valamint az UMinta.dcu-val, ami nem más, mint az UMinta.pas forrás állománynak a lefordított változata. A további fejlesztések során már a Delphi-t a PMinta.dpr-ről, azaz Delhi project állományról célszerű indítani, így a fejlesztés közben nem kell a mentések célhelyével foglalkozni, mert biztosan abba a mappába menti, amelyikben a project állomány is volt. (Természetesen egyéb helyet is választhatunk, ekkor a PMinta.pas állomány listájából a célhely a későbbiekben kiolvasható.) A többi állomány jelentését, hasznát majd a későbbiekben részletezzük.

 

Most pedig lássuk a VCL (Visual Control Library) elemek bemutatását szolgáló program először szerkesztési, majd futási képét.

 

 

 

 

Minden elem leírása, beállítása, használati lehetősége a Project-ből megismerhető. A tulajdonságok felsorolásából kihagytam azokat, amely a VCL elemek szinte mindegyikében szerepel. Ezek itt írom le:

 

Left: az elem távolsága az őt tartalmazó konténer bal szélétől pixelben.

Top: az elem távolsága az őt tartalmazó konténer tetejétől pixelben.

Width: az elem szélessége pixelben.

Height: az elem magassága pixelben.

Align: az elem igazítása az őt tartalmazó konténer széleihez és a többi VCL elemhez viszonyítva.

Alignment: az elem tartalmának igazítása az elemen belül.

Color: az elem háttérszíne.

Font: amennyiben a VCL elemben karakterek jelennek meg, akkor a karakterek tulajdonságait egy párbeszédablakban állíthatjuk be:

 

 

Enabled: az elem kezelhetőségének (használhatóságának) beállítása, True vagy False.

Hint: alkalmas egy egysoros szöveg tárolására, mely az egérkurzornak a VCL elem fölé helyezésére megjelenik, ha engedélyezzük.

ShowHint: a Hint szöveg megjelenésének engedélyezése, értéke True vagy False.

Name: az elem azonosítója, a szokásos változónév-adási megkötésekkel.

PopupMenu: amennyiben a VCL elemen felbukkanó menüt szeretnénk az egér jobb gombjának kattintásával megjeleníteni, akkor ennek a tulajdonságnak az értéke, a hívni kívánt PopupMenu neve.

TabOrder: az elem elhelyezési sorrendje, mely átrendezhető (Form-on helyi menü egér jobb gomb segítségével, majd TabOrder menüpont.). A Tab billentyű e szerint hozza fókuszba az elemeket a Form-on, futási időben.

Visible: az elem láthatóságának beállítása, True vagy False.

 

A tulajdonságokat az Object Inspector/Properties ablakban láthatjuk. Az értékek beállításának lehetőségei:

- alapértelmezett,

- egy legördülő ComboBox listából választhatunk,

- a VCL elem Form-on történő elhelyezésével beállítódik

- vagy a tulajdonság egy Edit mezőben beírható.

 

A VCL elemek helyének és méretének finom (pixel szintű) beállítása: a hely beállítását Ctrl+[nyilakat tartalmazó billentyű], a méret beállítását Shift+[nyilakat tartalmazó billentyű] segítségével végezhetjük el.

 

Így az alapok megismerésének vége felé érdemes megemlíteni a nyelv azonosítóinak használatával kapcsolatban néhány tanácsot.

 

Az első az, hogy Delphi (ugyanúgy mint a Pascal sem) nem CaseSensitiv. Teljesen mindegy, hogy az azonosítókban kis vagy nagybetűkkel írjuk le a szavakat, a nyelv ugyanannak az azonosítónak veszi.

 

Nagyon gyakran előfordul, és én is előszeretettel használom az aláhúzás karakter helyett a szóösszetételeknél, a szavak első betűjének nagybetűs alakban való írását. Ez az azonosító jelentésének megértését, megjegyzését szolgálja (beszédes azonosítók), pl.: ClearScreen, SzinesNyomtato, BadCase, KovetkezoLap, stb. Az azonosítók programjaimban többnyire magyar szavakból származnak (természetesen magyar ékezetek nélkül írva), de közismertebbnek gondolt angol szavak vagy rövidítések is gyakran előfordulnak közöttük.

 

A következő, ami szintén az azonosítók alapján történő jobb kódmegértést, kódolvasást szolgálja a konvenciók. Míg az előbb leírtakban, előfordulnak kötelezően betartandó dolgok (pl.: egyetlen szó lehet, nem kezdődhet számmal, nem tartalmazhat bizonyos karaktereket), addig a konvenciókhoz egyszerűen csak célszerű ragaszkodni. Hogy mi az oka? Nincs nehezebben érthető dolog, mint az általunk több évvel ezelőtt szerkesztett kód, ha időközben teljesen mással foglalkoztunk. Ráadásul, ha sokan használják, akkor az általad írt kódot mások is könnyebben megérthetik, akár programbeli megjegyzések nélkül is. (Természetesen egy jól kommentezett kódlista mindenki számára aranyat ér, könnyen megérthető, visszafejthető, módosítható.) A konvenciók egy szűk köre a teljes azonosítóra vonatkozik, sok esetben csak az első, vagy az első két karakter következetes alkalmazását várják el tőlünk. Nézzünk mindhárom esetre példákat.

 

Teljes szavak, azonosítók: Init, Run, Done, Show, Hide az OOP nyelvekben standardnak mondhatók, másra ne használjuk. A Set és Get szókezdés az objektum mezőinek beállítását illetve lekérdezését jelöli (természetesen kiegészítve a mező nevével). Hasonlóan foglaltaknak vehetjük a Create, Open Close, Clear vagy UpDate Szavakat is. Az X, Y és Z általában koordinátarendszerekben használatosak, ezért én is legtöbbször ilyen értelemben használom. Az A, B, C, D, E, F, G és H betűket, mint általános azonosítókat kezelem, ha lényegük leírására több karakter teljesen fölösleges. Az I, J, K, L, M és N betűk szinte mindig ciklusváltozók, vagy egyszerű számlálások értékeit tárolják. Az O, P, Q, R, S és T gyakran ideiglenes (puffer) változók, míg az U, V és W-t egyéb munkaváltozóknak fogom használni.

 

Első betűre vonatkozó konvenciók: P: Project vagy Pointer, U: Unit, T: Type vagy tömb, R: Record, F: File vagy mező, I: Init (alapértelmezett, kezdő) érték.

 

Első két betűre vonatkozó konvenciók: st: String, fm: Form, bb: BitBtn, bt: Button, ca: Calendar, cb: CheckBox, cd: CheckListBox, cg: ClorGrid, cl: ComboBox, co: ColorBox, cr: CoolBar, dg: DrawGrid, dt: DateTimePicker, ed: Edit, gb: GroupBox, il: ImageList, im: Image, lb: Label, ld: ListBox, le: LabeledEdit, mc: MonthCalendar, me: MaskEdit, mi: MenuItem, mm: Memo, mn: MainMenu, pb: ProgressBar, pc: PageControl, pm: PopupMenu, pn: Panel, pp: PopupMenuItem, rb: RadioButton, re: RichEdit, rg: RadioGroup, sb: ScrollBar, se: SpinEdit, sg: StringGrid, sl: SrollBox, sp: Shape, st: StatusBar, tb: TrackBar, tc: TabControl, tl: ToolBar, ts: TabSheet, ud: UpDown, vl: ValueListEditor. (A kétbetűs előtagok kisbetűvel írandók, melyek nem mindig a szóösszetétel szerinti rövidítések, de ha tehetjük, azért használjuk ezeket. Én mindenesetre igyekszem.)

 

Végül következzék a bevezetőben ígért szögletes zárójeles probléma megoldása. Telepítés után, a Delphi7 AltGr+F-re nem ír szögletes zárójelet, ehhez a rendszer egy olyan HotKey-t rendel, amit én például nem szoktam használni, tömbindexet viszont annál inkább. Tehát a megoldás: a Windows/Start menü/Futtatás . . . ablakába írjuk be: regedit, majd OK:

 

 

A Rendszerleíróadatbázis-szerkesztőben keressük meg a Sajátgép/HKEY_CURRENT_USER/Software/Borland/Delphi/7.0/Editor/Options szakaszt:

 

 

A megnyitás után, a szerkesztő területen csak egyetlen sor található. Ezen a területen egér jobb fülével kattintva, a lokális menüből az Új/Karakterláncot menüpontot válasszuk. Az új sor nevét írjuk át: NoCtrlAltKeys-re, majd nyomjunk Entert. Ezek után a szerkesztőablakban megjelenő soron kettőt kattintva a következő ablak jelenik meg, melyben az Érték mezőnek adjunk 1-et:

 

 

Ezzel az átállítást befejeztük, az IDE írni fog nyitó szögletes zárójelet ([-et).

 

A VCL elemeket bemutató program listája (a tulajdonságokat megjelenítő Memo mező lemezes .txt állományokból olvassa be a tartalmakat, melyeket a listában rem-ekben láthatunk):

 

 

//**************************************
// A Vizuális Komponens Könyvtár (VCL) *
//          elemeit bemutató           *
//       demonstrációs program         *
//                                     *
//  Készítette: Görbe Mihály (GM-Soft) *
//                2009                 *
//**************************************

unit UVCL;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, 

  Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls, CheckLst, Grids, Mask,
  Calendar, Spin, ColorGrd, ValEdit, Menus;

type
  TfmVCL = class(TForm)
    lbVCL: TLabel;
    edVCL: TEdit;
    mmVCl: TMemo;
    btVCL: TButton;
    cbVCL: TCheckBox;
    rbVCL: TRadioButton;
    ldVCL: TListBox;
    clVCLClose: TComboBox;
    clVCLOpen: TComboBox;
    sbVCL: TScrollBar;
    lbVCLSB: TLabel;
    btKilep: TButton;
    lbGorgeto: TLabel;
    gbVCL: TGroupBox;
    rgVCL: TRadioGroup;
    pnVCL: TPanel;
    bbVCL: TBitBtn;
    meVCL: TMaskEdit;
    sgVCL: TStringGrid;
    dgVCL: TDrawGrid;
    imVCL: TImage;
    spVCL: TShape;
    cdVCL: TCheckListBox;
    leVCL: TLabeledEdit;
    coVCL: TColorBox;
    tcVCL: TTabControl;
    pcVCL: TPageControl;
    tbVCL: TTrackBar;
    pbVCL: TProgressBar;
    udVCL: TUpDown;
    edUDVCL: TEdit;
    dtVCL: TDateTimePicker;
    mcVCL: TMonthCalendar;
    cgVCL: TColorGrid;
    seVCL: TSpinEdit;
    caVCL: TCalendar;
    mmVCLDescript: TMemo;
    ts1: TTabSheet;
    ts2: TTabSheet;
    ts3: TTabSheet;
    ts4: TTabSheet;
    mm3: TMemo;
    mm1: TMemo;
    ed2: TEdit;
    lb4: TLabel;
    pmMenu: TPopupMenu;
    pp1: TMenuItem;
    pp2: TMenuItem;
    pp3: TMenuItem;
    sgInTabCont: TStringGrid;
    Procedure MemoView(X,Y, W,H: Word; OSVCL: String);
    procedure lbVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure sbVCLChange(Sender: TObject);
    procedure clVCLOpenKeyPress(Sender: TObject; var Key: Char);
    procedure btKilepClick(Sender: TObject);
    procedure edVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure mmVClMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure btVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure cbVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure rbVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ldVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure clVCLCloseClick(Sender: TObject);
    procedure clVCLOpenClick(Sender: TObject);
    procedure gbVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure rgVCLClick(Sender: TObject);
    procedure pnVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure bbVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure sgVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure dgVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure imVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure spVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure meVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure cdVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure leVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure coVCLChange(Sender: TObject);
    procedure tcVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure pcVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure tbVCLChange(Sender: TObject);
    procedure pbVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure udVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure seVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure cgVCLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure caVCLChange(Sender: TObject);
    procedure dtVCLChange(Sender: TObject);
    procedure mcVCLClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmVCL: TfmVCL;
  FVCL: Text;

implementation

{$R *.dfm}

Procedure TfmVCL.MemoView(X,Y, W,H: Word; OSVCL: String);
Begin
  With mmVCLDescript Do
  Begin
    Top:= Y; Left:= X; Width:= W; Height:= H; Visible:= True;
    If FileExists(OSVCL) Then mmVCLDescript.Lines.LoadFromFile(OSVCL);
  End;
End;

procedure TfmVCL.btKilepClick(Sender: TObject);
begin
  Close;
end;

procedure TfmVCL.clVCLOpenKeyPress(Sender: TObject; var Key: Char);
begin
  With clVCLOpen do If Key=#13 Then Items.Add(Text);
end;

procedure TfmVCL.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With mmVCLDescript Do
  Begin
    Visible:= Not Visible;
    If Visible Then MemoView(X,Y,200,150,'Form.txt');

    //Form: TForm, létrehozása: Kattintás a New Form parancsgombon.
    //Az alkalmazás ablaka, a VCL elemek elsődleges container objektuma.
    //MDI (Multiple Document Interface) alkalmazás esetén a FormStyle
    //tulajdonságot szülő ablaknál fsMDIForm-ra, gyermek ablaknál fsMDIChild-re
    //kell állítani. Alapértermezett megjelenési méretről WindowsState
    //tulajdonsággal lehet maximális, illetve minimális méretre állítani.
    //Az ablak vezérlő ikonjait a BorderIcons tulajdonsággal ki-be kapcsolhatjuk.
    //A BorderStyle tulajdonsággal a megjelenítő keret tulajdonságait
    //határozhatjuk meg, vagy akár keret nélküli megjelenést (full screen-t) is
    //választhatunk.
    //A PopupMenu tulajdonságát a megfelelő PopupMenu-re kell beállítani.

  End;
end;

procedure TfmVCL.lbVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'Label.txt');

  //Label: TLabel, Standard paletta.
  //Címke, legtöbbször változatlan tartalmú, szöveges megjelenítő elem.
  //A megjelenítendő szöveget a Caption tulajdonság tartalmazza,
  //mely szerkesztési és futási időben is megadható.
  //A helyfoglalását automatikusan a szöveg beírásával állítja.
  //A területét kijelölés után húzással megváltoztathatjuk.
  //Célszerű olyan méretet beállítani, amikor a szöveg teljesen látható.
  //Ha a szöveg a teljes lefoglalt területet nem tölti be, akkor igazitást
  //állíthatunk be az Aligment és a Layout tulajdonságokkal. Ha többsoros
  //címkét szeretnénk, akkor a WordWrap tulajdonságot állítsuk True-ra.

end;

procedure TfmVCL.sbVCLChange(Sender: TObject);
begin
  lbVCLSB.Caption:= IntToStr(sbVCL.Position);
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'ScrollBar.txt');

  //ScrollBar: TScrollBar, Standard paletta.
  //Görgetősáv. Alkalmas két határérték közötti értéknek egérrel vagy
  //billentyüzetről a kurzorvezérlőkkel történő beállítására.

end;

procedure TfmVCL.edVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'Edit.txt');

  //Edit: TEdit, Standard paletta.
  //Egysoros szerkeszthető beviteli mező. A beviteli mező tartalmát a Text
  //tulajdonságban lehet megadni szerkesztési időben, futási időben pedig
  //belső utasítással vagy billentyűzetről. Fókuszba kerüléskor alapértelmezés
  //szerint a mező tartalma kijelölt lesz, azaz írásra felülíródik.
  //Ezt állíthatjuk az AutoSelect tulajdonsággal. A MaxLength tulajdonsággal
  //a billentyűzetről beolvasható karakterek maximális számát adhatjuk meg.
  //Alapértelmezésben ez 0, ami azt jelenti, hogy nincs korlátozva a bevihető
  //szöveg hossza (2 GB). Ha számot akarunk benne tárolni és onnan számként is
  //szeretnénk kiolvasni azt, akkor IntToStr vagy FloatToStr konverziós
  //függvényt, kiolvasáskor pedig - az ellenőrzés miatt - Val eljárást kell
  //alkalmazni.

end;

procedure TfmVCL.mmVClMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'Memo.txt');

  //Memo: TMemo, Standard paletta.
  //Többsoros szövegszerkeztő. A tartalmat 1 indexel kezdődő Strig-ekben
  //tárolja, mely a tulajdonságok között a Lines sorban található.
  //Tartalmát szerkesztési időben is feltölthetjük. Ha az ablak a sorok
  //megjelenítésére nem elég nagy akkor a sorvége jel mellett a szövegeket
  //a Space helyeken tördeli. Ha nem szeretnénk csak a sorvégek szerinti
  //tördelést, illetve látni szeretnénk, hogy a szöveg több sorból áll
  //mint amennyi látható belőle, akkor a ScrollBars tulajdonságban
  //beállíthatjuk, hogy mely scrollozó sávokat akarunk megjeleníteni.
  //A WordWrap tulajdonság állításával a vízszintes tördelés letiltható,
  //alapértelmezésben engedélyezett (True). A Memo futási időben is feltölthető.
  //Ezt megtehetjük kódszerkesztőben felajánlott Lines.LoadFromFile()
  //segítségével, ahol paraméterében meg kell adni a szöveges lemezes állomány
  //teljes nevét. Ennek hatására az elem Create-je a beolvasást végrehajtja.
  //A másik lehetőség, hogy billentyűzetről viszünk be karaktereket,
  //vagy javítjuk a tartalmat. Ekkor a Form zárásakor, vagy egyéb parancs
  //hatására a tartalmat ki kell menteni, szintén a kódszerkesztőben
  //felajánlott Lines.SaveToFile() segítségével, ahol paraméterként meg kell
  //adni a szöveges lemezes állomány teljes nevét. Ha azt szeretnénk,
  //hogy a Memo mező csak olvasható legyen, akkor a ReadOnly Tulajdonságát
  //állítsuk True-ra.

end;

procedure TfmVCL.btVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'Button.txt');

  //Button: TButton, Standard paletta.
  //Parancsgomb. Felíratát a Caption tulajdonság tartalmazza,
  //mely szerkesztési és futási időben is átírható. A Default tulajdonság
  //True értékre való állításával elérhetjük, hogy a billentyűzetről érkező,
  //egyéb objektummal le nem kezelt üzenetet ez az elem kapja meg.
  //Praktikusan: Enter hatása olyan, mintha az egérrel a parancsgombra
  //kattintottunk volna, és ezzel kiváltottuk a hozzá rendelt eseményt,
  //például egy alkalmazás bezárását. A ModalResult tulajdonsággal a
  //fókuszba került parancsgombhoz előre definiált parancsokat rendelhetünk.
  //A Default=True parancsgomb keretben jelenik meg a Form-on, de ha egyéb
  //VCL elemre kattintunk kikerül a fókuszból, elveszíti Default tulajdonságát.

end;

procedure TfmVCL.cbVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'CheckBox.txt');

  //CheckBox: TCheckBox, Standard paletta.
  //Jelölőnégyzet. Kétállapotú, vagy be van jelölve, vagy nincs.
  //Ezt a Checked tulajdonságban találjuk, mely szerkesztési és futási
  //időben is változtatható, futási időben lekérdezhető. A jelölőnégyzet
  //programbeli funkciójára a Caption tulajdonság szövege utal.
  //Ezt a szöveget a WordWrap tulajdonság True-ra való állításával
  //többsorossá tehetjük. A State tulajdonság segítségével lényegében
  //három állapotúvá változtathatjuk, ugyanis a bejelölt állapot szürkítését
  //a cbGrayed paraméter biztosítja. A jelölőnégyzeten való kattintással
  //a cbGrayed állapot egyszerűen nem hozható létre, de természetesen
  //egyéb esemény, vagy a kattintás esemény feltételessé tételével
  //ezt a beállítást is elérhetjük.

end;

procedure TfmVCL.rbVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'RadioButton.txt');

  //RadioButton: TRadioButton, Standard paletta.
  //Választógomb. Két állapotú gomb, ki- és bekapcsolt állapota van.
  //Programbeli szerepét a Caption tulajdonsággal írhatjuk le, mely szöveg
  //a WordWrap tulajdonság True-ra állításával többsorossá tehető.
  //A választógomb bekapcsolt állapotát a Checked tulajdonság tartalmazza,
  //melyet szerkesztési és futási időben is beállíthatunk, egérrel való
  //kattintással válthatunk. Általában több választógomb együttműködése
  //kivánatos, melyet RadioGroup-ban helyezünk el, így a gombok közül
  //egyik sem (-1), vagy legfeljebb egy lehet kiválasztva.

end;

procedure TfmVCL.ldVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'ListBox.txt');

  //ListBox: TListBox, Standard paletta.
  //Stringlisták megjelenítésére szolgál. A Stringeket egy 0 indexel kezdődő
  //tömbben tárolja (Items). A kiválasztott elem az ItemIndex-ű elemben van.
  //Ha nincs kiválasztva elem, akkor az ItemIndex -1. A lista oszlopszám
  // szerint megjelenését a Columns tulajdonság tartalmazza. A megjelenítő
  //ablakot és a megjelenített elemeket, illetve oszlopok számát össze kell
  //hangolni. Ha ezt nem tesszük, akkor vizszintes ScrollBar jelenik meg.
  //Ha a lista függőlegesen nem fér a megjelítő ablakba, akkor is ScollBar
  //jelenik meg, melynek szélességével számolni kell. A listának fontos
  //tulajtonsága a Sorted, azaz a rendezettség (true: rendezett). Ha rendezetté
  //tettük, akkor az újabb elemeket már az Add metódus sorrend szerint helyezi
  //be, ha futási időben a rendezettségét visszavontuk, akkor az újabb elemek
  //hozzáadása a lista végére történik. Egy elem létezését IndexOf<>-1 reláció
  //értéke adja vissza.

end;

procedure TfmVCL.clVCLCloseClick(Sender: TObject);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'ComboBoxC.txt');

  //ComboBox: TComboBox Standard paletta.
  //Kombinált lista. Zárt, elemeit nem változtathatod a beviteli
  //mezője segítségével. Az elemeket String tömbben tárolja. Tulajdonságai
  //a listadobozzal egyébként megegyeznek. Ha egy billentyűt megnyomunk,
  //akkor a neki megfelelő első karakterű elemre ugrik.

end;

procedure TfmVCL.clVCLOpenClick(Sender: TObject);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'ComboBoxO.txt');

  //ComboBox: TComboBox, Standard paletta.
  //Kombinált lista. Beviteli mezőjébe beírt szöveget (Enter megnyomására)
  //a lista végéhez adja, rendezett esetén a helyére beszúrja.
  //Tulajdonságai a listadobozzal megegyeznek. Az Enter kezelését az
  //Object Inspector Events oszlopának OnKeyPress sora segítségével
  //be kell írni a kódlistába.

end;

procedure TfmVCL.gbVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'GroupBox.txt');

  //GroupBox: TGroupBox, Standard paletta.
  //VCL elemek tárolására szolgáló container. Az elemek csak a téglalap
  //alakú területen belül látszanak.

end;

procedure TfmVCL.rgVCLClick(Sender: TObject);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'RadioGroup.txt');

  //RadioGroup: TRadioGroup, Standard paletta.
  //Több választógomb együttműködését biztosítja. A caption tulajdonságában
  //a programbeli szerepét írhatjuk le. A gombok Items-ekben találhatók,
  //melyet nevükkel adhatunk meg az Items tulajdonságban. Ha egyik sincs
  //kiválasztva, akkor az ItemIndex értéke -1, egyébként a kiválaszott indexe.
  //Kiválasztáskor csak egyetlen választógomb lesz bekapcsolva, tehát egymást
  //kizáró értékek, események megjelenítésére, beállítására alkalmas.
  //Megjelenését az objetum területe jelentősen befolyásolja. Az elrendezésben
  //segíthet, ha több oszloposra állítjuk a Columns tulajdonság segítségével.

end;

procedure TfmVCL.pnVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'Panel.txt');

  //Panel: TPanel, Standard paletta.
  //VCL elemek tárolására szolgáló container. Az elemek csak a téglalap alakú
  //területen belül látszanak. Gyakran a futási időben generált vizuális
  //elemek tárolására használjuk.

end;

procedure TfmVCL.bbVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'BitBtn.txt');

  //BitBtn: TBitBtn, Additional paletta.
  //Bitképes parancsgomb. Egyébként a tulajdonságai a Button tulajdonságaival
  //megegyeznek.

end;

procedure TfmVCL.meVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'MaskEdit.txt');

  //MaskEdit: TMaskEdit, Additional paletta.
  //Egysoros szerkeszthető beviteli mező. Ha az Object Inspektor Properties
  //oszlopa, PasswordChar mezejében található default értéket (#0) például
  //"*"-ra cseréljük, akkor a bevitt karakterek nem látszanak, azaz egy
  //PassWord bevitelére alkalmas szerkesztőt kapunk.

end;

procedure TfmVCL.sgVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'StringGrid.txt');

  //StringGrid: TStringGrid, Additional paletta.
  //Szövegek táblázatos megjelenítsére alkalmas. A nulladik sora és oszlopa
  //fejléc illetve "oldalléc" szerepet tölt be. Elemei olvashatók és írhatók,
  //azaz valódi tárolásra alkalmas.

end;

procedure TfmVCL.dgVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'DrawGrid.txt');

  //DrawGrid: TDrawGrid, Additional paletta.
  //A StringGrid-hez hasonló szerkezetű, grafikus elemek megjelenenítésére
  //alkalmas elem. Nem igazi tároló, csak a képernyőn való rendezett
  //megjelenítést szolgálja.

end;

procedure TfmVCL.imVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'Image.txt');

  //Image: TImage, Additional paletta.
  //.BMP kiterjesztésű képek megjelenítésére szolgál.

end;

procedure TfmVCL.spVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'Shape.txt');

  //Shape: TShape, Additional paletta.
  //Alak, körvonal. Egyszerű geometriai alakzatok megjelenítésére szolgál.
  //Az Object Inspector Properties oszlopa Shape sorában választhatunk a
  //különböző alakzatok közül.

end;

procedure TfmVCL.cdVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'CheckListBox.txt');

  //CheckListBox: TCheckListBox:, Additional paletta.
  //Több, logikailag összetartozó CheckBox megjelenítésére alkalmas. A címkéket
  //Items-ekben tárolja. Az egyes tételek kiválásztottságát a
  //Checked[0..Items.Count-1] logikai tömb tartalmazza. A tétel kijelölése
  //még nem jelenti a kiválasztás, ehhez a tétel neve előtti jelölőnézetre kell
  //kattintani.

end;

procedure TfmVCL.leVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'LabeledEdit.txt');

  //LabeledEdit: TLabeledEdit, Additional paletta.
  //Címkés beviteli mező. Lényes tulajdonságai az Edit tulajdonságaival
  //megegyeznek.

end;

procedure TfmVCL.coVCLChange(Sender: TObject);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'ColorBox.txt');

  //ColorBox: TColorBox, Additional paletta.
  //Választó listadobozban, névvel és szímintával megjelenő színválasztást
  //tesz lehetővé. Az alapértelmezett szint a DefaultColorColor tulajdonság,
  //a kiválasztott színt a Selected tulajdonság tartalmazza, melynek típusa:
  //TColor.

end;

procedure TfmVCL.tcVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'TabControl.txt');

  //TabControl: TTabControl, Win32 paletta.
  //Fülekkel rendelkező, többlapos megjelenítő elem. A TabIndex tartománya:
  //0..Tabs.Count-1. Az aktuális TabIndex szerkesztési és futási időben is
  //beállítható, vagy a füleken kattintva aktualizálódik.
  //A fülek felírata a Tabs tulajdonságban beállítható szerkesztési időben,
  //a String-ek beírásával a lapok létrejönnek. Ha egyébként a megjelenést
  //külön nem szabályozzuk, akkor a szerkesztési időben a Control-ra helyezett
  //VCL elem minden lapon megjelenik. Értelemszerűen a lapok váltogatásával
  //a megjelenő elemet célszerű módosítani.

end;

procedure TfmVCL.pcVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'PageControl.txt');

  //PageControl: TPageControl, Win32 paletta.
  //A TabConrol-hoz hasonló megjelenítő elem. Lényeges különbség: egymástól
  //egyébként független lapokból áll. Szerkesztési időben az ActivePage
  //tulajdonság mutatja a kiválasztott lap nevét. A lapok neve TabSheet,
  //vagy röviden: ts+index (az index 1-el kezdődik). Minden lapra külön-külön
  //helyezhetünk VCL elemeket. A lapokat tervezési időben úgy hozhatjuk létre,
  //hogy a Form-ra helyezett PageControl-on egér jobb fülével kattintunk, és a
  //megjelenő helyi menüből New Page-t válaszjuk. A TabSheet Caption
  //tulajdonságával adhatunk nevet a lapoknak. A kiválasztott lapot Delete
  //billentyűvel törölhetjük. Ha a füleken kattintunk, akkor a teljes
  //PageControl tulajdonságát, ha a lapok területén kattintunk, akkor a felül
  //lévő lap tulajdonságát látjuk, szerkeszthetjük.

end;

procedure TfmVCL.tbVCLChange(Sender: TObject);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'TrackBar.txt');

  //TrackBar: TTrackBar, Win32 paletta.
  //Értékbeállításra alkalmas csúszka. Az értékhatárokat a Min és Max
  //tulajdonság tartalmazza. Az orientációját a Orientation tulajdonsággal
  //adhatjuk meg, mely lehet trHorizontal és trVertical. A csúszka állapotát
  //a Position tartalmazza. A érték jelölésének sűrűségét a Frequency
  //segítségével adhatjuk meg. A SelStart és SelEnd tulajdonság segítségével
  //kiválasztó csíkot jeleníthetünk meg a TrackBar belsejében, a csúszka
  //alatt. Futási időben ezeket változtatva, folyamatok létét
  //érzékeltethetjük vele.

end;

procedure TfmVCL.pbVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'ProgressBar.txt');

  //ProgressBar: TprogressBar, Win32 paletta.
  //Folyamatjelző, a TrakBar-hoz nagyon hasonló tulajdonságokkal. A Min, Max
  //é Step tulajdonságokkal a folyamat és követése (megjelenítése)
  //összehangolandó.

end;

procedure TfmVCL.udVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'UpDown.txt');

  //UpDown: TUpDown, Win32 paletta.
  //Le-fel számláló elem. A számolás megjelenítésére használhatunk sokféle
  //VCL elemet. Azt, hogy melyiket kapcsoljuk hozzá, az Associate
  //tulajdonságban választhatjuk ki (a már létezők közül, futási időben
  //értékadással rendelhetjük össze). Az Increment állítja a léptéket egy
  //kattintásnál, míg a Min és Max tulajdonság tartalmazza a határokat.
  //Ha a VCL input fogadására képes (Edit), akkor az aktuális érték
  //futási időben, billentyűzetről bevihető. Ha nem fogad inputot, akkor
  //aktuális értéket egyéb módon beállíthatju.

end;

procedure TfmVCL.seVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'SpinEdit.txt');

  //SpinEdit: TSpinEdit, Samples paletta.
  //Az UpDown képességeivel szinte teljesen megegyező elem, azzal a megkötéssel,
  //hogy a kapcsolt megjelenítője egy Edit mező.

end;

procedure TfmVCL.cgVCLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'ColorGrid.txt');

  //ColorGrid: TColorGrid, Samples paletta.
  //16 színből történő választást lehetővé tevő elem. A szinek kis téglalapokban
  //jelenik meg. Az elrendezésük a GridOrdering tulajdonsággal adható meg.
  //Lehetőségek: 16x1, 8x2, 4x4, 2x8, 1x16. A kiválasztott szinek a
  //BackGrounIndex illetve ForeGroundIndex tulajdonságból olvashatók ki.

end;

procedure TfmVCL.caVCLChange(Sender: TObject);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'Calendar.txt');

  //Calendar: TCalendar, Sample paletta.
  //Naptár. Az évet a Year tulajdonsággal, az aktuális hónapot a
  //UseCurrentDate True-ra állításával adhatjuk meg. A StartOfWeek segítségével
  //az első oszlopban megjelenő napokat állíthatjuk, 0: Vasárnap, 6: Szombat.
  //Az, hogy ma hanyadika van, a Day mező tartalmazza.

end;

procedure TfmVCL.mcVCLClick(Sender: TObject);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'MonthCalendar.txt');

  //MonthCalendar: TMonthCalendar, Win32 paletta.
  //Hónapos naptár. Beállítható az aktuális dátum, és ez után az a hónap jelenik
  //meg, amely ezt tartalmazza. Erre szolgál a Date mező. Beállítható, hogy
  //a megjelenésben az első oszlop a hét melyik napját tartalmazza. Ezt a
  //FirtDayOfWeek segítségével tehetjük meg. A naptár lapozható a két vezérlő
  //nyomógombbal, de a MinDate és MaxDate tulajdonságokkal az intervallum is
  //beállítható. A időbeállítást már szerkesztési időben is ellenőrzi.
  //Futási időben a mai dátum be van jelölve. Kattintással a Date tulajdonság
  //beállítódik az aktuális napra, mely TDate típusú.

end;

procedure TfmVCL.dtVCLChange(Sender: TObject);
begin
  With Mouse.CursorPos Do MemoView(X,Y,200,150,'DateTimePicker.txt');

  //DataTimePicker: TDateTimePicker, Win32 paletta.
  //Gyakorlatilag a MonthCalendar helytakarékos megoldása. Alaphelyzetben
  //csak az aktuális dátum látható egy beviteli mezőben. A dátum
  //dátumszakaszonkét beírható. Lenyíló ComboBox-hoz hasonlóan a teljes hónap
  //megjeleníthető. Egyéb tulajdonságaiban a MonthCalender-hez hasonló.

end;


end.