Negyedik Generációs Nyelvek ( Delphi ) 1. Többablakos applikációk TForm komponens Dialógusablakok 2. Kivételek kezelése 3. Drag & Drop technika
1. TÖBBABLAKOS APPLIKÁCIÓK
TabControl Fülsor egy lappal PageControl Fülsor több lappal Animate Animáció ToolBar Eszközsor DateTimePicker Dátumkezelő StatusBar Állapotsor
Többablakos applikációk Egy ablakban több oldalra helyezett info. (ld. TPageControl, TTabControl komponensek) Több egymással kommunikáló ablak
Többablakos applikációk TTabControl Szerepe: fülsor egy lappal.Akkor használjuk, ha a különböző füleken található információ szerkezete azonos, csak a tartalma változik. Jellemzői: Tabs: TStrings: a fülek feiratát tartalmazza külön sorokban TabIndex: az aktuális fül indexe (az első indexe 0) TabPosition: tpTop, tpBottom, a fülek pozíciója
Többablakos applikációk TTabControl Fontos eseményei OnChange: fülváltáskor következik be. A TabIndex ilyenkor az új fül indexét tartalmazza. OnChanging: fülváltás közben következik be
Többablakos applikációk TPageControl Szerepe: fülsor több lappal.Minden fülhöz tartozik egy lap. Fontosabb jellemzői: ActivePage: az aktuális lap Új lap: gyorsmenü, New Page, felirat a Caption jellemzőbe TabPosition: tpTop, tpBottom, a fülek pozíciója
Többablakos applikációk TPageControl Fontos eseményei OnChange: fülváltáskor következik be. A TabIndex ilyenkor az új fül indexét tartalmazza. OnChanging: fülváltás közben következik be
Többablakos applikációk Egy applikáció tartalmazhat: Egyszerű adatbeviteli és üzenetablakokat Windows által felkínált párbeszédablakokat ( TOpenDialog, TPrinterSetupDialog,...) Előzőleg megtervezett és mintaként (template) elmentett formokat Saját tervezésű ablakokat ( a TForm osztály felhasználásával egy új formosztály létrehozása)
Többablakos applikációk Ezek közül: egyesek automatikusan létrejönnek (autocreate), mások nem egy főablak (main form) van, és ennek automatikusan kell létrejönnie Ablakok megjelenítési formái: Modális (tipikus párbeszédablakok) Nem modális (Modeless)
Egyszerű adatbeviteli és üzenetablakok Ezek az ablakok modálisan jelennek meg ShowMessage procedure ShowMessage(const Msg: WideString); A lehető legegyszerűbb üzenetablak szöveggel, és egy OK gombbal. Az ablak címsorában az alkalmazásunk projektállományának neve található. Az ablak a képernyő közepén jelenik meg.
Egyszerű adatbeviteli és üzenetablakok Egyszerű üzenetablakok Procedure ShowMessage(Szöveg: String); Pl.: ShowMessage ('Bármilyen üzenet'); Projekt neve
Egyszerű adatbeviteli és üzenetablakok Ezek az ablakok modálisan jelennek meg Inputbox function InputBox(const ACaption, APrompt, ADefault: WideString ): WideString; Beviteli ablak, a bekért adat típusa string, double, vagy integer.
Function InputBox(Cím, KérőSzöveg, Alapérték: String): String; Egyszerű adatbevitel Function InputBox(Cím, KérőSzöveg, Alapérték: String): String; program Peldapr; uses Forms,Dialogs, Koszon in 'KOSZON.PAS' {Pelda}; {$R *.RES} begin If Inputbox('Bejelentkezési ablak', 'Gépelje be a jelszót', '')= 'A jelszó' then begin Application.CreateForm(TPelda, Pelda); Application.Run;...
Egyszerű adatbeviteli és üzenetablakok Ezek az ablakok modálisan jelennek meg MessageDlg function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word; Beviteli ablak, a bekért adat típusa string, double, vagy integer.
Többablakos applikációk Egyszerű üzenetablakok Function MessageDlg( Szöveg: String; Típus: TMsgDlgType;Gombok: TMsgButtons; Súgóidx: LongInt): Longint; Pl.MessageDlg('Kívánja menteni a változásokat?',mtConfirmation, [mbNo, mbOk,mbCancel], 0);
Többablakos applikációk Applikációk típusai CRT applikáció = DOS - os applikáció fehér ablakban SDI (Single Document Interface) Egy ablakos Windows applikáció Van: menüje, eszközsora, állapotsora,.. MDI (Multiple Document Interface) Egyetlen alkalmazás felügyelete alatt, egyszerre több ablakban jeleníthetünk meg adatokat, grafikát, és azokkal párhuzamosan dolgozunk (pl. WinWord, Filekezelő,... )
Többablakos applikációk Az MDI applikáció részei: Egy főablak (keretablak, MDIFrame) Van: címsora, menüje, eszközsora, állapotsora Akárhány gyerekablak (MDIChild) Ezekben jelenítjük meg az adatokat Van: címsoruk, rendszermenüjük Nincs: saját menüjük
Többablakos applikációk Szabályok: A keretablak az applikáció főablaka; automatikus létrehozású A gyerekablak nem automatikus, futáskor hozunk létre egy vagy több példányt Mindig csak egy gyerekablak lehet aktív A gyerekablakok a keretablak munkaterületén belül helyezkednek el A keretablak bezárása maga után vonja a gyerekablakok bezárását is
Többablakos applikációk TForm komponens A felhasználói interfész megtervezését teszi lehetővé Tartalmazza az összes "rácipelt" komponenst Fontosabb jellemzői: Caption: String (címsorban jelenik meg) BorderIcons: Set of TBorderIcon pl. [biSystemMenu, biMinimize, biMaximize] BorderStyle: bsDialog, bsSizeable,... AutoScroll: Boolean
Többablakos applikációk TForm komponens HorzScrollBar, VertScrollBar: TControlScrollBar ClientWidth, ClientHeigth: Integer Position: poDesigned, poScreenCenter Icon: TIcon (ikonja minimizált állapotban; ha nincs megadva az applikációét használja) ShowHint: Boolean (buboréksugót jelenítsen-e meg, vagy sem?) WindowState: wsNormal, wsMaximized, wsMinimized
Többablakos applikációk TForm komponens Menu: TMainMenu (főmenüje) ModalResult: mrOk, mrCancel,... (bezárása után jelzi bezárásának okát) KeyPreview: Boolean ( = True a billentyűzet üzeneteket előbb ő kapja, és csak utána a fókuszban levő komponens. (ld. számológép gombjainak lenyomása billentyűzetről) FormStyle: TFormStyle fsNormal, fsMDIForm, fsMDIChild, fsStayOnTop
Többablakos applikációk TForm komponens MDI keretablak esetén: MDIChildCount: Integer (megnyitott gyerekablakok száma) MDIChildren [ I: Integer]: TForm ActiveMDIChild: TForm WindowMenu: TMenuItem (melyik menüpont alján jelenjen meg a nyitott gyerekablakok listája)
Többablakos applikációk TForm komponens Fontosabb metódusai: procedure Show function ShowModal: Integer (modálisan jeleníti meg az ablakot, majd bezárása után visszaadja a kilépés okát) Print (kinyomtatja az ablakot) Close CloseQuery: Boolean
Többablakos applikációk TForm komponens MDI keretablak esetén: Next (aktivizálja a köv. gyerekablakot) Tile Cascade ArrangeIcons gyerekablakok rendezése
Többablakos applikációk TForm komponens Fontosabb eseményei: OnCreate (életrekeltése) OnShow (megjelenítése) OnActivate (aktivizálása) OnPaint (újrarajzolása) OnDeactivate (fókusz elvesztése) OnClose (bezárás) OnCloseQuery (bezárás előtt) OnDestroy (megszüntetés)
SDI alkalmazásokban Több ablak együttműködése egy applikációban MainForm frmHarmadik
Többablakos applikációk Több ablak együttműködése egy applikációban Ha egy űrlapról (MainForm) meg szeretnénk jeleníteni egy másik űrlapot (frmHarmadik), akkor: a láthatóságot biztosítanunk kell (uses uHarmadik) megjelenítjük: Modálisan Nem modálisan frmHarmadik.ShowModal frmHarmadik.Show
unit Umain; interface uses SysUtils, ... type TfrmMain=class(TForm) ... end; Var frmMain: TfrmMain; implementation Uses uAbout; procedure TfrmMain.AboutmenuClick (Sender: TObject); begin frmAbout.ShowModal; end; unit Uabout; interface uses WinTypes,... type TfrmAbout = class(TForm) ... end; var frmAbout: TfrmAbout; implementation ... end.
Többablakos applikációk Több ablak együttműködése egy applikációban MDI alkalmazásokban Beállítjuk a keret- és gyerekablak típusát: KeretAblak.FormStyle:= fsMDIform ; GyerekAblak.FormStyle:= fsMDIChild ; A keretablak marad AutoCreate-nek; ő az alkalmazás főablaka is. A gyerekablak nem AutoCreate. A keretablakból hozzuk létre a gyerekablakokat (pl. NewMenuClick)
Többablakos applikációk KeretAblak MDI alkalmazás GyerekAblak
unit uMDIKeret; interface uses SysUtils, ...uGyerek; type TfrmKeret=class(TForm) ... end; var frmKeret: TfrmKeret; implementation procedure TfrmKeret.NewmenuClick (Sender: TObject); var Gyerek: TfrmGyerek; begin Gyerek:= TfrmGyerek. Create (Application); Gyerek.Show; end; end. unit uGyerek; interface uses WinTypes,... type TfrmGyerek = class(TForm) ... end; Var frmGyerek: TfrmGyerek; implementation uses uMDIKeret; GyerekAblak (nem Autocreate, példányait dinamikusan hozzuk létre) KeretAblak (marad Autocreate)
TComponent TCommonDialog TColorDialog TFindDialog TFontDialog Létező párbeszédablakok használata (Dialogs komponenspaletta) TComponent TCommonDialog TColorDialog TFindDialog TFontDialog TOpenDialog TSaveDialog TPrinterSetupDialog TPrintDialog
Dialógusablakok OpenDialog Megnyitás dialógusablak, felhasználható a fájlnév, valamint az elérési útvonal SaveDialog Mentés dialógusablak, felhasználható a fájlnév, valamint az elérési útvonal OpenPictureDialog Megnyitás dialógusablak grafikus fájlok eléréséhez, az ablakban látható a grafikus fájl képe SavePictureDialog Mentés dialógusablak grafikus fájlok eléréséhez, az ablakban látható a grafikus fájl képe
Dialógusablakok FontDialog Font dialógusablak, használható többek között a font mérete, színe, típusa ColorDialog Színek beállítását segítő ablak PrintDialog Nyomtatás dialógusablak, a nyomtatás jellemzőit használhatjuk(pl. nyomtatási oldalak, nyomtatás példányszáma) PrinterSetupDialog Nyomtató beállítóablak, a feltelepített nyomtatók tulajdonságait érhetjük el (elérhető a PrintDialog ablakból is)
Dialógusablakok FindDialog Kereső dialógusablak, felhasználható a keresett szöveg ReplaceDialog Csere dialógusablak, felhasználható a helyettesítendő, valamint a helyettesített szöveg
Párbeszédablakok használata (Opendialog) Láthatatlan komponensek Az őt használó formban deklaráljuk Objektum-felügyelőben adatait beállítjuk Execute - al végrehajtjuk Pl. OpenDialog esetén:
Párbeszédablakok használata (Opendialog) Beállítjuk a Filter jellemzőjét If OpenDialog.Execute Then ShowMessage('A kiválasztott állomány neve: '+ OpenDialog.Filename);
2. KIVÉTELEK KEZELÉSE
Kivételkezelés Kivételek kezelése Kivétel: olyan hibás állapot vagy esemény, amely megszakítja az alkalmazás futását SysUtils egységben definiált kivételosztályok: TObject Exception EConvertError EInOutError EMathError EOverflow EUnderflow EZeroDivide Eprinter...
Kivételkezelés Kivételek Az Object Pascalban a futási idejű hibák kivételekké alakulnak A kivételt megtestesítő objektum tartalmazza a hibát okozó információt A vezérlés a futó program aktuális pontjáról a kivételkezelőhöz (exception handler) adódik át Programlogika és hibakezelés elválasztása nő az áttekínthetőség
Kivételkezelés Kivételek kezelése Try utasítás_blokk (védett blokk) Except kivételkezelő_blokk [Else kivételkezelő_blokk] End; Ahol a kivételkezelő blokk: On [ azon: ] Osztálytípus Do utasítás
Kivételek kezelése Try ... Except On EZeroDivide Do HandleZeroDivide; On EOverflow Do HandleOverflow; On EMathError Do HandleMathError; End; Function Atlag ( Osszeg, Db: Integer): Real; Begin Try Atlag:= Oszeg / Db; Except On EZeroDivide Do Result := 0; End; End; Fontos a sorrend! EMathError EOverFlow EZeroDivide
Kivételkezelés Kivételek kezelése Le nem kezelt kivétek esetén lefut az alapértelmezett kezelő (default handler) A kivétel lekezelése automatikusan maga után vonja a kivételobjektum megszüntetését, nem nekünk kell megszüntetni! Kivételkezelők tetszőleges számban egymásba ágyazhatók
Erőforrások biztonságos használata Erőforrások: állományok, memória, ... Formája: erőforrások lefoglalása Try erőforrásokat használó utasítások Finally erőforrásokat felszabadító utasítások End;
Erőforrások biztonságos használata Procedure Akarmi; Var Mutato: Pointer; Eredmeny:Real; Oszto: Integer; Begin Oszto:=0; Getmem(Mutato, 1024); Try Eredmeny := 10 / Oszto;... Finally FreeMem (Mutato,1024); End; End;
3. DRAG & DROP TECHNIKA
Drag & Drop (vonszolás) techika Négy fontos lépésből áll: Vonszolás elkezdése Vonszolás fogadása vagy (DragCursor: crDrag, crMultiDrag,...) Dobás Befejezés
A komponensek DragMode tulajdonság értékétől függ: Vonszolás elkezdése A komponensek DragMode tulajdonság értékétől függ: dmAutomatic automatikusan elkezdődik a vonszolás dmManual programból explicit módon kell elkezdeni BeginDrag BeginDrag (True) automatikus BeginDrag (False) csak egérelmozgatás után
Vonszolás elkezdése Bal oldali egérgomb Procedure TForm1.ForrasMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Begin If Button = mbLeft Then With Sender as TListBox Do If ItemAtPos( Point(X,Y), True) >= 0 Then BeginDrag (False); End; A listadoboz fölött kezdődik a vonszolás
Vonszolás fogadása Az objektum ami fölött vonszolunk OnDragOver üzenetet kap OnDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); Ha fogadja Accept := True Ha nem fogadja Accept := False Ami fölött vonszolunk Amit vonszolunk
Vonszolás fogadása Procedure TForm1.CelDragOver (Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); Begin If Source is TListBox Then Accept := True Else Accept := False; End;
Dobás Ha egy objektum fogadja, egérgomb felengedésekor OnDragDrop üzenetet kap OnDragDrop(Sender, Source: TObject; X, Y: Integer) Ami fölött vonszolunk Amit vonszolunk
Dobás Pl. Procedure TForm1.CelDragDrop (Sender, Source: TObject; X, Y: Integer); Begin With Source as TListBox Do Begin TListBox(Sender).Items. Add(Items[Itemindex]); Items.Delete(Itemindex); End; End; Elem hozzáadása Elem törlése
Ami fogadta (ha fogadta) Vonszolás befejezése Befejezéskor a vonszolt objektum kap egy OnEndDrag üzenetet OnEndDrag(Sender, Target: TObject; X, Y: Integer); Ide írjuk a fogadó objektum frisítését (ha ez nem automatikus) Amit vonszolunk Ami fogadta (ha fogadta)
Vonszolás befejezése Pl. Procedure TForm1.ForrasEndDrag (Sender, Target: TObject; X, Y: Integer); Begin If Target<> Nil Then ShowMessage(Format('A %s objektum fogadta',[TComponent(Target).Name])); End; Ha létezik a fogadó
Eseménykezelő metódus (Message) Type TSajatForm = Class(TForm) Protected Procedure Atmeretezes ( Var Msg: TMessage); Message WM_SIZE; End; ... Procedure TSajatForm. Atmeretezes; Begin ShowMessage('Most méreteznek át'); Inherited; End; ...
Eseménykezelő metódus (Message) Eredmény: Minden ablakátméretezésnél:
If Obj Is TButton Then (Obj As TButton).Caption := 'Ok gomb'; Osztályoperátorok Típusmegállapítás : Is Típuskonverzió : As Var Obj: TComponent; ... Obj := TButton.Create(...); Általában együtt használjuk őket: If Obj Is TButton Then (Obj As TButton).Caption := 'Ok gomb'; TComponent TButton