HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Táblaméret kiválasztása grafikusan


Példaprogram letöltése

16444 bájt

Napjaink alkalmazásaiban elsődleges szempont, hogy a funkciókat maximálisan felhasználóbarát formába öntsük. Cikkünkben ennek jegyében készítettünk egy kontrolt, melynek segítségével a felhasználó egy méretválasztó panelen tudja megadni a Word dokumentumban létrehozandó táblázat métereit. A műveletet az egérrel végezheti el anélkül, hogy a billentyűzetet kellene igénybe venni.

A kontrolunk működését és megjelenítését tekintve egy nyomógomb, melyet megnyomva legördül a választópanel, melyen 5x5 darab négyzet rajzolódik ki. Az egeret mozgatva a panelen kijelölhetők a négyzetek, vagyis egy akkora mátrixot kell kijelölnünk a 25 darab négyzetből, amekkora táblázatot szeretnénk elkészíttetni a Word dokumentumban. Ennek megfelelően maximálisan egy 5x5 méretű táblázat hozható létre, de a kontrolt továbbfejlesztve ez a szám növelhető.
A nyomógombra történő második kattintáskor a panel bezáródik, és a bezáródáshoz rendelt eseménykezelő paraméteréből kiolvasható az aktuálisan kijelölt mátrix mérete.
A táblázat oszlopainak és sorainak száma megjelenik a hívó alkalmazás űrlapján. Miután a választás megtörtént, a MŰVELET gombra kattintva indítható a Word dokumentum és a táblázat generálása.
Kontrol elkészítése
A kontrolunk projektje két részből tevődik össze. A MWTForm osztály a megjelenő választópanel osztálya, míg a MWTButton a kontrol nyomógombja. Elsőként vizsgájuk meg a panel kódját.
A kontrol legfontosabb változója a tableSize tag, mely tartalmazni fogja a kiválasztott mátrix méreteit.
private Size tableSize = new Size(0,0);
A lekérdezéshez egy property-t rendeltünk a változóhoz.
public Size TableSize
{
  get{return tableSize;}
}
A panel konstruktorában határozzuk meg a megjelenés pozícióit, melynek alapjául a szülőkontrol – jelen esetben a nyomógomb – pozíciója szolgál.
parentRect = parent.RectangleToScreen(parent.ClientRectangle);
A kontrol kódjában felüldefiniáltunk néhány eseménykezelő metódust, vizsgáljuk meg most, melyik milyen feladatot lát el.
Az OnDeactivate metódus akkor fut le, amikor a hívó alkalmazásban máshová kattintunk, vagyis a fókusz már nem a panelen van. Ekkor a Close metódussal bezárjuk az űrlapot.
Amikor a kontrol nyomógombjára kattintunk, akkor többek közt lefut az OnActivated metódus, melyben meghatározzuk a panelen megjelenő – az aktuális kijelölést tolmácsoló - szöveg magasságát, valamint kalkuláljuk a panel méreteit, és a helyzetét. Ezekre szolgálnak a SizeCalculation és a FormLocation belső metódusok.
Az OnMouseLeave metódus fut le, amikor az egérrel elhagyjuk a panel kliensterületét. Ekkor a kijelöléseket töröljük, vagyis a mátrix méretét 0x0 méretre állítjuk.
Az OnMouseMove metódusban gondoskodunk arról, hogy megvizsgáljuk az aktuális kurzorpozíciót, majd eldöntsük, hány négyzet területét kell kitöltenünk az adott színnel, jelezve az aktuális méretet. A folyamat közben folyamatosan frissítjük a tableSize változó értékét az Updates3 belső metódussal.
A panel kirajzolását az OnPaint metódusban végezzük el, melyben alapvetően kétfajta művelet zajlik le. Az alapértelmezett procedúrában kirajzoljuk a 25 darab négyzetet, valamint az információs szöveget. Amennyiben az egérmutató a panel fölött tartózkodik valamely pozícióban, akkor kalkuláljuk a mátrix-méretet és kitöltjük az adott számú négyzetet.
A kontrol második eleme a felületen állandóan megjelenő nyomógomb, mely lényegesen egyszerűbb kódot rejt. A kijelölt mátrix méreteinek lekérdezéséhez létrehoztunk egy TSEventArgs osztályt, mely a panel bezárását követő esemény kezelésére hivatott metódus második paraméterének típusa lesz.
Csupán egy property-vel rendelkezik, melyből lekérdezhetjük a Size típusú struktúra értékeit.
A nyomógomb osztályában létrehoztunk egy delegáltat az esemény kezelőjeképpen, melynek második paramétere a fent deklarált osztály típusú.
public delegate void SelectEventHandler(object sender,TSEventArgs e);
Az esemény neve Changed lesz, melyre kezelőmetódust hozunk létre.
public event SelectEventHandler Changed;
A panel osztályából létrehozunk egy tagobjektumot.
private MWTForm f;
Amikor a kontrol panelje bezáródik, meghívjuk az OnChanged metódust, vagyis az esemény objektumát példányosítjuk.
protected virtual void OnChanged(TSEventArgs e)
{
  if (Changed != null) Changed(this,e);
}
A nyomógombra kattintva két eset állhat elő. Az első esetben a panel objektuma létezik, így azt meg kell szüntetni, a memóriaterületet fel kell szabadítani.
protected override void OnClick(EventArgs e)
{
  base.OnClick(e);
  if (f != null)
  {
    f.Dispose();
    f = null;        
  }
A második esetben a panel nem létezik, példányosítani kell az osztályát, majd meg kell jeleníteni azt.
  else
  {
    f = new MWTForm(this);
    f.Closed += new EventHandler(f_Closed);
    tableSize.Width = tableSize.Height = 0;
    f.Show();        
  }
}
A panel bezárását követő esemény kezelőjében átadjuk a panel tableSize tagjának értékét a nyomógomb tableSize változójának, majd elsütjük a Changed eseményt a kapott értéket átadva paraméterül.
if (f != null)
{
  tableSize = f.TableSize;
  OnChanged(new TSEventArgs(tableSize));
  f = null;
}
Hívó alkalmazás
A hívó kliensben csak deklarálunk egy kezelőt a fenti eseményre, hogy kinyerjük az aktuális kijelölés értékét. Az információkat megjelenítjük a Form szövegmezőiben.
private void mwtButton1_Changed(object sender,MWTLibrary.TSEventArgs e)
{
  Size s = e.TableSize;
  if (s.Width != 0 && s.Height != 0)
  {
    textBox1.Text = s.Width.ToString();
    textBox2.Text = s.Height.ToString();
  }
}
A MŰVELET gombra kattintva példányosítjuk a Word alkalmazást, majd létrehozunk egy új dokumentumot.
wa = new Word.Application();
wa.Documents.Add(ref m, ref m, ref m, ref m);      
Word.Document wd = wa.ActiveDocument;
...
Létrehozzuk a megadott méretekkel rendelkező Word táblázatot, melynek cellái 50x25 pixel méretűek lesznek.
Word.Table wt = wd.Tables.Add(wa.Selection.Range, row, col, ref dtb, ref m);
...
Végül láthatóvá tesszük a dokumentumot.
wa.Visible = true;
A példa egyszerűségére való tekintettel nem írtunk adatokat a cellákba.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 476. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |