1
DIPLOMAMUNKA
Török György Budapest 1999
2
GÁBOR DÉNES FŐISKOLA
Logikai adatszerkezeti ábra Szerkesztő Sorszáma: 763/1999
Török György Budapest 1999
3 Tartalomjegyzék 1
TARTALOMJEGYZÉK........................................................................................................................1
2
BEVEZETŐ ............................................................................................................................................4 2.1 2.2 2.3 2.4 2.5
3
TÉMAVÁLASZTÁS .................................................................................................................................4 FEJLESZTŐESZKÖZ ................................................................................................................................4 FELADATSPECIFIKÁCIÓ .........................................................................................................................6 OBJEKTUMORIENTÁLT PROGRAMOZÁS .................................................................................................9 A LOGIKAI ADATELEMZÉS (LOGICAL DATA MODEL)..........................................................................11
RENDSZERTERV ...............................................................................................................................16 3.1 NAGYVONALÚ PROGRAMTERV ...........................................................................................................16 3.2 OSZTÁLYDIAGRAM ..............................................................................................................................17 3.3 OBJEKTUMDIAGRAM...........................................................................................................................18 3.4 OSZTÁLYLEÍRÁS .................................................................................................................................19 3.5 METÓDUSLEÍRÁS ................................................................................................................................38 3.5.1 TDrawinDesk ...........................................................................................................................38 3.5.2 A TShapeEntity osztály.............................................................................................................84 3.5.3 A ContactLine osztály...............................................................................................................87 3.5.4 A TWorkPad osztály .................................................................................................................89 3.5.5 A TMainForm osztály...............................................................................................................95
4
MELLÉKLETEK .................................................................................................................................99 4.1 4.2
FELHASZNÁLÓI KÉZIKÖNYV................................................................................................................99 NYOMTATÁSI KÉPEK .........................................................................................................................107
5
TAPASZTALATOK, TOVÁBBFEJLESZTÉSI LEHETŐSÉGEK ..............................................110
6
KÜLSŐ FORRÁSANYAGOK ..........................................................................................................111 6.1 6.2
IRODALOMJEGYZÉK ..........................................................................................................................111 TANULMÁNYOZOTT ALKALMAZÁSOK ...............................................................................................111
4
1 Bevezető 1.1 Témaválasztás A számítógépes rendszerek kifejlesztése egyike a legösszetettebb vállalkozásoknak. Ilyen rendszerek létrehozása mintegy 3-4 évtizeddel ezelőtt kezdődött el és világszerte több százezer szakember vett részt a munkákban. Mégis az a tapasztalat, hogy viszonylag kevés volt a sikeres információs rendszerfejlesztési projekt. Ez a szomorú mérleg nagyban ösztönözte a jobb minőségű információs rendszerek létrehozását biztosító módszertanok kifejlesztését. E fejlesztési törekvések egyik eredménye a strukturált fejlesztési módszertanok megalkotása, melyek technológiai folyamatként fogták fel az egész rendszerfejlesztési munkát és pontosan meghatározták a feladatokat. Ilyen strukturált rendszerelemzési és -tervezési módszer például a 80-as években kifejlesztett SSADM (Stuctured System Analysis and Design Method). A rendszerszervezők tehát egy olyan szabványos technológia alapján dolgozhatnak, amelyek -helyes használat esetén- szavatolják az eredményes számítógépes rendszerfejlesztéseket. A strukturált módszertanok fontos jellemzője hogy egységes rendszerként kezeli az egymással összefüggő, sőt egymásra épülő módszereket. Ezeket a módszereket többnyire technikáknak szoktuk nevezni. Vannak olyan technikák, amelyeket ezekkel a módszertanokkal egyidejűleg fejlesztettek ki, de többségük már korábban is ismert volt valamilyen formában. Néhány példa a technikákra: adatmodellezés, folyamatmodellezés, dialógustervezés, esemény modellezés, stb. Természetesen ezek a technikák is több elemből tevődnek össze. A módszertanok a rendszerfejlesztéshez szükséges kommunikáció támogatásának érdekében előszeretettel használják a képi ábrázolás lehetőségét, tehát különböző diagramok segítségével teszik átláthatóvá az adott technikát. Jelen szakdolgozat témája is egy ilyen diagram készítő szoftver megtervezése és elkészítése, amely az adatmodellezés egyik elemét a logikai adatszerkezeti ábra vizuális tervezését támogatja Az elkészítendő alkalmazás az SSADM dokumentációjában megfogalmazott jelölésmódot valósítja meg.
1.2 Fejlesztőeszköz A fejlesztőeszköz kiválasztásánál alapvető szempont volt, hogy az elkészítendő alkalmazás a legelterjedtebb PC-s operációs rendszereken működjön, amelyek jelenleg a 32-bites Microsoft Windows operációs rendszerek. (Windows’95, Windows’98, Windows NT). A konkrét fejlesztő eszköz kiválasztásánál elsősorban azt vettem figyelembe, hogy az minél széleskörűbben támogassa a grafikai alkalmazások készítését és az objektumorientált programozást. Mivel a windows-os fejlesztőeszközök közül a legnagyobb gyakorlatot Borland Delphi-ben szereztem, ezért választásom a Borland Delphi 3.0-ás verziójára esett.
5 A program tervezéséhez az UML1 technikát alkalmaztam és a dokumentációban Angster Erzsébet, „Az Objektumorientált tervezés és programozás alapjai” című könyv eszköz rendszerért használtam. A bonyolultabb metódusokat Jackson ábrák2, a rajzolási mechanizmusokat egyéb ábrák segítségével próbáltam áttekinthetőbbé tenni. Az alkalmazás külső megjelenésére, kezelési mehanizmusára erős hatással volt a PowerSoft, S-Designor AppModeler szoftvere.
1 2
UML: Unified Modeling Language, Egyesített Modellező Nyelv) Jackson ábra: Programalgoritmusokat modellező ábra.
6
1.3 Feladatspecifikáció Legyen egy rajzasztal, amelyen egyedeket jelölő, lekerekített sarkú téglalapokat (egyedtéglalap) helyezhetünk el, melyeket kapcsolatokat jelölő vonalakkal (kapcsolatvonal) köthetünk össze. Alapelvek: - A felhasználói felület és a kezelési mechanizmus tervezésekor, kivitelezésekor törekedni kell a mai vizuális rajzoló, dokumentumkezelő, modellező alkalmazásokban használt -jól bevált- megoldások alkalmazására, mivel így gyorsabban elsajátítható a program kezelése. - A programnak követnie kell a ’WYSIWYG’ (What You See Is What You Get) és a ’Look and Feel’ elveket, vagyis a képernyőn látható ábrának kell megjelennie a nyomatón is, valamint a felhasználó által kiváltott események hatására bekövetkező változásokat azonnal meg kell jeleníteni. - Az alkalmazásban az un. MDI több ablakos technikát kell használni, ahol az egyes funkciókat toolbar-on és menürendszeren keresztül kell elérhetővé tenni. A nyitott ablakok (modellek) közötti váltást egy dinamikus menü segítségével kell biztosítani. - Továbbá biztosítani kel az ablakok belső tartalmának görgetését belsejének ’megragadásával’ majd ’vonszolásával’. Az egérkurzor formájának jeleznie kell az éppen aktuális rajzolási, vezérlési állapotot. 1. Rajzasztal (rajzolási felület) A rajzfelületet egymásmellé helyezett szabványos papírlapoknak kell alkotni, így a modell készítése nem korlátozódik az A4-es lapok fizikai kereti közé. (1. Ábra)
Modell
Lapok 1
2
3
4
5
Lapmagasság
2
Lapok
1
3
Lapszélesség egy lap
1. Ábra
Biztosítani kell a rajzasztal nagyítását és kicsinyítését. A rajzasztal tulajdonságait dialógus ablakokon keresztül lehessen beállítani: - rajzasztalt felépítő papírlapok méretét és orientációját - a modellre vonatkozó fejlécet, (cím, szerző, verzió,…stb.)
7 -
rácspontok színét, egymáshoz viszonyított távolságát (a rácspontok az elhelyezendő objektumok pontosabb pozícionálását segíti elő) a rácspontok engedélyezését, megjelenítésének engedélyezését az újonnan elhelyezett egyedtéglalapok alaptulajdonságait az újonnan elhelyezett kapcsolatvonalak alaptulajdonságait
Biztosítani kell a modell nyomatatási képének vázlatos megjelenítését, a nyomtatási paraméterek beállítását és a modell nyomtatását. A nyomtatás paramétereit dialógus ablakon keresztül lehessen beállítani: - nyomtató tulajdonságait - keretengedélyezést - színes és monokróm nyomtatást - példányszámot Biztosítani kell a rajzasztal és a rajta elhelyezkedő objektumok háttértárra történő mentését és visszatöltését, valamint a jelölt objektumok vágólapra helyezését, illtetve onnan történő visszatöltését. 2. Egyedtéglalap Az egyedtéglalap szolgál a logikai adatmodell egyedeinek megjelenítésére, tulajdonságaiknak tárolására. Az egér használatával kell biztosítani az egyedtéglalapok létrehozását, áthelyezését, átméretezését és tulajdonságainak beállítását. Az áthelyezést és átméretezést a klasszikus „drag and drop” módszerrel kell megvalósítani: - a bal egérgomb lenyomásával „megfogjuk” az objektumot, - az egérkurzort a kívánt pozícióba visszük („vonszoljuk az objektumot”), - végül felengedjük, a mozgatás alatt nyomva tartott egérgombot, vagyis „elengedjük” az objektumot. (Objektum alatt itt az egyedtéglalap és kapcsolatvonal értendő!) Az egyedtéglalapok kijelölését el lehessen érni - egyedileg: a bal egérgomb lenyomásával; - egyenként: a shift billentyű és a bal egérgomb lenyomásával; illetve - csoportosan: a csoport kijelölő kerettel. (Természetesen az egérgomb lenyomása az egyedtéglalap felületén értendő.) A jelöltség egy állapot, melynek hatására az egyedtéglalap 4 sarkában és 4 oldalvonalának közepén egy-egy piros négyzet jelenik meg. (2. Ábra) Piros négyzet
1
2
8
3 4
Egyedtéglalap
7
6 2. Ábra
5
8 Csoportosan kijelölt egyedtéglalapok esetén az átméretezését, áthelyezését és a tulajdonságok beállítását a csoport valamennyi tagjára érvényesíteni kell. A csoportot jelölő keretet a következőképpen kell működtetni (3. Ábra): - az egérkurzort a kijelölésre szánt terület bal-felső sarkába visszük, - majd az egérgombot lenyomva -és folyamatosan nyomva tartva- a kijelölésre szánt terület bal-alsó sarkába húzzuk, - itt felengedve az egérgombot a kereten belül elhelyezkedő valamennyi objektum (egyedtéglalap, kapcsolatvonal) jelölt állapotba kerül.
(x1,y1) jelölő keret
egyedtéglalap
kapcsolatvonal
(x2,y2)
3. Ábra
Egyedtéglalap
Háttérszín
Keret
Több soros szöveg
Magasság
Az egyedtéglalap tulajdonságait dialógus ablakon keresztül lehessen beállítani (4. Ábra): - az egyedtéglalap megnevezését, (a megnevezés akár több soros is lehet és az egyedtéglalap közepén kell elhelyezni) - a megnevezés szövegének ’font’ tulajdonságát - vízszintes és függőleges méretét - a keretének színét, vastagságát - az egyedtéglalap háttérszínét
Szélesség 4. Ábra
3. Kapcsolatvonal A kapcsolatvonal szolgál a logikai adatmodell kapcsolatainak megjelenítésére, tulajdonságaiknak tárolására (5. Ábra). A kapcsolatvonal alapjellemzői és kezelése: - Egyik vége mindig ’csirkelábban’ a másik egy egyenesben kell, hogy végződjön. Tehát csak 1:N jellegű kapcsolat ábrázolható. Amennyiben a modellezendő kapcsolat nem ilyen, akkor azt ilyen formára kell hozni. - Az egér használatával kell biztosítani a létrehozását, áthelyezését és tulajdonságainak beállítását.
9 -
Végpontjai minden esetben két különböző egyedtéglalapon kell, hogy elhelyezkedjen. Függőleges és vízszintes szakaszokból (max:3) kell felépíteni. A felépítő szakaszok számát és elhelyezését egy algoritmus alapján a programnak kell elvégezni, méghozzá a kapcsolatvonal által összekötött egyedtéglalapok egymáshoz viszonyított helyzete alapján. Azonosító nevét a kapcsolatvonal közepén kell elhelyezni.
A kapcsolatvonalak kijelölését el lehessen érni - egyedileg: a bal egérgomb lenyomásával; - egyenként: a shift billentyű és a bal egérgomb lenyomásával; - csoportosan: a csoport kijelölő kerettel. (Természetesen az egérgomb lenyomása a kapcsolatvonal szűk környezetében értendő.) A csoport kijelölés menete megegyezik az egyedtéglalapnál leírtakkal.
Kizáró kapcsolat
Kapcsolatvonal Csirkeláb Egyedtéglalap
Végpont
Kapcsolat azonosító
2. szakasz Végpont
5. Ábra
A kapcsolatvonal tulajdonságait dialógus ablakon keresztül lehessen beállítani: - a kapcsolat megnevezését - a kapcsolat jellegét szaggatott vonallal (Létezhet-e az egyed anélkül, hogy létezne az adott kapcsolatban hozzá kapcsolt másik egyed, vagy sem) - a kapcsolat kizáró-vagy jellegű, vagy sem - a kapcsolatvonal színét, vastagságát Csoportos jelöltségű kapcsolatvonalak esetén a tulajdonságok beállítását a csoport valamennyi tagjára érvényesíteni kell. Kapcsolatvonalak törlése esetén gondoskodni kell a hozzá tartozó egyedtéglalapok törléséről is.
1.4 Objektumorientált programozás A vizuális tervező alkalmazásokkal különböző alakzatokat helyezhetünk el a képernyőn. Ezeknek az alakzatoknak megváltoztathatjuk bizonyos tulajdonságait, mint pl.: pozíció, méret, szín, stb. Rögtön felvetődik a gondolat, hogy alkossuk meg ezeknek az alakzatoknak egy olyan vázát, mely tartalmazza a rá vonatkozó adatokat, valamint az adatokon dolgozó eljárásokat. Az így meghatározott váz alapján ezután már könnyedén
10 tudnánk azonos viselkedésű alakzatokat (példányokat) létre hozni. Az ilyen feladatok megoldásának leghatékonyabb eszköze az objektumorientált programozás. Ebben a fejezetben szeretném néhány mondatban összefoglalni ezt a programozási szemléletet. „Az objektumorientált program egymással kommunikáló objektumok összessége, melyben minden objektumnak meg van a jól meghatározott feladata.”3 Az objektumorientált szemléletben az objektumok a modellezendő valós világ egyegy önálló egységét jelölik. Az objektumokat meghatározzák belső állapotuk és a nekik küldhető üzenetekre történő reagálásuk. Ez a „reagálás” jelentheti azt, hogy megváltozik az objektum belső állapota és/vagy az objektum elvégez valamilyen műveletet, kijelez a külső világ számára valamilyen értéket, üzenetet küld más objektumoknak, létrehoz, töröl, másol, illetve mozgat más objektumokat. Mivel ezeket az objektumokat egymástól meg kell tudnunk különböztetni, ezért minden objektum egyértelműen azonosítható. Tehát két objektum akkor sem azonos, ha tulajdonságaik, állapotaik tökéletesen a megegyeznek A valós világ leírásakor általában az objektumokat bizonyos tulajdonságaik azonossága alapján osztályokba soroljuk. Az osztályok csupán típusspecifikációk, minták, amelyek alapján objektum példányokat, objektumokat hozhatunk létre. A fenti feladatot alapul véve egy alakzat megfeleltethető egy objektumnak, míg annak váza megfeleltethető egy osztálynak Egy osztály definiálható kell, hogy legyen, mint egy másik osztály leszűkítése vagy kiterjesztése. Ekkor az új osztály a kiindulásul vett osztály örököse vagy utóda, illetve a kiindulásul vett osztály az új osztály szülője vagy őse. Az utód osztály tehát örökölhet tulajdonságokat és viselkedésformákat az ős osztálytól. Az utód osztályban csak az ős osztálytól való eltéréseket kell megadni. Tételezzük fel, hogy van egy négyzet osztályunk, mely rendelkezik egy méret és egy szín tulajdonsággal. Ha szükségünk van egy téglalap osztályra is, akkor a téglalapot a négyzetből örököltetjük és csupán egyetlen tulajdonsággal -egy újabb mérettel- egészítjük ki. Az öröklés miatt a másik méret és szín tulajdonsággal már rendelkezni fog. Az objektumok fontos tulajdonsága az egybezártság. Az objektumok belseje sérthetetlen, vagyis az objektumokat csak üzeneteken keresztül kérhetjük fel egy-egy művelet végrehajtására, melynek pontos elvégzéséért is az objektum a felelős. Az üzenetet feldolgozó programegységet (utasítássorozatot) metódusnak hívjuk. Az objektumok „felkérhetik” egymást különböző feladatok elvégzésére. Ezt a felkérést üzenetküldésnek, vagy kérelemnek szokás nevezni, amely valójában egy kívülről elérhető metódus meghívását jelenti. Az üzenetküldésben az üzenetet küldő objektum a ’Szerver’ az üzenetet fogadó a ’Kliens’. Természetesen ugyanaz az objektum lehet egyszer kliens, máskor szerver. Amennyiben minden alakzatnak meg akarjuk változtatni színét, akkor az alakzatokat tartalmazó objektum (ablak) egy-egy üzenet küld az alakzatoknak. A polimorfizmus az objektumok esetében azt jelenti, hogy az objektumhierarchiában a különböző objektumtípusok ugyanazt a tulajdonságot azonos néven definiálják, viszont ez más lehet a megvalósítás tekintetében. Ezáltal egy végrehajtandó 3
Angster Erzsébet, Az objektumorintált tervezés és programozás alapjai
11 feladat többféle alakban is szerepelhet, attól függően, hogy hol helyezkedik el az osztályhierarchiában. Tételezzük fel, hogy a téglalap és a négyzet objektumok rendelkeznek a nagyítás(százalék) metódussal. Ha négyzetnek küldünk egy nagyítás(5) üzenetet, akkor a négyzet – a saját metódusa alapján- 5 %-kal növeli oldalának értékét. Ugyan erre az üzenetre a téglalapnak növelnie kell minkét oldalának méretét. Tehát ugyan arra az üzenetre, eltérő a két objektum reagálása.
1.5 A logikai adatelemzés (Logical Data Model) Az adatfeldolgozási feladatokat egyfajta „szabványosított” modellekben un. adatmodellekben célszerű kezelni. Ezek a modellek három szerkezeti elemből: az egyedből, a tulajdonságból, és a kapcsolatból épülnek fel. E három elemből az egyedek és kapcsolatok ábrázolására több féle módszer terjedt el, mint például a Chen féle, a „varjú lábas” és az SSADM által javasolt. Ez utóbbi jelölésmód pontos leírását az SSADM dokumentációján belül a ’Logikai adatszerkezeti ábra’ fejezetben találhatjuk meg. Ennek célja, hogy egy áttekinthető ábrán jelenítse meg az egyedeket és kapcsolataikat, azok pontos leírása nélkül. (A leírásokat az objektumokhoz rendeljük, de azokat az ábrán nem szerepeltetjük.) Bár a technika meghatározza az egyedek és kapcsolatok jelölésmódját, az általam vizsgált egyetlen tervező eszköz sem támogatta ezt. A fő eltérést a kapcsolatok megjelenítésben találtam, illetve volt olyan, amely csak az attributomokkal ellátott egyedábrázolást támogatta. Ebben a fejezetben összefoglalom a logikai adatmodellezés fontosabb elemeit, valamint az SSADM által javasolt jelöléseket. Az adatmodellek alapelemei: -
Egyed Egyednek hívunk minden olyan dolgot, ami minden más dologtól megkülönböztethető és amiről adatokat tárolunk. Pl.: dolgozó, autó, személy. Az egyed konkrét dolgok absztrakciója, konkrét dolgokat fog egybe. Pl.: az autó mint egyed sok autót jelent. Egy egyed által képviselt konkrét elemek halmazát egyedhalmaznak is szoktuk nevezni. Pl.: a dolgozó nevű egyed egyedhalmaza az összes dolgozókból áll. Az egyed egy konkrét értékét az egyed egy előfordulásának nevezzük.
-
Tulajdonság Az egyedeket tulajdonságokkal (attribútomokkal) írjuk le. A tulajdonság az egyed egy jellemzője, ami megadja, meghatározza az egyed egy részletét. Pl.: A dolgozó nevű egyed tulajdonsági lehetnek: azonosító, név, cím, fizetés, stb. A tulajdonság is voltaképpen egy absztrakció, amely több elemet foglal egybe, tehát konkrét értékekből előfordulásokból áll.
-
Kulcs Amennyiben egy tulajdonság vagy tulajdonságok egy csoportja egyértelműen meghatározza, hogy az egyed melyik értékéről, előfordulásáról van szó, akkor ezeket a tulajdonságokat együtt elsődleges kulcsnak nevezzük.
12 -
Kapcsolat Kapcsolatoknak nevezzük az egyedek közötti viszonyt. A kapcsolat mindig valóságos objektumok közötti viszonyt fejez ki, hiszen az egyed ilyen objektumokat képvisel. Pl.: Ha vevő az egyik egyed a rendelés a másik, akkor a vevő és a rendelés egyedtípusok között vevő-rendelés kapcsolat van, hiszen a vevő rendelést ad le, a vevőhöz tartoznak rendelések. A kapcsolat foka: Attól függően, hogy egy adott egyed egy előfordulásához hány előfrodulás kapcsolódik a másik egyedből három esetet különböztetünk meg. a) Egy-egy típusú kapcsolat (1:1 kapcsolat) A kapcsolat lehet olyan, hogy az egyik egyedhalmaz mindegyik eleméhez a másik egyedhalmaz pontosan egy eleme kapcsolódik Az ilyen kapcsolatot egy-egy típusúnak nevezzük. Pl: a rendszám egyed és a gépkocsi egyed között a kapcsolat 1:1 b) Egy-több típusú kapcsolat (1:N kapcsolat) Legyen A és B két egyed. A két egyed között egy-több típusú kapcsolat van, ha az A egyedhalmaz mindegyik eleméhez a B egyedhalmaz több eleme is tartozhat. Pl: A számla egyed és a számlatétel egyed között 1:N kapcsolat van. Mindegyik számlához több tétel tartozik. Egy tétel nem tartozhat több számlához. c) Több-több típusú kapcsolat (N:M kapcsolat) Legyen A és B két egyed. A két egyed között több-több típusú kapcsolat van, ha az A egyed minden eleméhez a B egyedhalmaz több eleme tartozhat, és fordítva egy B-beli elemhez is több A-beli elemet rendelhetünk hozzá. Pl: Az alkatrész egyed és az autó egyed között N:M kapcsolat van. Egy alkatrész több autóba is beszerelhető és egy autó javításához több alkatrész is felhasználható.
A fentiek alapján egyszerűen megfogalmazjató az adatmodell fogalma: “Az adatmodell egyedek, tulajdonságok, és kapcsolatok halmaza, amely absztrakt módon tükrözi a valós objektumoknak, azok jellemzőinek (tulajdonságainak) és viszonyainak (kapcsolatainak) elvont kategóriáit.”4
4
Dr. Szelezsán János, Adatbázisok
13
A logikai adatmodell helye az SSADM-ben: A logikai adatmodellezés célja: „Valamely szervezet (vállalat, intézmény) működéséhez szükséges adatok feldolgozási követelményektől független és feldolgozó, ill. tároló eszközök lehetőségei által nem korlátozott leírása, belső, logikai szerkezetének meghatározása.”5 A logikai adatmodellezés (LDM, Logical Data Model) a logikai adatszerkezet és kapcsolódó dokumentumainak elkészítésére irányul. A technika az egyedek és köztük létezõ kapcsolatok elemzésére és leírására szolgál. Kezdetben az egyedek és kapcsolataik elemzése a feladat, aminek az eredménye egy adatszerkezeti ábra az elemzés alá vont területrõl. Ez az adatszerkezeti ábra, egyed-, kapcsolat- és attribútum-leírásokkal kiegészítve alkotja a logikai adatmodellt. A logikai adatmodell a következõ elemekbõl áll: • Logikai adatszerkezeti ábra (kiegészítve esetleg több részábrával) • Egyedleírások • Kapcsolatleírások • Attribútum-leírások (az adatjegyzék részeként) • Közös tartomány leírások (az adatjegyzék részeként) Ezen öt elemből a Logikai adatszerkezeti ábra elkészítését támogatja ez az alkalmazás. Az SSADM által javasolt jelölésmódok a LDM-nél: A logikai adatmodellezés egyfelől pontos és egyértelmű kíván lenni, másfelől világos és áttekinthető képet akar nyújtani. A kettőt úgy lehet összeegyeztetni, hogy áttekinthető ábrákon világos jelölésmóddal ábrázoljuk az egyedeket és kapcsolataikat, a pontos leírásokat viszont nem ábrázoljuk, hanem az ábrákon szereplő objektumokhoz rendeljük. Egyed Az egyedeket a logikai adatszerkezeti ábrán lekerekített sarkú téglalap jelzi, benne az egyed nevével (6. Ábra)
Számla 6. Ábra
5
Bana István, Az SSADM redszerszervezési módszertan
14 A logikai adatmodellek diagramjain a kapcsolattípusokat vonalakkal, a kapcsolat fokát a vonal végére rajzolt csirkelábbal ábrázoljuk. Ha kapcsolat egy ’csirkeláb’-ban végződik, az arra utal, hogy egy-több kapcsolatról van szó (7. Ábra). Vevõ
Megrendelés 7. Ábra
Persze nem csak egy-több kapcsolatok léteznek. Az egy-egy kapcsolatot egy egyszerű egyenessel jelöljük, azonban ezeket az adatmodellezés során egy-több kapcsolatokként értelmezzük (8. Ábra). A
B
AB
C
C
8. Ábra
A több-több kapcsolatot mindkét végén villás vonal jelzi. Ezeket több-egy kapcsolatokká bontjuk szét (9. Ábra). Számítógép
Alakatrész típus
Számítógép felépül felbontás megtalálható Csatoló
Alakatrész típus
9. Ábra
15 Ha kapcsolatot jelölő vonal egyik fele szaggatott, akkor nem feltétlenül tartozik a szaggatott vonal felöli egyed minden előfordulásához a másik egyednek egy előfordulása (10. Ábra). tartozik Bútor
Láb tartalmaz 10. Ábra
A kapcsolatok egyik különleges esete az, amikor egy és ugyanazon egyedtípus különböző előfordulásai állnak kapcsolatban egymással. Az ilyen kapcsolatokat rekurzív kapcsolatoknak nevezzük (11. Ábra). Alkatrész
Alkatrész
ekvivalens
Alkatrész
11. Ábra
Előfordulhat az is, hogy a logikai adatszerkezet leíró ábrán kizáró vagy-jellegű kapcsolatot kell ábrázolnunk. Ezt a kapcsolatra rajzolt fél körívvel ábrázoljuk. Az így csoportosítandó kapcsolatokat úgy kell rendezni, hogy egymás mellé kerüljenek (12. Ábra). Vevõ rendelés
Szállító rendelés
Rendeléssor
12. Ábra
Ahhoz, hogy a modell elemeire egyértelműen hivatkozni lehessen, szükség van ezek azonosítására. A kapcsolattípusoknak az „ortodox” SSADM-felfogásban nem is egy, hanem két nevet kell adni, azonban Bana István „Az SSADM Rendszerszervezési Módszertan” című könyvében több ellenérvet is felvet ezzel szemben (101.old.). Az általam megismert modellező programok is az „egy kapcsolat egy név elvet” követik, ezért saját alkalmazásomban én is ennek megfelelően járok el.
16
2 Rendszerterv 2.1 Nagyvonalú programterv
LDM Designer
Start ablak
Fõablak
Esemény
Model megnyitás
Új model
Model ablak
Model ablak
Model törlése
Kilép
13. Ábra
Model ablak
Esemény helye
Csúsztat
Kicsinyít / Nagyít
Tulajdon ság
Rajzasztal
Egyed
Kapcsolat
Esemény hatása
Esemény hatása
Esemény hatása
Ment
Nyomtat
Létrehoz
14. Ábra
Töröl
Tulajdonság (hely) (méret)
Létrehoz
Töröl
Tulajdonság (hely) (méret)
17
2.2 Osztálydiagram TForm Main
OptionSet
TStartForm
Main
TOptionsForm
Draw
TMainForm
...
+ ColorDialog TColorDialog + FontDilaog TFontDialog ....
+ Options:Toptions ...
+ Close
+ FontButtonClick ...
+ SBFileNewItemClick ...
HeadForm
TWorkPad 1
*
TFormHead
+ FileName: String + Desk: DrawingDesk ....
+ Project: TEdit + Model: TEdit ....
+ NewDesk ...
SSADMSys
TPersistent
TModelHead + Project + Model + Author + Version + Date
String String String String String
+ Create + Destroy
TPersistent
TOptions + GridColor: TColor + GridSizeX: Integer + GridSizeY: Integer + GridEnabled: Boolean + GridShow: Boolean + EntityWidth: Integer + EntityHeight: Integer + EntityBgColor:TColor + EntityFrameColor:Tcolor + EntityFrameWidth:Integer + EntityFont: TFont + ContactColor:TColor + ContactWidth:Integer
ShapEntity
TShape
+ Create + Destroy
TShapeEntity DrawingDesk
TPanel
TDrawingDesk
EntityProp
TDialogEntityProperties - ColorDialog: TColorDialog ... + BGColorClick ...
ContactProp
TDialogContactProperties + ColorDialog: TColorDialog ... + LineColorClick ...
PreviewForm
TFormPreview + SECopies: ... + ShowModal ...
TSpinEdit
- FCanvas: + DrawingTool: + EntityList: + ContactList: + PaperWidth: + PaperHeight: + Options: + ModelHead: + TrueWidth: + TrueHeight: + Percent: + HorzPages: + VertPages: # CBMemo # DialogEntityProperties # DialogContactProperties # FormPreview # ImageList ...
TCanvas TDrawingTool TList TList Integer Integer TOptions TTitle Integer Integer Integer Integer Integer TMemo TEntityProperties TContactProperties TPreviewForm TImageList
+ Create(AOwner: TComponent); override; + Destroy; override; + Update; override; + Paint; override; + Preview; + NewEntityCreate(X1,Y1:Integer):TShapeEntity; + NewContactLine(ShFrom,ShTo:TShapeEntity) :TContactLine; + SetEntityProperties(ParamEntity: TShapeEntity); + SetContactProperties(ParamContact: TContactLine); + CopyToClipboard; + CutToClipboard; + PasteFromClipboard; + SaveToFile(FileName:String); + LoadFromFile(FileName:String); + SelectedDelete ...
1
*
+ ID: + Pen: + Brush: + Text: + Marked: + TrueWidth: + TrueHeight: + TrueTop: + TrueLeft: + PozPercent + SizePercent: ...
Integer TPen TBrush TStrings Boolean Integer Integer Integer Integer Integer Integer
# Paint; override; + Create(AOwner: TComponent); override + Destroy; override ...
ContactEntity
TObject
TContactLine
1
*
- FPercent: Integer + DotBegin: Boolean + DotEnd: Boolean + LockOutBegin: Boolean + LockOutEnd: Boolean + LineColor: TColor + LineWidth: Integer + Enabled: Boolean + FromEntity: TShapeEntity + ToEntity: TShapeEntity + Points: TPoints + TruePoints: TPoints + Marked: Boolean + ID: Integer ... + SetTruePoint ...
18
2.3 Objektumdiagram FormStart: TFormStart
Optios: TOptions
MainFrom: TMainForm
1
*
WorkPad: TWorkPad
FormHead: TFormHead
1
OptionsForm: TOptionsForm
1
DialogContactProperties: TDialogContactProperties
1
*
ContactLine: TPersistent
1
*
ShapeEntity: TShape
Desk: TDrawingDesk
DialogEntityProperties: TDialogEntityProperties
FormPreview: TForm
Optios: TOptions
15. Ábra
ModelHead: TModelHead
19
2.4 Osztályleírás Osztály neve:
TDrawingDesk
Feladatleírás:
Az egyedtéglalapokat és kapcsolatvonalakat tároló, megjelenítő, vezérlő osztály. TPanel Megegyezik a gyerek-ablakok számával.
Közvetlen ős: Objektumok száma:
Private adatok FCanvas
Típus TCanvas
FPaperWidth FPaperHeight FOptions
Integer Integer TOptions
FHorzPages
Integer
FVertPages
Integer
FTrueWidth FTrueHeight FPercent
Integer Integer Integer
FModelHead
TTitle
Protected adatok DragX
Típus Integer
DragY
Integer
CBMemo
TMemo
DragContact ActualContact ActualLine
Record TContactLine Integer
ActualPoint
Integer
CursorStartX
Integer
Adatok Leírás A rajzfelületet biztosító TCanvas objektum. A TPanel osztály nem rendelkezik ezzel az objektummal, azonban egy őse, a TCustomControl igen. A papírlap magassága. A papírlap szélessége. Egy TOptions típusú rekord, mely az alapbeállítások adatait tárolja. A rajzasztalon vízszintesen elhelyezkedő papírlapok száma. A rajzasztalon függőlegesen elhelyezkedő papírlapok száma. A rajzasztal valódi szélessége pixelben. A rajzasztal valódi magassága pixelben. A nagyítás/kicsinyítés százalékos értéke, melynek alapja a valódi méretek. A modell fejléc adatait tartalmazó rekord A kurzor X koordinátája az egérgomb lenyomásának pillanatában. A kurzor Y koordinátája az egérgomb lenyomásának pillanatában. Memo objektum mely a modell szöveg transzformáltját tárolja, ezzel egyszerűen megoldható a Vágólap használata, valamint a modell mentése és betöltése. A vonszolt kapcsolatvonal adatai A vonszolt kapcsolatvonal A kapcsolatvonalat felépítő 4 szakaszból annak a sorszáma, amelyre kattintottunk. A kapcsolatvonalat felépítő 4 szakasz végpontjaiból annak a sorszáma, amelyre kattintottunk. Az kurzor X koordinátája az egér bal gombjának lenyomásának pillanatában.
20 CursorStartY
Integer
StartX1
Integer
StartY1
Integer
StartX2 StartY2 OPoints
Integer Integer TPoints
LineBreak Moving GroupMark X1,Y1 X2,Y2 oX2,oY2
Byte Boolean Record Integer
NewLineEndPoint
Record
X,Y
Integer Integer
Integer
oX,oY DialogEntityProperties DialogContactProperties FormPreview
Integer TEntityProperties
PrintingParam PageX1,PageY1
TPrintingParam Integer
PageX2,PageY2
Integer
ImageList
TList
Public adatok DrawingTool EntityList
Típus TDrawingTool TList
ContactList
TList
DeskMoveRec
Record
X
Az kurzor Y koordinátája az egér bal gombjának lenyomásának pillanatában. A vonszolt szakasz kezdő pontjának X koordinátája A vonszolt szakasz kezdő pontjának Y koordinátája A vonszolt szakasz vég pontjának X koordinátája A vonszolt szakasz vég pontjának Y koordinátája Az előzőleg kirajzolt kapcsolatvonal koordináta adatai A vonalban lévő töréspontok száma A vonszolási állapot jelzője A csoportos kijelölés keretének adatai A keret jobb-felső koordinátája (fix) A keret bal-alsó koordinátája (mozgó) A keret bal-alsó előző, mozgatás előtti koordinátája Az új kapcsolat létrehozásához használt segédvonal A segédvonal egérrel változtatott végkoordinátája Az előző vég-koordináta A egyedtéglalap jellemzőit beállító ablak (Form)
TContactProperties
A kapcsolatvonal jellemzőit beállító ablak (Form)
TPreviewForm
A nyomtatási képet megjelenítő és a nyomtatás néhány jellemzőjét beállító ablak (Form) A nyomtatás paramétereit tároló rekord A rajzasztalon kétdimenziós tömbben elhelyezkedő és nyomtatandó lap bal-felső indexe A rajzasztalon kétdimenziós tömbben elhelyezkedő és nyomtatandó lap jobb-alsó indexe A Preview-ban megjelenítendő lapok grafikus képét tároló lista.
Integer
Az aktuális rajzolási módot tárolja Az egyedtéglalapokat ábrázoló ShapeEntity-k tárolója A kapcsolatvonalakat ábrázoló TContact-ok tárolója A rajzasztal Drag and Move típusú mozgatásához szükséges adatokat tárolja Az kurzor X koordinátája az egér bal gombjának lenyomásának pillanatában.
21 Y
Integer
Enable MovedX
Boolean Integer
MovedY
Integer
Az kurzor Y koordinátája az egér bal gombjának lenyomásának pillanatában. A mozgatás engedélyezése és tiltása Az egér elmozdulásának nagysága vízszintesen az X pozícióhoz képest. Az egér elmozdulásának nagysága függőlegesen az Y pozícióhoz képest.
Published adatok PaperWidth PaperHeight Options
Típus Integer Integer TOptions
ModelHead TrueWidth TrueHeight Percent
TTitle Integer Integer Integer
HorzPages
Integer
VertPages
Integer
A papírlap magassága. A papírlap szélessége. Egy TOptions típusú rekord, mely az alapbeállítások adatait tárolja. A modell fejléc adatait tartalmazó rekord A rajzasztal valódi szélessége pixelben. A rajzasztal valódi magassága pixelben. A nagyítás/kicsinyítés százalékos értéke, melynek alapja a valódi méretek. A rajzasztalon vízszintesen elhelyezkedő papírlapok száma. A rajzasztalon függőlegesen elhelyezkedő papírlapok száma. Metódusok
Private metódusok SetPaperWidth SetPaperHeight SetOptions SetModelHead SetPercent SetHorzPages SetVertPages ChickenFoot DrawLockOutBegin DrawLockOutEnd DrawContactText RealContact ShapeEntityMouseDown ShapeEntityStartDrag ShapeEntityEndDrag AddEntityCBoard AddContactCBoard ReadCBoard
Beállítás: A papírlap szélessége Beállítás: A papírlap magassága Beállítás: A rajzasztal alapjellemzői Beállítás: A modell fejléce Beállítás: A rajzasztal és a rajzasztalon elhelyezkedő objektumok kicsinyítés/nagyítás tulajdonságainak beállítása. Beállítás: A vízszintesen elhelyezkedő papírlapok száma Beállítás: A függőlegesen elhelyezkedő papírlapok száma Egy kapcsolatvonalhoz tartozó ’csirkeláb’ kirajzolása Kizáró ív rajzolása a kapcsolatvonal elejére. Kizáró ív rajzolása a kapcsolatvonal végére. A kapcsolatvonal nevének kiírása (rajzolása) Meghatározza egy kapcsolatvonal és az általa összekötött egyedtéglalapok metszéspontját. Az egyedtéglalapon történt egérgomb lenyomás, mint esemény lekezelése. Az egyedtéglalap vonszolása előtt elvégzendő beállítások. Az egyedtéglalap vonszolása után elvégzendő beállítások. Egy egyedtéglalap szöveges adatként történő hozzáadása a CBMemo szövegtároló listájához. Egy kapcsolatvonal szöveges adatként történő hozzáadása a CBMemo szövegtároló listájához. Egyedtéglalapok és kapcsolatvonalak létrehozása, elhelyezése a CBMemo-ból történt kiolvasás után
22 WhereIsOldID CBMemoUpLoad
Public metódusok Create Destroy Paint Preview NewEntityCreate NewContactLine SetEntityProperties SetContactProperties CopyToClipboard CutToClipboard PasteFromClipboard SaveToFile LoadFromFile SelectAll IsAnySelected AllEnable SelectedDelete Protected metódusok MouseDown DeskDowndtArrow MouseUp MouseMove DragOver ShapesDragOver DragDrop ContactBeginDrag ContactDragMove LineDragMove PointDragMove NewContactDrop ContactEndDrag SelectedGroupDragDrop DrawContact DrawContactMark
A paraméterben megadott azonosító megkeresése az egyedtéglalapokat tároló listában. A rajzasztal valamennyi objektumának áttöltése a CBMemo-ba.
A rajzasztal létrehozása A rajzasztal törlése, megszüntetése A rajzasztalon lévő elemek megjelenítése Egy vázlatos nyomtatási kép megjelenítése, a nyomtatási paraméterek beállítása és a nyomtatás indítása. Egy új egyedtéglalap létrehozása a rajzasztalon Egy új kapcsolatvonal létrehozása a rajzasztalon A kijelölt egyedtéglalapok tulajdonságainak beállítása A kijelölt kapcsolatvonalak tulajdonságainak beállítása A kijelölt elemek másolása a vágólapra A kijelölt elemek áthelyezése a vágólapra A kijelölt elemek bemásolása a rajzasztalra a vágólapról A modell mentése fájlba Egy modell betöltése A rajzasztal minden elemének kijelölése, illetve jelöltségének megszüntetése (a paramétertől függően) Van-e jelölt elem a rajzasztalon Minden elem engedélyezése, aktívvá tétele illetve inaktívvá tétele (a paramétertől függően) A jelölt objektumok megszüntetése Az egér gombjának lenyomása az asztalon Az egér gombjának lenyomása az asztalon miközben a rajzeszköz (szerkesztő nyíl). Az egér gombjának felengedése az asztalon Az egér mozgatása az asztalon Vonszolás az asztal fölött Egyedtéglalap vagy csoport vonszolása az asztal fölött illetve az egyedtéglalap(ok) méretezése Egy vonszolt elem elengedése Egy kapcsolatvonal vonszolásához szükséges változók beállítása A vonszolt kapcsolatvonal mozgatásának megjelenítése A vonszolt kapcsolatvonal mozgatásának megjelenítése, ha a vonszolt elem vonal A vonszolt kapcsolatvonal mozgatásának megjelenítése, ha a vonszolt elem töréspont Egy vonszolt kapcsolatvonal elengedése Egy újonnan létrehozott kapcsolatvonal véglegesítése A vonszolt csoport elengedése Egy kapcsolatvonal kirajzolása Egy kapcsolatvonal jelöltségének kirajzolása (piros
23
CalcContactPoint ReCalcContactPoint StuckPoint DrawGroupMove MarkRectDraw RectOrder MarkWithInFrame SnapToGrid CursorOnAnyLine OnThePoint OnTheLine PointOnEntity ApplyContactProperties NewContactID NewEntityID AddHeadCBoard Printing PChickenFoot PRealContact PrintShapes PrintTitle PDrawLockOutBegin PDrawLockOutEnd SetMinMax PreviewShow PreviewClose
négyzet) Kiszámítja az új kapcsolatvonalat felépítő szakaszrendszer koordinátáit Kiszámítja egy kapcsolatvonalat felépítő szakaszrendszer koordinátáit, valamely esemény által kiváltott változás hatására. Egy megadott szakaszra, egy megadott pontból rábocsátott merőleges és a szakasz metszéspontja A csoport kijelölő keret mozgatása A csoport kijelölő keret kirajzolása A csoportos kijelölés keretének koordinátáinak rendezése A csoport kijelölő keret határain belül elhelyezkedő elemek jelöltre állítása Egy adott koordinátát a rajzasztal grid érékéhez igazítja Igaz értékkel tér vissza, ha az egérkurzor egy kapcsolatvonal felett áll a klikkelés pillanatában. Igaz értékkel tér vissza, ha az egérkurzor egy kapcsolatvonalat felépítő szakaszok végpontjai felett áll a klikkelés pillanatában. Igaz értékkel tér vissza, ha az egérkurzor egy kapcsolatvonalat felépítő szakasz felett áll a klikkelés pillanatában. Igaz értékkel tér vissza, ha a kapcsolatvonal végpontja az egyedtéglalapon van. A beállított jellemzők érvényesítése egy kapcsolatvonalon Új egyedi azonosító generálása egy kapcsolatvonal számára Új egyedi azonosító generálása egy egyedtéglalap számára A modell fejadatának másolása a vágólapra A modell lapjainak nyomtatása Egy kapcsolatvonal csirkelábainak nyomtatása Meghatározza egy kapcsolatvonal és az általa összekötött egyedtéglalapok metszéspontját. Az egyedtéglalapok nyomtatása A modell cím adatainak nyomtatása Egy kizáró kapcsolatot jelölő körív nyomtatása a kapcsolatvonal elejére. Egy kizáró kapcsolatot jelölő körív nyomtatása a kapcsolatvonal végére. A rajzasztalon kétdimenziós tömbben elhelyezkedő és nyomtatandó elemet tartalmazó lapok indexeinek beállítása A vázlatos nyomtatási kép megjelenítése A nyomtatási kép bezárása
24
Osztály neve:
TShapeEntity
Feladatleírás: Közvetlen ős: Objektumok száma:
Egy egyedtéglalap adatait, metódusait tároló osztály TShape Nincs korlátozva
Private adatok FPen FBrush
Típus TPen TBrush
FText
TStrings
FMarked FTrueWidth FTrueHeight FTrueTop
Boolean Integer Integer Integer
FTrueLeft
Integer
FPozPercent
Integer
FSizePercent
Integer
Protected adatok SizerBox x1,y1 x2,y2
Típus Array of Record Integer Integer
Public adatok ID OldID SizingPoint
Típus Integer Integer Integer
EntityMovePos
Record
oX1,oY1
Integer
oX2,oY2
Integer
MouseX, MouseY X1,Y1 X2,Y2 Dragged
Integer Integer Integer Boolean
Adatok Leírás Az egyedet ábrázoló téglalap keretének jellemzői Az egyedet ábrázoló téglalap felületének jellemzői Az egyedtéglalap megnevezését tároló szöveg lista Az egyedtéglalap jelöltsége Az egyedtéglalap valódi szélessége pixelben. Az egyedtéglalap valódi magassága pixelben. Az egyedtéglalap valódi függőleges koordinátája pixelben. Az egyedtéglalap valódi vízszintes koordinátája pixelben. A nagyítás/kicsinyítés (az egyedtéglalap pozíciójára vonatkozó) százalékos értéke, melynek alapja a valódi pozíció. A nagyítás/kicsinyítés (az egyedtéglalap méretére vonatkozó) százalékos értéke, melynek alapja a valódi pozíció. A méretező pontok (négyzetek) adatai. A méretező négyzet bal-felső koordinátája A méretező négyzet jobb-alsó koordinátája Az egyedtéglalap egyedi azonosító sorszáma Az egyedtéglalap régi azonosító sorszáma A 8 méretező pont közül az éppen aktuális sorszáma A rajzasztal Drag and Move típusú mozgatásához szükséges adatokat tárolja A méretező piros keret előző (mozgatás előtti) bal-felső koordinátája A méretező piros keret előző jobb-alsó koordinátája A kurzor X és Y koordinátája az egér bal gombjának lenyomásának pillanatában. A méretező piros keret bal-felső koordinátája A méretező piros keret jobb-alsó koordinátája Az egyedtéglalap vonszolási állapotának jelzője
25 Pen
TPen
Brush
TBrush
Text
TStrings
Marked TrueWidth TrueHeight TrueTop
Boolean Integer Integer Integer
TrueLeft
Integer
PozPercent
Integer
SizePercent
Integer
Az egyedtéglalapot ábrázoló téglalap keretének jellemzői Az egyedtéglalapot ábrázoló téglalap felületének jellemzői Az egyedtéglalap megnevezését tároló szöveg lista Az egyedtéglalap jelöltsége Az egyedtéglalap valódi szélessége pixelben. Az egyedtéglalap valódi magassága pixelben. Az egyedtéglalap valódi függőleges koordinátája pixelben. Az egyedtéglalap valódi vízszintes koordinátája pixelben. A nagyítás/kicsinyítés (az egyedtéglalap pozíciójára vonatkozó) százalékos értéke, melynek alapja a valódi pozíció. A nagyítás/kicsinyítés (az egyedtéglalap méretére vonatkozó) százalékos értéke, melynek alapja a valódi pozíció. Metódusok
Protected metódusok SizerBoxCalc Paint MarkOn FontChange MouseMove SetPen SetBrush SetText SetMark SetTrueWidth SetTrueHeight SetTrueTop SetTrueLeft SetPozPercent SetSizePercent
Public metódusok Create Destroy
A méretező pontok koordinátáinak meghatározása. Az egyedtéglalap kirajzolása A méretező pontok (négyzetek) kirajzolása Az egyedtéglalap betűtípusának beállítása Az egér mozgatása az egyedtéglalapon Beállítás: Az egyedet ábrázoló téglalap keretének jellemzői Beállítás: Az egyedet ábrázoló téglalap felületének jellemzői Beállítás: Az egyedtéglalap megnevezését tároló szöveg lista Beállítás: Az egyedtéglalap jelöltsége Beállítás: Az egyedtéglalap valódi szélessége pixelben. Beállítás: Az egyedtéglalap valódi magassága pixelben. Beállítás: Az egyedtéglalap valódi függőleges koordinátája pixelben. Beállítás: Az egyedtéglalap valódi vízszintes koordinátája pixelben. Beállítás: A nagyítás/kicsinyítés (az egyedtéglalap pozíciójára vonatkozó) százalékos értéke, melynek alapja a valódi pozíció. Beállítás: A nagyítás/kicsinyítés (az egyedtéglalap méretére vonatkozó) százalékos értéke, melynek alapja a valódi pozíció. Az egyedtéglalap létrehozása Az egyedtéglalap törlése, megszüntetése
26
Osztály neve:
TContactLine
Feladatleírás: Közvetlen ős: Objektumok száma:
Egy kapcsolatvonal adatait, metódusait tároló osztály TObject Nincs korlátozva Adatok Leírás A nagyítás/kicsinyítés százalékos értéke, melynek alapja a valódi méretek.
Private adatok FPercent
Típus Integer
Public adatok DotBegin DotEnd LockOutBegin LockOutEnd LineColor LineWidth Enabled FromEntity
Típus Boolean Boolean Boolean Boolean TColor Integer Boolean TShapeEntity
ToEntity
TShapeEntity
Points
TPoints
TruePoints
TPoints
Marked ID OldID
Boolean Integer Integer
Leírás A kapcsolatot jelölő vonal eleje pontozott A kapcsolatot jelölő vonal vége pontozott Kizáró kapcsolatot jelölő körív a vonal elejére Kizáró kapcsolatot jelölő körív a vonal végére A kapcsolatvonal színe A kapcsolatvonal vastagsága pixelben. A kapcsolatvonal engedélyezése/tiltása Az egyedtéglalap, amelyből a kapcsolatvonal kiindul. Az egyedtéglalap, amelybe a kapcsolatvonal befut. A kapcsolatvonalat jelölő szakaszok koordinátáit tároló tömb A kapcsolatot jelölő vonal eredeti koordinátáit tároló tömb A kapcsolatvonal jelöltsége A kapcsolatvonal egyedi azonosító sorszáma A kapcsolatvonal régi azonosító sorszáma Metódusok
Private metódusok SetPercent Public metódusok SetTruePoint
Beállítás: A nagyítás/kicsinyítés százalékos értéke, melynek alapja a valódi méretek. A kapcsolatvonal valódi pontjainak kiszámítása
27
Osztály neve:
TOptions
Feladatleírás: Közvetlen ős: Objektumok száma:
A rajzasztalok alapbeállításait tároló osztály. TPersistent 1 a MainForm főablakban + ahány rajzasztalt létre lett hozva.
Private adatok FGridColor FGridSizeX FGridSizeY FGridEnabled
Típus TColor Integer Integer Boolean
FGridShow FEntityWidth FEntityHeight FEntityBgColor FEntityFrameColor FEntityFrameWidth FEntityFont FContactColor FContactWidth
Boolean Integer Integer TColor Tcolor Integer TFont TColor Integer
Public adatok GridColor GridSizeX GridSizeY GridEnabled
Típus TColor Integer Integer Boolean
GridShow EntityWidth EntityHeight EntityBgColor EntityFrameColor EntityFrameWidth EntityFont ContactColor ContactWidth
Boolean Integer Integer TColor Tcolor Integer TFont TColor Integer
Adatok Leírás A rácspont színe A rácspontok közötti vízszintes távolság A rácspontok közötti függőleges távolság Az egyedtéglalapok pontrácshoz való igazításának engedélyezése A pontrács megjelenítésének engedélyezése Az egyedtéglalap szélessége Az egyedtéglalap magassága Az egyedtéglalap háttérszíne Az egyedtéglalap keretének színe Az egyedtéglalap keretének vastagsága Az egyedtéglalap font tulajdonsága A kapcsolatvonal színe A kapcsolatvonal vastagsága Leírás A rácspont színe A rácspontok közötti vízszintes távolság A rácspontok közötti függőleges távolság Az egyedtéglalapok pontrácshoz való igazításának engedélyezése A pontrács megjelenítésének engedélyezése Az egyedtéglalap szélessége Az egyedtéglalap magassága Az egyedtéglalap háttérszíne Az egyedtéglalap keretének színe Az egyedtéglalap keretének vastagsága Az egyedtéglalap font tulajdonsága A kapcsolatvonal színe A kapcsolatvonal vastagsága Metódusok
Public metódusok Create Destroy
Az objektum létrehozása Az objektum megszüntetése
28
Osztály neve:
TWorkPad
Feladatleírás: Közvetlen ős: Objektumok száma:
A rajzasztalt tartalmazó gyerekablak osztálya. TForm Nincs korlátozva
Public adatok MainMenu FileMenu FileNewItem FileOpenItem FileSaveItem FileSaveAsItem FilePrintItem FilePrintSetupItem FileExitItem EditMenu EditCutItem EditCopyItem EditPasteItem EditDelItem SelectAllItem OptionsMenu GeneralItem HeadItem WindowMenu WindowTitleItem WindowCascadeItem HelpMenu HelpAboutItem PrintSetupDialog FontDialog SaveDialog OpenDialog
Típus TMainMenu TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TPrintSetupDialog TFontDialog TSaveDialog TOpenDialog
Public adatok FileName Desk
Típus String TDrawingDesk
Adatok Leírás Menürendszer objektuma
A nyomtatót beállító dialógusablak A fontot beállító dialógusablak A mentés dialógusablaka A fájlnyitás dialógusablaka
Leírás A modell fájlneve A rajzasztal Metódusok
Public metódusok SetPageSize LoadFromFile NewMenuItem SetUpOptions SetProperties
A rajzasztalt felépítő lapok méreteinek beállítása Egy modell betöltése a háttértárolóról Új almenüpont hozzáadása a Window menüponthoz A rajzasztal alapbeállításának frissítése A rajzasztal vagy tartalmazott objektumainak jellemzőit beállító metódus
29 A rajzasztal kiválasztott egyedtéglalapjainak font-típusát beállító metódus Az ablak létrehozásakor végrehajtandó beállítások FromCreate Az ablak bezárása előtt végrehajtandó feladatok FormClose A rajzasztal rajzeszközét ’Szerkesztés’ állapotúra állító SBArrow metódus A rajzasztal rajzeszközét ’Új egyed’ állapotúra állító SBNewEntity metódus A rajzasztal rajzeszközét ’Új kapcsolat’ állapotúra állító SBNewContact metódus A rajzasztal rajzeszközét ’Görgetés’ állapotúra állító DeskMove metódus Egy új rajzasztal létrehozása NewDesk Az Edit menüpontra történő kattintáskor elvégzendő EditMenuClick beállítások A rajzasztal jelölt objektumainak áthelyezése a vágólapra EditCutItemClick A rajzasztal jelölt objektumainak átmásolása a vágólapra EditCopyItemClick A vágólap tartalmának beillesztése a modellbe EditPasteItemClick A rajzasztal jelölt objektumainak törlése EditDelItemClick A rajzasztal valamennyi objektumának jelöltre állítása SelectAllItemClick A rajzasztal középpontját a képernyő középpontjába állító SetCentreScrollBar metódus Az ablak aktívvá válásakor végrehajtandó metódus FormActivate A nagyítás/kicsinyítés százalékos értékének beállítása IncDecPercent A nagyítás/kicsinyítés értékének aktualizálása SetPercent Egy új modell betöltése FileOpenItemClick Új modell szerkesztő ablak létrehozása FileNewItemClick A modell mentése valamely háttértárolóra egy megadott FileSaveAsItemClick néven A modell mentése FileSaveItemClick A nyomtó paramétereit beállító dialógusablak megnyitása FilePrintSetupItemClick A rajzasztal nyomtatási képének megjelenítése PrintPreview A Window menüpontra kattintáskor elvégzendő beállítások WindowMenuClick A nyitott ablakok elrendezése WindowTitleItemClick WindowCascadeItemClick A nyitott ablakok elrendezése A választott menüpontnak megfelelő ablak aktívvá tétele WindowItemClick A rajzasztal felületén mozgó egér pozíciójának DeskMouseMove megjelenítése Az alapbeállítások dialógus ablak megnyitása GeneralItemClick A modell fejadatát beállító dialógus ablak megjelenítése HeadItemClick SetFont
30
Osztály neve:
TMainForm
Feladatleírás: Közvetlen ős: Objektumok száma:
Az alkalmazás keretablaka (szülőablaka) amely mintegy konténer osztály tartalmazza a rajasztal-ablakokat (gyerekablakokat), valamint vezérli is ezeket. TForm 1
Public adatok MainMenu FileMenu FileNewItem FileOpenItem FilePrintSetupItem FileExitItem HelpMenu HelpAboutItem PrintSetupDialog FontDialog OpenDialog StatusLine SpeedBar EditPanel SBNewModell SBOpenFile SBFileSave SBPrint SBZoomIn SBZoomOut SEPercent SBFont SBArrow SBNewEntity SBNewContact SBMove SBProperties
Típus TMainMenu TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TMenuItem TPrintSetupDialog TFontDialog TOpenDialog TSatusLine TPanel TPanel TSpeedButton TSpeedButton TSpeedButton TSpeedButton TSpeedButton TSpeedButton TMaskEdit TSpeedButton TSpeedButton TSpeedButton TSpeedButton TSpeedButton TSpeedButton
Adatok Leírás Menürendszer objektuma
A nyomtatót beállító dialógus ablak A fontot beállító dialógus ablak A fájlnyitás dialógus ablaka Bizonyos információkat megjelenítő tálca A nem szerkesztő gombokat tároló panel A szerkesztő gombokat tároló panel Új modell Fájlnyitás Mentés Nyomtatás Nagyítás Kicsinyítés A nagyítás/kicsinyítés százaléka Font-típus beállítás Szerkesztés Új egyed Új kapcsolat Vonszolás Jellemzők
Metódusok Public metódusok FormCreate FormActivate FileNewItemClick FileOpenItemClick FilePrintSetup FileExit HelpAbout SBNewEntityClick
Az létrehozásakor végrehajtandó metódus Az ablak aktívvá válásakor végrehajtandó metódus Új modell Fájlnyitás Nyomtató beállítás Kilépés About form megjelenítése Új egyed
31 SBArrowClick SBZoomInClick SBZoomOutClick SBNewContactClick SBMoveClick SBFontClick SBFileSaveClick SBPrintClick SBPropertiesClick EditPanelEnable FormClose ViewOptionsForm SetUpOptions OptionsRead
Szerkesztés Kicsinyítés Nagyítás Font-típus beállítás Vonszolás Font-típus beállítása Mentés Nyomtatás A tulajdonságok karbantartása A szerkesztő panel gombjainak engedélyezése Az ablak bezárásakor végrehajtandó metódus Az alapadatok karbantartása A rajzasztal alapadatainak frissítése Az Options form adatainak áttöltése az Options objektumba
32
Osztály neve:
TModelHead
Feladatleírás: Közvetlen ős: Objektumok száma:
A modell fejadatát tároló osztály. TPersistent Megegyezik a létrehozott rajzasztalok számával
Private adatok FProject FModel FAuthor FVersion FDate
Típus String String String String String
Leírás A projekt neve A modell neve A modell készítője A modell verziószáma Az utolsó módosítás dátuma
Public adatok Project Model Author Version Date
Típus String String String String String
Leírás A projekt neve A modell neve A modell készítője A modell verziószáma Az utolsó módosítás dátuma
Public metódusok Create Destroy
Az objektum létrehozása Az objektum megszüntetése
33
Osztály neve:
TDialogEntityProperties
Feladatleírás:
Egyedtéglalapok tulajdonságainak karbantartására szolgáló dialógusablak TForm Megegyezik a létrehozott rajzasztalok számával
Közvetlen ős: Objektumok száma:
Private adatok ColorDialog FontDialog ID SEWidth SEHeight FrameColor FrameWidth BGColor FontButton
Típus TColorDialog TFontDialog TLabel TSpinEdit TSpinEdit TPanel TSpinEdit TPanel TButton
OKBtn CancelBtn
TButton TButton
Adatok Leírás Az egyedtéglalap azonosító sorszáma Az egyedtéglalap szélessége Az egyedtéglalap magassága Az egyedtéglalap keretének színe Az egyedtéglalap keretének vastagsága Az egyedtéglalap háttérszíne Az egyedtéglalap szövegének font beállítására szolgáló nyomógomb A beállítások nyugtázására szolgáló nyomógomb A beállítások elvetésére szolgáló nyomógomb Metódusok
Public metódusok FrameColorClick BGColorClick FontButtonClick
A ColorDialog ablak megnyitása és a keretszín beállítása A ColorDialog ablak megnyitása és a háttérszín beállítása A FontDialog ablak megnyitása és a font tulajdonság beállítása
34
Osztály neve:
TDialogContactProperties
Feladatleírás:
Kapcsolatvonalak tulajdonságainak karbantartására szolgáló dialógusablak TForm Megegyezik a létrehozott rajzasztalok számával
Közvetlen ős: Objektumok száma:
Private adatok ColorDilaog ID RBLineStyle1 RBLineStyle2 RBLineStyle3 RBLineStyle4 SBLockOut1 SBLockOut1 SBLockOut1 LineColor LineWidth ContactName OKBtn CancelBtn
Típus TColorDialog TLabel TRadioButton TRadioButton TRadioButton TRadioButton TRadioButton TRadioButton TRadioButton TPanel TSpinEdit TEdit TButton TButton
Adatok Leírás A kapcsolatvonal azonosító sorszáma A kapcsolatvonal vonaltípusa 1. A kapcsolatvonal vonaltípusa 2. A kapcsolatvonal vonaltípusa 3. A kapcsolatvonal vonaltípusa 4. A kapcsolatvonal kizáró 1. A kapcsolatvonal kizáró 2. A kapcsolatvonal kizáró 3. A kapcsolatot felépítő vonalrendszer színe A vonal vastagsága A kapcsolatvonal megnevezése A beállítások nyugtázására szolgáló nyomógomb A beállítások elvetésére szolgáló nyomógomb Metódusok
Public metódusok LineColorClick
A ColorDialog ablak megnyitása és a vonalszín beállítása
Osztály neve:
TFormHead
Feladatleírás: Közvetlen ős: Objektumok száma:
A modell fejadatának karbantartására szolgáló dialógusablak TForm Megegyezik a létrehozott rajzasztalok számával
Private adatok EProject EModel EAuthor EProject EProject OKBtn CancelBtn
Típus TEdit TEdit TEdit TEdit TEdit TButton TButton
Adatok Leírás A project megnevezése A modell megnevezése A szerző neve Verziószám Dátum A beállítások nyugtázására szolgáló nyomógomb A beállítások elvetésére szolgáló nyomógomb
35
Osztály neve:
TPreviewForm
Feladatleírás:
A modell nyomtatási képének megjelenítésére és bizonyos nyomtatási paraméterek beállítására szolgáló dialógusablak TForm Megegyezik a létrehozott rajzasztalok számával
Közvetlen ős: Objektumok száma:
Private adatok SECopies CBFrame CBHead RBColor RBMono SEMargin PrintBtn CancelBtn
Típus TSpinEdit TCheckBox TCheckBox TRadioButton TRadioButton TSpinEdit TButton TButton
Adatok Leírás A nyomtatandó példányszám Keret nyomtatás beállítása Fejléc nyomtatása beállítása Színes nyomtatás beállítása Monokróm nyomtatás beállítása A margó távolsága a papírszélétől A nyomtatás indítása A nyomtatás elvetése
36
Osztály neve:
TOptionsForm
Feladatleírás:
A program alapbeállításainak karbantartására szolgáló dialógusablak TForm 1
Közvetlen ős: Objektumok száma:
Private adatok ColorDilaog FontDialog SEGridSizeX SEGridSizeY CBGridEnabled CBGridShow SEWidth SEHeight FrameColor FrameWidth BGColor FontButton
Típus TColorDialog TFontDialog TSpinEdit TSpinEdit TCheckBox TCheckBox TSpinEdit TSpinEdit TPanel TSpinEdit TPanel TButton
LineColor LineWidth OKBtn CancelBtn
TPanel TSpinEdit TButton TButton
Adatok Leírás A rácspontok közötti vízszintes távolság A rácspontok közötti függőleges távolság A rácsponthoz történő igazítás engedélyezése A rácspontok megjelenítése Az egyedtéglalap szélessége Az egyedtéglalap magassága Az egyedtéglalap keretének színe Az egyedtéglalap keretének vastagsága Az egyedtéglalap háttérszíne Az egyedtéglalap szövegének font beállítására szolgáló nyomógomb A kapcsolatot felépítő vonalrendszer színe A vonal vastagsága A beállítások nyugtázására szolgáló nyomógomb A beállítások elvetésére szolgáló nyomógomb Metódusok
Public metódusok FontButtonClick ContactColorClick FrameColorClick BGColorClick GridColorClick
A FontDialog ablak megnyitása és az egyedtéglalap font tulajdonságának beállítása A ColorDialog ablak megnyitása és a kapcsolatvonal színének beállítása A ColorDialog ablak megnyitása és az egyedtéglalap keretszínének beállítása A ColorDialog ablak megnyitása és az egyedtéglalap háttérszínének beállítása A ColorDialog ablak megnyitása és a rácspontok színének beállítása
37
Osztály neve:
TFormStart
Feladatleírás: Közvetlen ős: Objektumok száma:
A program indulása után megjelenő informális ablak TForm 1
Private adatok OKBtn
Típus TButton
Adatok Leírás A beállítások nyugtázására szolgáló nyomógomb
38
2.5 Metódusleírás 2.5.1
TDrawinDesk
constructor TDrawingDesk.Create(AOwner: TComponent); A rajzasztal objektum (DrawingDesk) létrehozása. Ez a metódus magában foglalja a következő objektumok létrehozását, is: - FCanvas, amely lehetővé teszi a panelre történő rajzolást. - ShapeList, egy TList típusú tulajdonság, amely tartalmazni fogja a rajzasztalon elhelyezett egyedtéglalapokat (Enity-ket) - ContactList, egy TList típusú tulajdonság, amely tartalmazni fogja a rajzasztalon elhelyezett kapcsolatvonalakat Contact-okat. - CBMemo egy TMemo típusú objektum, melynek kihasználjuk a clipboard és fájl kezelő metódusait. Igazából csak erre használjuk ezért nem szabad, hogy a rajzasztalon vizuálisan is megjelenjen. Ennek érdekében a következő beállításokat végezzük el: CBMemo.Visible:=False; CBMemo.Height:=0;
-
Szükség van néhány alapérték beállítására a vizuális megjelenés érdekében: - Az FVertPages, FHozPages tulajdonságoknak értéket adva meghatározzuk a vízszintes és a függőleges lapok számát a rajzasztalon. Az FPaperHeight és FPaperWidth segítségével egy lap nagyságát határozzuk meg. - Az FPercent azaz a nagyítás/kicsinyítés mértékét 15-re a rajzasztal színét pedig clTeal színűre állítjuk.
HorzPages 1
2
3
4
5
1
2
3
PaperWidth egy lap
16. Ábra
VertPages
-
FOptions, egy TOptions típusú objektum, amely tartalmazza a rajzasztal alapbeállításait. Szükséges, hogy objektum típus legyen annak ellenére, hogy csak adattárolásra használjuk, mert csak így tudjuk elérni, hogy értékei tervezési időben is állíthatóak legyenek az Object Ispector-ban. FModelHead, egy TModelHead típusú objektum, amely a modell fejléc adatait tartalmazza, hasonlóan az előbbi objektumhoz, ez is állítható tervezési időben. Létre kell hozni, továbbá három dialógus ablakot (EntityProperties, ContactProperties, FormPreview), melyek sorrendben az egyedtéglalapok, kapcsolatvonalak és nyomtatási paraméterek beállítását teszi lehetővé. A FormPreview egyúttal a nyomtatási kép megjelenítését is magában foglalja.
PaperHeight
-
39
destructor TDrawingDesk.Destroy; A rajzasztal objektum (DrawingDesk) megszüntetése. A rajzasztal megszüntetése természetesen magában foglalja a Create metódusban létrehozott objektumok és listák megszüntetését, az általuk foglalt memóriaterület felszabadítását.
Canvas.Free; EntityList.Free; ContactList.Free; CBMemo.Free; EntityProperties.Free; ContactProperties.Free; FormPreview.Free; FOptions.Free; FModelHead.Free;
Tulajdonságokat beállító metódusok: procedure TDrawingDesk.SetPaperWidth(Value: Integer); A papír szélességének (FPaperWidth) beállítása. A papír szélességének beállításakor TDrawingDesk.SetPaperWidth(Value: aktualizálni kell a rajztábla valódi-, valamint procedure Integer); rajzolási szélességét. A valódi szélesség Var R:Real; (FTrueWidth) a vízszintesen elhelyezkedő begin FPaperWidth:=Value; FTrueWidth:=Value*FHorzPages; lapok száma, valamint a paraméterként R:=FPercent/100; kapott papírszélesség szorzata. A rajzolási Width:=Trunc(FTrueWidth*R); szélesség (Width) pedig valódi szélesség és end; a nagyítási százalék (FPercent) szorzata. procedure TDrawingDesk.SetPaperHeight(Value: Integer); A papír magasságágának (FPaperHeight) beállítása. Aktualizálni kell a rajztábla valódi-, procedure DrawingDesk.SetPaperHeight(Value: valamint rajzolási magasságát. A valódi Integer); Var R:Real; magasság (FTrueHeight) a függőlegesen begin FPaperHeight:=Value; elhelyezkedő lapok száma, valamint a FTrueHeight:=Value*FVertPages; paraméterként kapott papírmagasság R:=FPercent/100; szorzata. A rajzolási magasság (Height) End;Height:=Trunc(FTrueHeight*R); pedig valódi magasság és a nagyítási százalék (FPercent) szorzata. Procedure TDrawingDesk.SetHorzPages(Value:Integer); A rajzasztalon vízszintesen elhelyezkedő papírlapok számának (FHorzPage) beállítása. Aktualizálni kell a rajztábla valódi-, valamint rajzolási szélességét (Width). A valódi szélesség (FTrueWidth) a vízszintesen elhelyezkedő papírszélesség, valamint a paraméterként kapott lapszám szorzata. A rajzolási szélesség pedig a valódi szélesség és a nagyítási százalék (FPercent) szorzata. Procedure TDrawingDesk.SetVertPages(Value:Integer); A rajzasztalon függőleges elhelyezkedő papírlapok számának (FVertPages) beállítása. Aktualizálni kell a rajztábla valódi-, valamint rajzolási magasságát (Height). A valódi magasság (FTrueHeight) a vízszintesen elhelyezkedő papírszélesség, valamint a paraméterként kapott lapszám szorzata. A rajzolási magasság pedig a valódi magasság és a nagyítási százalék (FPercent) szorzata. procedure TDrawingDesk.SetOptions(Value: TOptions); A rajzasztal alapjellemzőinek beállítása.
40 A TOptions egy saját előállítású objektum, melynek csak adattárolási feladata van. A record típus helyett azért kell objektum típusként deklarálni, mert csak e formában tudjuk, tervezési állapotban is szerkeszteni. procedure TDrawingDesk.SetModelHead(Value: TModelHead); A rajzasztal fejlécadatinak beállítása. Hasonlóan a fentiekhez a TModelHead is egy saját előállítású objektum. Ebben az esetben nincs szükség a Reapint metódus meghívására, mivel ennek értékei csak a nyomtatásban jelennek meg. Procedure TDrawingDesk.SetPercent(Value: Integer); A rajzasztal és a rajzasztalon elhelyezkedő objektumok kicsinyítés/nagyítás tulajdonságainak beállítása. A metódusban először magának a rajzasztalnak állítjuk be a Percent tulajdonságát, majd ezen érték valamint a rajzasztal valódi méreteinek (FtrueWidth, FTrueHeight) felhasználásával aktualizáljuk a megjelenítés méreteit (Width,Height). Természetesen a rajzasztal nagyítása / kicsinyítése szükségessé teszi a rajta elhelyezkedő valamennyi objektum nagyítását / kicsinyítését. Tehát végig haladva az egyedtéglalapokat, majd a kapcsolatvonalakat tartalmazó listán, egyenként állítjuk be ezek Percent értékeit. Az objektumoknál elvégzett egy-egy ilyen értékadás (TContactLine.SetPercent, TShapeEntity.SetPercent) elvégzi az adott objektum síkbeli méreteinek aktualizálását.
41
Procedure TDrawingDesk.SetContactProperties(ParamContact:TContactLine); Kapcsolatvonalak tulajdonságainak beállítása. Kapcsolat azonosító
A kizáró kapcsolat beállítása
A kapcsolat jellege A kapcsolat színe Vonalvastagság A kapcsolat megnevezése
17. Ábra
A metódus, a paraméterként kapott kapcsolatvonal tulajdonságait átviszi a beállításhoz használt dialógusba (DialogContactProperties). A dialógus ablakban történt beállítás után, nem csak a paraméterben kapott kapcsolatvonal tulajdonságát aktualizálja, hanem egy ciklussal végighaladva a kapcsolatvonal listán, az összes jelölt kapcsolatvonalét is, az ApplyContactProperties metódus meghívásával. Természetesen a kapcsolatvonal neve csak a paraméterben kapott kapcsolatvonalban aktualizálódik. Procedure TDrawingDesk.ApplyContactProperties(ActualContact: TContactLine); Egy kapcsolatvonal tulajdonságának aktualizálása. A paraméterként kapott kapcsolatvonal tulajdonságait frissítjük a dialógusablak (DialogContactProperties) értékeivel.
42
procedure TDrawingDesk.SetEntityProperties(Sender: TObject); A jelölt egyedtéglalapok jellemzőinek beállítása. Azonosító Szöveg Szélesség Magasság
Keretszín Háttérszín Keret vastagság Betûtípus
18. Ábra
Először aktualizáljuk a dialógus (EntityProperties) adatait a beállítást kezdeményező egyedtéglalap (Sender) tulajdonságaival. Megnyitjuk a dialógus ablakot szerkesztésre. Ha dialógus ablakot ’OK’-val hagytuk el, akkor végighaladunk az egyedtéglalapokat tartalmazó listán és a dialógus ablak értékeivel aktualizáljuk tulajdonságaikat. Ugyanazt a dialógus ablakot használjuk egyetlen egyedtéglalap és csoportos kijelölés esetén is. A dialógus ablakon vannak olyan adatok, amelyek nem csoport jellegűk: Azonosító (ID), Szöveg (Text). Ezeket az értékeket csoportos kijelölés esetén csak az aktuális (hívó) egyedtéglalap esetében aktualizáljuk. Egyéb metódusok Procedure TDrawingDesk.SnapToGrid(Var X,Y:Integer); A kapott koordinátát rácsponthoz igazító metódus. Az X,Y paraméterek értékét a rajzasztal If Options.GridEnabled Then Begin grid értékéhez ’igazítja’, menyiben az R:=Percent/100; engedélyezve van (Options.GridEnabRGridX:=Trunc(Options.GridSizeX*R); RGridY:=Trunc(Options.GridSizeY*R); led). X:= ((X+(X mod RGridX)) div RGridX)*RGridX; Az eredeti grid-méretekből elő kell Y:= ((Y+(Y mod RGridY)) div RGridY)*RGridY; End; állítani a nagyítás/kicsinyítésnek megfelelő arányos méretet (RGridX, RGridY), majd X és Y értéket ezekhez kell igazítani. Procedure TDrawingDesk.SelectAll(SValue:Boolean); Valamennyi, rajzasztalon elhelyezkedő objektum jelöltre állítása, illetve jelöltségüknek törlése, a kapott paraméternek (SValue) megfelelően.
43 Végig haladva az egyedtéglalapokat, majd a kapcsolatvonalakat tartalmazó listán, egyenként beállítjuk ezek Marked tulajdonságait. Ettől az értéktől függően jelennek meg az objektumokon a piros méretező pontok. Function TDrawingDesk.IsAnySelected():Boolean; A függvény, arra ad választ, hogy van-e jelölt objektum a rajzasztalon. Addig haladunk végig először az egyedtéglalapokat tartalmazó listán, majd -ha itt nem találunk-, a kapcsolatvonalakat tartalmazó listán, amíg nem találunk olyat, melynek Marked tulajdonság igaz értéken áll. Procedure TDrawingDesk.SelectedDelete; Valamennyi jelölt objektum megszüntetése. Először a kapcsolatvonalakat tartalmazó listán haladunk végig. Meg kell vizsgálni, hogy az adott kapcsolatvonal (ActualContact) jelölt-e, illetve azt is, hogy az adott kapcsolatvonal végpontján elhelyezkedő egyedtéglalapok (FromEntity, ToEntity) jelöltek-e. Mindkét esetben törölni kell a kapcsolatvonalat, mivel a későbbiekben a jelölt egyedtéglalap is törlésre kerül és egyetlen kapcsolatvonal végpontja sem ’lóghat a levegőben’. Az egyedtéglalapok esetében, egy ciklus segítségével végig haladva listán, megszüntetjük a jelölt egyedtéglalapokat. A törlés nem csak az adott objektum által lefoglalt memória felszabadítását (Free) jelenti, de gondoskodni kell az őket tartalmazó listák aktualizálásáról is, pontosabban az abból történő törléséről is. Procedure TDrawingDesk.AllEnable(EValue:Boolean); Valamennyi, rajzasztalon elhelyezkedő objektum elérhetőségének beállítása a kapott paraméternek (SValue) megfelelően. Végig haladva az egyedtéglalapokat, majd a kapcsolatvonalakat tartalmazó listán, egyenként beállítjuk ezek Enabled értékeit. Az objektumok ettől az értéktől függően fogadják el az üzeneteket. Pl.: egérkattintás. Function TDrawingDesk.NewEntityID():Integer; Egyedi azonosító meghatározása. Minden egyedtéglalaphoz meg kell határozni egy azonosítót, melyet ez a függvény szolgáltat. 0-tól kezdve, egyesével növelünk egy változót (ShapeId) mindaddig, amíg olyat nem találunk, amelyet még egyetlen egyedtéglalap sem tartalmaz. Function TDrawingDesk.NewContactID():Integer; A kapcsolatvonal egyedi azonosítójának meghatározása. Hasonlóan az egyedtéglalapokhoz, minden kapcsolatvonalhoz meg kell határozni egy azonosítót, melyet ez a függvény szolgáltat. 0-tól kezdve, egyesével növelünk egy változót (ShapeId) mindaddig, amíg olyat nem találunk, amelyet még egyetlen kapcsolatvonal sem tartalmaz. Function TDrawingDesk.WhereIsOldID(ID:Integer):TShapeEntity; A paraméterben megadott azonosító megkeresése az egyedtéglalapokat tároló listában. A keresés az OldID tulajdonságok vizsgálatával történik. A függvény találat esetén az egyedtéglalap mutatójával tér vissza, egyébként pedig Nil-el. Amikor a CBMemo-ból kiolvassuk a kapcsolatvonalakat, akkor ezzel a függvénnyel határozzuk meg a kapcsolatvonal FromEntity és ToEntity tulajdonságát.
44
Procedure TDrawingDesk.MarkWithInFrame; A csoport kijelölő keret (X1,Y1 ; X2,Y2)koordinátái által közrefogott objektumok jelöltre állítása Egy ciklus segítségével végig haladva az egyedtéglalapokat tároló listán megvizsgáljuk, hogy az egyedtéglalapok bal-felső illetve jobbalsó koordinátái a jelölő keret koordinátái között elyezkednek-e el. Amelyek igen, azokat jelöltre If (GroupMark.X1
Left+Width) and (GroupMark.Y1Top+Height) Then Marked:=True;
(x1,y1)
(x2,y2) 19. Ábra
állítjuk.
Egy újabb ciklussal végig haladunk a kapcsolatvonalakat tartalmazó listán és itt a kapcsolatvonalat felépítő valamennyi koordinátát ellenőrizzük. Amennyiben minden koordinátája a kereten belül helyezkedik el, akkor jelöltre állítjuk. J:=1; While (J<=4) and (GroupMark.X1Points[J].X) and (GroupMark.Y1Points[J].Y) Do J:=J+1; If J=5 Then Marked:=True;
Procedure TDrawingDesk.RectOrder(Var X1,Y1,X2,Y2:Integer); A kapott koordinátapár rendezése. Ez a metódus (X1,Y1) (X2,Y2) koordináta párokat a szerint rendezi, hogy melyik van közelebb az origóhoz. Erre az általuk közrefogott objektumok meghatározáshoz van szükség. Function TDrawingDesk.CursorOnAnyLine(x,y:Integer):Boolean; Igaz értékkel tér vissza, ha a paraméterként kapott pont egy egyenesen helyezkedik el. Egy ciklus segítségével végighaladva a kapcsolatvonalakat tároló listán, az OnThePoint függvénnyel megvizsgáljuk, hogy az (x,y) pont a kapcsolatvonal mely töréspontján helyezkedik el. Ha nem törésponton helyezkedik el, akkor egy újabb ciklus segítségével ismét végighaladva a kapcsolatvonalakat tároló listán, az OnTheLine függvénnyel megvizsgáljuk, hogy az (x,y) pont, a kapcsolatvonal mely szakaszán helyezkedik el. Találat esetén, a találat helyének megfelelően állítjuk be aDragContact rekord adatait.
Function TDrawingDesk.OnThePoint(x1,y1:Longint; x,y:Integer):Boolean; Igaz értékkel tér vissza, ha a paraméterként kapott (x,y) pont az (x1,y1) pont 3 pixelnyi környezetében helyezkedik el. Function TDrawingDesk.OnTheLine(x1,y1,x2,y2:Longint; x,y:Integer):Boolean; Igaz értékkel tér vissza, ha a paraméterként kapott (x,y) pont az (x1,y1; x2,y2) koordinátákkal meghatározott szakasz 3 pixelnyi környezetében van.
45 Rajzolást végző metódusok procedure TDrawingDesk.Paint; A rajzasztal tartalmát vizuálisan megjelenítő metódus. A rajzasztal megjelenítése
Rácspontok rajzolása
Oszlop
Lapszélek
Vízszintes lapszélek
Kapcsolatok
Függõleges lapszélek
Kapcsolatok kirajzolása
Sor
20. Ábra
Amennyiben a rajzasztal rácspontra vonatkozó paraméterei (GridEnabled, GridShow) engedélyezve vannak, kirajzoljuk a rácspontokat a megadott színnel (Color) és a megadott távolsági értékekkel (GridSizeX, GridSizeY). A rácspontok rajzolásakor ügyelni kell arra, hogy csak akkor változtassuk meg a színét a pontnak, ha az megegyezik a rajzasztal színével. Ezek után a lapok kirajzolása következik. A rajzasztal mindig a nagyítás/kicsinyítés (Percent) százalékos értékével arányos nagyságú, ezért a rajzasztalt vízszintesen annyi részre osztjuk, amennyi az előzetesen beállított vízszintesen elhelyezkedő lapok száma (HorzPages). Természetesen ez a függőleges elválasztó vonalak kirajzolását jelenti. Ugyanezt az eljárást követjük a vízszintes elválasztó vonalak kirajzolásakor is, de itt a felosztások számát a VertPages tulajdonság szolgáltatja. A kapcsolatvonalakat jelölő vonalak kirajzolása is itt történik. Végig haladva a kapcsolatvonalokat tároló listát, rendre meghívjuk azok kirajzolási metódusát (DrawContact). y:=GridSizeY; While y
46 procedure DrawingDesk.DrawContact(ActualContact:TContactLine; LineColor: TColor); A paraméterként kapott kapcsolatvonal kirajzolása a megadott színnel. DrawPoints[4] ChickenFoot
DrawPoints[3]
DrawPoints[2]
Points[3]
Points[4]
Name DrawPoints[1] (xh,yh)
DotBegin
Points[2] Points[1]
LockOutBegin
21. Ábra
Beállítjuk a kapcsolatvonalat alkotó szakaszok jellemzőit, színek, rajzmód, valamint a rajzasztal Percent értékével arányos vonalvastagságot. A vonal kirajzolása előtt a DrawPoints tömbben be kell állítani a vonal és az általa összekapcsolt egyedtéglalapok metszéspontjainak koordinátáit, melyet a RealContact metódus meghívásával érünk el. A kapcsolatvonalat felépítő vonalrendszert kétfelé osztva kell kirajzolni, mivel mindkét félnek eltérő lehet a vonal típusa (szaggatott, folytonos), ezért kiszámítjuk és az xh, yh változókban eltároljuk a vonalrendszer középpontját. Ezután már a DotBegin és a DotEnd tulajdonságok állapotának megfelelően tudjuk elvégezni a rajzolást. Az xh és yh koordináta alapján végezzük el a kapcsolatvonal nevének kiírását a DrawContactText metódus meghívásával. A kapcsolatvonal végére egy csirkeláb kerül kirajzolásra a ChickenFoot metódus meghívásával. Amennyiben a kapcsolat jellege kizáró, akkor ennek kirajzolását is elvégezzük a DrawLockOutEnd és DrawLockOutBegin metódusokkal. Procedure TDrawingDesk.DrawContactText(xh,yh:Integer; Text1:String); Egy szöveg (kapcsolatvonal nevének) elhelyezése a rajzasztalon. A szöveg kezdő koordinátáját úgy válasszuk meg, hogy annak közepe, vízszintesen az xh koordinátára essen, függőlegesen pedig az yh felett, a szöveg pixel magasságának háromszorosával jelenjen meg. CY:=Canvas.TextExtent(Text1).cy div 2 ; CX:=Canvas.TextExtent(Text1).cx div 2; Canvas.TextOut(xh-CX, yh-(CY*3), Text1);
47
Procedure TDrawingDesk.DrawContactMark(ActualContact:TContactLine); Egy kapcsolatvonal jelöltségének kirajzolása. A kapcsolatvonalat felépítő szakaszok közül a középső szakasz végpontjaira egy 3x3-as piros négyzetet rajzolunk. Jelölőlség pontok
22. Ábra
Procedure TDrawingDesk.ChickenFoot(ActualContact:TContactLine); A csirkeláb kirajzolása a paraméterben megadott kapcsolatvonalhoz. A kapcsolatvonalat felépítő szakaszokból az utolsót meghatározó koordinátákat rövidebb változókba tesszük át. (x3,y3; x4,y4). Akár el is lehetne hagyni, azonban rövidebb változókkal áttekinthetőbb a metódus további része. Meghatározzuk a csirkeláb magasságát (CFHeight) és szélességét (CFWidth) a nagyítás / kicsinyítés mértékével arányosan (22. Ábra). Ha a szakasz vízszintesen helyezkedik el (y3=y4), akkor el kell dönteni, hogy a csirkeláb csúcsa merre mutasson jobbra vagy balra. Amennyiben a szakasz első vízszintes koordinátája (x3) jobbra helyezkedik el a másodikhoz (x4) képest (23. Ábra), akkor a csirkeláb balra mutat, ellenkező esetben jobbra (24. Ábra).
(x4,y4) (x3,y3)
(x3,y3)
(x4,y4)
y3=y4 x3>y4
y3=y4 y3
23. Ábra
24. Ábra
48
Ha a szakasz függőlegesen helyezkedik el (x3=x4), akkor el kell dönteni, hogy a csirkeláb csúcsa merre mutasson fel vagy le. Amennyiben a szakasz első függőleges koordinátája (y3) a második (y4) felett helyezkedik el (25. Ábra), akkor a csirkeláb felfelé mutat, ellenkező esetben lefelé (26. Ábra).
(x3,y3)
(x4,y4)
(x4,y4)
(x3,y3)
x3=x4 y3
x3=x4 y3>y4
25. Ábra
26. Ábra
Procedure TDrawingDesk.MarkRectDraw(x1,y1,x2,y2:Integer); Jelölő keret rajzolása. Ez a metódus egy téglalapot rajzol a paraméterben megadott koordinátáknak megfelelően fekete színnel. Fontos, hogy a rajzolás módja pmNotXor típusú. Ezzel elérhető, hogy kétszer ugyanazt a keretet kirajzolva az elsőnél megjelenik egy piros keret, a második rajzolásnál pedig ugyanez eltűnik.
CFWidth x 3/4
CFWidth CFWidth x 2 27. Ábra
CFHeight
CFHeight/2
Procedure TDrawingDesk.DrawLockOutEnd(ActualContact:TContactLine); Kizáró ív rajzolása a paraméterben megadott kapcsolatvonal utolsó szakaszára. A kapcsolatvonalot felépítő szakaszokból az utolsót meghatározó koordinátákat rövidebb változókba tesszük át. (xF,yF; xT,yT). Meghatározzuk a körív magasságát (CFHeight) és szélességét (CFWidth) a nagyítás / kicsinyítés mértékével arányosan. Valójában nem egy körívet rajzolunk, hanem egy 4 szakaszból álló vonalrendszert. Az egyes szakaszok koordinátáit a CFWidth és a CFHeight értékének CFWidth/4 arányosításával határozzuk meg.
49
Ha a szakasz vízszintesen helyezkedik el (yF=yT), akkor el kell dönteni, hogy a körív domború oldala merre mutasson jobbra vagy balra. Amennyiben a szakasz első vízszintes koordinátája (xF) jobbra helyezkedik el a másodikhoz képest (xF<xT), akkor a körív balra mutat (28.Ábra), ellenkező (xT,yT) esetben jobbra. Az előbbiekhez hasonlóan kell eldönteni a függőlegesen elhelyezkedő szakaszra rajzolt körív orientációját (xF=yF). Amennyiben a (xF,yF) szakasz első függőleges koordinátája a második fölött helyezkedik el (yF
Procedure TDrawingDesk.DrawLockOutBegin(ActualContact:TContactLine); Kizáró ív rajzolása a paraméterben megadott kapcsolatvonal első szakaszára. Meghatározzuk a körív magasságát (CFHeight) és szélességét (CFWidth) a nagyítás / kicsinyítés mértékével arányosan. Ha a szakasz vízszintesen helyezkedik el (yF=yT), (xF,yF) akkor el kell dönteni, hogy a körív domború oldala merre mutasson jobbra vagy balra. Amennyiben a szakasz első vízszintes koordinátája jobbra helyezkedik (xT<xF) el a másodikhoz képest, akkor a (xT,yT) körív balra mutat (29. Ábra), ellenkező esetben jobbra. yF=yT Az előbbiekhez hasonlóan kell eldönteni a xF>xT függőlegesen elhelyezkedő szakaszra rajzolt körív orientációját (xF=xT). Amennyiben a szakasz első függőleges koordinátája a második fölött helyezkedik 29. Ábra el (yF
50
Koordináta beállító, transzformáló metódusok Procedure TDrawingDesk.RealContact(ActualContact:TContactLine; Var DrawPoints: TPoints); Meghatározza a paraméterben megadott kapcsolatvonal és az általa összekötött egyedtéglalapok metszéspontját. ToEntity
FromEntity
(x3,y3)
(x4,y4)
Width
Height
Metszéspont
(x2,y2)
Metszéspont
(Left,Top)
(x1,y1) 30. Ábra
A kapcsolatvonal két végpontja az egyedtéglalap területén helyezkedik el. Azonban kirajzolásukkor csak az egyedtéglalapon kívül eső részét szabad megjeleníteni. A kapcsolatvonalat felépítő szakaszok koordinátáit rövidebb változókba tesszük át (x1,y1; x2,y2; x3,y3; x4,y4). Először a kiinduló egyedtéglalap (FromEntiy) kapcsolódó pontját határozzuk meg. Ha az első szakasz vízszintesen helyezkedik el (y1=y2), akkor el kell dönteni, hogy a szakasz az egyedtéglalap jobb vagy baloldalára csatlakozik. Amennyiben szakasz első vízszintes koordinátája (x1) jobbra helyezkedik el a második (x2) koordinátájától, akkor a szakasz érintőpontja az egyedtéglalap vízszintes koordinátája + az egyedtéglalap szélessége (Left+Width), ellenkező esetben az egyedtéglalap vízszintes koordinátája (Left). Az előbbiekhez hasonlóan kell eldönteni a függőlegesen elhelyezkedő szakasz kapcsolódási pontját. Amennyiben a szakasz első függőleges koordinátája (y1) a második (y2) fölött helyezkedik el, akkor a szakasz érintőpontja az egyedtéglalap függőleges koordinátája + az egyedtéglalap magassága (Top+Height), ellenkező esetben az egyedtéglalap függőleges koordinátája (Top). Ugyanezen az elven határozzuk meg a kapcsolatvonal végére illeszkedő egyedtéglalap (ToEntity) és az utolsó szakasz metszéspontját. Az eredményt a DrawPoints tömb fogja tartalmazni.
51 Procedure TDrawingDesk.CalcContactPoint(ShFrom,ShTo:TShapeEntity; Var ActualContact:TContactLine); Kiszámítja a koordinátáit egy újonnan létrehozott kapcsolatnak. A kapcsolatvonal jellegének döntési menete:
31. Ábra
52
A kapcsolatvonal végpontjai az általa összekötött egyedtéglalapok középpontjába (tx1,ty1) (l2x,l2y)=(l3x,l3y)
(ttx,tty) (tx2,ty2)
(fx1,fy1)
Vég-egyed (ToEntity) Kezdõ-egyed (FromEntity)
(ffx,ffy) (fx2,fy2)
32. Ábra
helyezzük (32.Ábra). Ezeket jelölik az (ffx,ffy) koordináták a kezdő egyedtéglalap és (ttx,tty) koordináták a vég-egyedtéglalap esetében. Ezek után meg kell állapítani, hogy vízszintesen vagy pedig függőleges irányban nagyobbe a távolság a két egyedtéglalap között. Amennyiben vízszintesen, akkor megvizsgáljuk, hogy van-e közös része a függőleges távolságnak és vég-egyedtéglalap magasságának. Ha van, akkor egy cikk-cakk vonalat generálunk, figyelembe véve, hogy a kezdőegyedtéglalap a vég-egyedtéglalap felett, vagy pedig alatt helyezkedik el. Ha, nincs közös része a függőleges távolságnak és vég-egyedtéglalap magasságának, akkor egy derékszögű kapcsolatvonal adatait generáljuk le, melynek első szakasza az egyedtéglalap jobb- illetve bal oldalán helyezkedik el. Amennyiben a két egyedtéglalap közötti távolság függőleges irányba nagyobb, akkor meg vizsgáljuk, hogy van-e közös része a vízszintes távolságnak és az égVégegyed egyedtéglalap szélességének. Amennyiben van, akkor Közösrész egy cikk-cakk vonalat generálunk, attól függően, hogy a kezdő-egyedtéglalap a vég-egyedtéglalap jobb-t, vagy pedig baloldalán helyezkedik el. (33. Ábra) Ha, nincs közös része a vízszintes távolságnak és végegyedtéglalap szélességének, akkor egy derékszögű kapcsolatvonal adatait generáljuk le, melynek első szakasza az egyedtéglalap felső illetve alsó oldalán Kezdõegyed helyezkedik el. 33. Ábra
53
Procedure TDrawingDesk.ReCalcContactPoint(Var ActualContact:TContactLine); A kapcsolatot felépítő vonalrendszer újraszámítása. (tx1,ty1) Kezdõ-egyed (FromEntity)
(l3x,l3y)
(ttx,tty) (l4x,l4y) (tx2,ty2)
(fx1,fy1) (ffx,ffy)
(l1x,l1y) (l2x,l2y)
Vég-egyed (ToEntity)
(fx2,fy2)
34. Ábra
A 34. ábrán két egyedtéglalapot és az őket összekötő kapcsolatvonal egy lehetséges elhelyezkedése látható, feltüntetve a meghatározó koordinátákat. A kezdő-egyedtéglalapot az (fx1,fy1) és az (fx2,fy2) koordináta pár által közrezárt téglalap határozza meg. Az (ffx,ffy) koordináta az egyedtéglalap középpontját jelöli. A vég-egyedtéglalapot az (tx1,ty1) és az (tx2,ty2) koordináta pár által közrezárt téglalap határozza meg. Az (ttx,tty) koordináta az egyedtéglalap középpontját jelöli. A kapcsolat felépítő vonalrendszer egy 4 elemet tartalmazó tömbbel határozzuk meg, amely a kezdő-, vég-, és töréspontok koordinátáit tartalmazza.(l1x,l1y),..,(l4x,l4y). Amikor egy egyedtéglalapot, kapcsolatvonalat elmozdítunk, illetve megváltoztatjuk a rajzasztal nagyítás/kicsinyítés tulajdonságát, szükségessé válik a kapcsolatot felépítő szakaszok koordinátáinak aktualizálása.
54 Az aktualizálás menetét az alábbi Jackson ábrák szemléltetik (35-39. Ábra): Kapcsolat rajzolás
Egy egyenssel A két egyed egymáshoz összekapcsolható való viszonya
Egyszrű fel-le kapcsolat
Függőleges vonal
Egyetlen függõleges vonal rajzolása
Egyszrű jobbra-balra kapcsolat
A két egyed egymáshoz való viszonya
Vízszintes vonal
Egy egyenssel nem kapcsolható össze
Törésponttal rendelkezõ kapcsolat vizsgálat
Egyetlen vízszintes vonal rajzolása
35. Ábra
Törésponttal rendelkezõ kapcsolat vizsgálat
Vég-egyed helyzete
A kapcsolat vonalrendszerének vizsgálata
jobbra-fel
Vég-egyed helyzete
jobbra-le
A kapcsolat vonalrendszerének vizsgálata
36. Ábra
Vég-egyed helyzete
balra-fel
A kapcsolat vonalrendszerének vizsgálata
Vég-egyed helyzete
balra-le
A kapcsolat vonalrendszerének vizsgálata
55
37. Ábra
A fenti Jackson ábra sorozatban a több törésponttal rendelkező kapcsolatvonalak közül, csupán a jobbra-fent egyedtéglalap elhelyezkedés esetét részletezi. Ez elegendő mivel a többi 3 elhelyezkedés esetén is ugyanez a kapcsolatvonal-vizsgálat menete.
56 A Jakson ábra szerint az első, amit el kell dönteni, hogy a két egyedtéglalap összekapcsolható-e egyetlen egyenessel, vagyis nincs szükség töréspontra a kapcsolatvonal (tx1,ty1) ábrázolásához. Ennek megállapításához szükség van két (ttx,tty) függvényre. Az első (SimpleUporDown) akkor ad igaz (tx2,ty2) értéket, ha a kapcsolatvonal egyetlen függőleges vonallal megalkotható. Ehhez meg kell vizsgálni, hogy az l1x a tx1 és tx2 közé esik-e, az ábrának megfelelően. If ((l1x>=tx1) and (l1x<=tx2)) Then
(fx1,fy1)
(l1x,l1y) (ffx,ffy) (fx2,fy2) 38. Ábra
A második (SimpleLeftorRight) akkor ad igaz értéket, ha a kapcsolatvonal egyetlen vízszintes vonallal megalkotható. Ehhez meg kell vizsgálni, hogy az l1y a ty1 és ty2 közé esik-e (38. Ábra). Természetesen mindkét függvény be is állítja a két egyedtéglalapot összekötő kapcsolatvonal koordinátáit. If ((l1y>=ty1) and (l1y<=ty2)) Then
(tx1,ty1) (fx1,fy1) (ttx,tty) (ffx,ffy)
(l1x,l1y) (tx2,ty2) (fx2,fy2)
39. Ábra
Ha nem alkotható meg egyetlen vonallal a kapcsolatvonal, akkor tovább vizsgáljuk a két egyedtéglalap egymáshoz viszonyított helyzetét. Megvizsgáljuk, hogy a vég-egyedtéglalap a kezdő-egyedtéglalaphoz képest, jobbra-fent, jobbra-lent, balra-fent vagy balra-lent helyezkedik-e el (39. Ábra). If If If If
(ffxttx) (ffx>ttx)
and and and and
(ffy>tty) (ffytty)
Then Then Then Then
{Jobbra-Fent} {Jobbra-Lent} {Balra-Fent} {Balra-Lent}
57
(tx1,ty1) (tx1,ty1) (ttx,tty)
Kezdõ-egyed (FromEntity)
(ttx,tty)
(tx2,ty2)
(tx2,ty2)
(fx1,fy1)
Vég-egyed (ToEntity)
(ffx,ffy) (fx2,fy2) (tx1,ty1)
(tx1,ty1) (ttx,tty)
(ttx,tty) (tx2,ty2)
(tx2,ty2)
40. Ábra
A Jackson ábra szerint a jobbra-fent helyzetet részletezzük tovább. Megvizsgáljuk, hogy a két egyedtéglalap összekötését egy törésponttal rendelkező (derékszög-jellegű) kapcsolatvonallal, vagy pedig két törésponttal rendelkező (cikk-cakk jellegű) kapcsolatvonallal kell-e megoldani. A cikk-cakk jellegű összekötés csak a kapcsolatvonal, vonszolásával érhető el, az egyedtéglalap áthelyezésével nem. Amennyiben a kapcsolatvonal egy törésponttal rendelkezik és ez a pont a két egyedtéglalap egymáshoz legközelebb eső sarkai által közrezárt téglalap területén helyezkedik el, akkor cikk-cakk lesz az eredmény vonal jellege (41. Ábra).
(tx1,ty1) A vizsgált téglalap
Vég-egyed (ToEntity)
(ttx,tty)
Kezdõ-egyed (FromEntity)
(tx2,ty2)
(fx1,fy1)
m o zg atá s
(ffx,ffy)
(l2tx,l2y)=(l3x,l3y) (fx2,fy2)
41. Ábra
58
If (l2x=l3x) and (l2y=l3y) Then Begin If (l2xtx2) and (l2y>fy2) and (l2y
Az eredmény ebben az esetben így néz ki: Vég-egyed (ToEntity)
(tx1,ty1)
(l3x,l3y)
(ttx,tty)
Kezdõ-egyed (FromEntity)
(tx2,ty2)
(fx1,fy1) Cikk-cakk jellegû kapcsolat
(ffx,ffy)
(l2tx,l2y) (fx2,fy2)
42. Ábra
Ha kapcsolatvonal középső pontja négyzeten kívül esik, akkor derékszög jellegű kapcsolatvonallal fogjuk összekötni a két egyedtéglalapot. A Jackson ábrát követve azonban el kell dönteni, hogy a kapcsolatvonal jobbra-fel, vagy fel-jobbra jellegű lesz-e. Ennek eldöntéséhez megvizsgáljuk, hogy a kezdő-egyedtéglalap és a vég-egyedtéglalap középpontján áthaladó egyenes melyik oldalára esik a második töréspont (l2x,l2y) és ettől függően állítjuk be a vonal jellegét: jobbra-fel, vagy fel-jobbra (43. Ábra). (tx1,ty1)
(ttx,tty) Kezdõ-egyed (FromEntity)
(ffx,ffy)
m
o z ga tá s
(fx1,fy1)
(tx2,ty2) Vég-egyed (ToEntity)
(l2x,l2y)=(l3x,l3y) (fx2,fy2)
43. Ábra
59 Ennek megállapításához szükségünk van az (l2x,l2y) pontból az e egyenesre bocsátott merőleges és az e egyenes metszéspontjára (SP2.x,SP2.y) (44. Ábra). Amennyiben az l2x kisebb, mint az SP2.x és l2y kisebb, mint az SP2.y akkor az e egyenes fölött, egyébként pedig alatt helyezkedik el. If (l2x<SP2.X) And (l2y<SP2.Y) Then {Left-Down} Else {Down-Left}
(tx1,ty1) (l2x,l2y)=(l3x,l3y)
(ttx,tty)
Kezdõ-egyed (FromEntity)
(tx2,ty2)
e (fx1,fy1)
(SP2.x,SP2.y)
Vég-egyed (ToEntity)
(ffx,ffy) (fx2,fy2) 44. Ábra
A mozgatás eredménye: (tx1,ty1) (l2x,l2y)=(l3x,l3y)
(ttx,tty)
Kezdõ-egyed (FromEntity)
(tx2,ty2)
(fx1,fy1)
Vég-egyed (ToEntity)
(ffx,ffy) (fx2,fy2) 45. Ábra
60 A Jackson ábra másik főága, amikor a vonalrendszer két törésponttal rendelkezik, vagyis cikk-cakk jellegű. Vég-egyed (ToEntity)
(tx1,ty1)
(l3x,l3y)
(ttx,tty)
mo
gz
atá
s
Kezdõ-egyed (FromEntity)
A vizsgált téglalap
(fx1,fy1) (ffx,ffy) (l2x,l2y)
46. Ábra
Amennyiben a kapcsolatvonal két középső töréspontja (l2x,l2y; l3x,l3y) a két egyedtéglalap középpontját összekötő egyenes felett van akkor fel-jobbra (46. Ábra), ha alatta, akkor jobbra-fel jellegű lesz a kapcsolatvonal. Ha a két pont az egyenes ellenkező oldalán helyezkedik el, akkor megmarad a cikk-cakk jelleg. If (l2x>SP2.X) And (l2y>SP2.Y) And (l3x>SP3.X) And (l3y>SP3.Y) Then {Right-Up} Else If (l2x<SP2.X) And (l2y<SP2.Y) And (l3x<SP3.X) And (l3y<SP3.Y) Then {Up-Right} Else {Zig-Zag}
A mozgatás eredménye: (tx1,ty1) (l2x,l2y)=(l3x,l3y)
(ttx,tty)
Kezdõ-egyed (FromEntity)
(tx2,ty2)
(fx1,fy1)
Vég-egyed (ToEntity)
(ffx,ffy) (fx2,fy2) 47. Ábra
A törésponttal rendelkező kapcsolatvonalak további három ágának vizsgálata a fentiekkel azonos szerkezetben történik.
61
Function TDrawingDesk.StuckPoint(x1,y1,x2,y2:Longint; x,y:Integer):TPoint; A paraméterként kapott pontból (x,y), a szintén paraméterként kapott egyenesre (x1,y1; x2,y2) bocsátott merőleges és az egyenes metszéspontja. A koordináta megállapításának képlete: (x0,y0) x=
( x2 − x1 )( y1 − y0 )( y1 − y 2 ) + ( y1 − y 2 ) 2 + x0 ( x2 − x1 ) 2 ( y1 − y2 ) 2 + ( x2 − x1 ) 2
y=
( x2 − x1 ) x0 + ( y 2 − y1 ) y0 − ( x2 − x1 ) y2 − y1
(x2,y2)
(x,y (x1,y1) 48. Ábra
ahol, (x1,y1)(x2,y2) az egyenest meghatározó koordináták, (x0,y0) a vizsgált pont. Természetesen a programban figyelembe kell venni, hogy a nevezőben nem lehet nulla. Function TDrawingDesk.PointOnEntity(ActualShape:TShapeEntity; x,y:Integer) :Boolean; Igaz értékkel tér vissza, ha a paraméterként kapott pont az ugyancsak paraméterként kapott egyedtéglalapra esik. Ennek a függvénynek segítségével tartjuk a vonszolt kapcsolatvonal végpontjait az egyedtéglalapon.
62
Vágólap- és fájlkezelő metódusok Biztosítani kell az asztalon elhelyezkedő objektumok vágólapra történő kihelyezését és az onnan történő beillesztését. Ennek megoldása egy apró trükkel igen egyszerűen megoldható. Szükség van egy algoritmusra, amely képes az objektumok jellemző adatokat szöveges információvá alakítani valamint egy olyanra, amely ebből a szöveges adathalmazból képes reprodukálni a modellt. Nos ezt a szöveg halmazt egy Memo objektum Line tulajdonságába helyezve kihasználhatjuk a TMemo osztály Clipboard és File metódusait. A rajzasztal tartalmaz egy CBMemo objektumot, amely természetesen rejtve marad a felhasználó elöl. Procedure TDrawingDesk.CopyToClipboard; A rajzasztalon kijelölt objektumok másolása a vágólapra. Először kiürítjük a vágólapot, valamint a rajzasztal Memo objektumát. Egy ciklussal végighaladva az egyedtéglalapokat tartalmazó listán minden jelölt egyedtéglalap leírását átmásoljuk az AddEntityCBorad metódus meghívásával a CBMemo-ba, majd ugyanezt elvégezzük egy külön ciklus segítségével, a kapcsolatvonalak esetében is, az AddContactCBoard metódus meghívásával. Végül átmásoljuk a CBMemo szövegtartalmát a vágólapra és töröljük CBMemo tartalmát. Procedure TDrawingDesk.AddEntityCBoard(ActualShape: TShapeEntity); Egy egyedtéglalap szöveges adatként történő hozzáadása a CBMemo szövegtároló listájához. A szövegtároló több egyedtéglalap illetve kapcsolatvonal adatait tartalmazza, melynek visszaolvasáskor minden soráról el kell tudnunk dönteni, hogy éppen milyen típusú információt tartalmaz. Ennek megoldására egy kapcsos zárójelek közé foglalt betűt használunk. [S] S-el jelöljük, hogy az ezután következő sorok egy egyedtéglalap leírását tartalmazzák: – azonosító – háttérszín – keretszín – keretvastagság – a valódi pozíciója és mérete [F] F-el jelöljük, hogy az ezután következő sorok az egyedtéglalap Font tulajdonságait tartalmazzák: – színe – neve – mérete – stílusa [T] T-vel jelöljük, hogy az ezután következő sorok az egyedtéglalap szöveg tulajdonságát tartalmazzák. Procedure TDrawingDesk.AddContactCBoard(ActualContact: TContactLine); Egy kapcsolatvonal szöveges adatként történő hozzáadása a CBMemo szövegtároló listájához. [C] C-vel jelöljük, hogy az ezután következő sorok egy kapcsolatvonal leírását tartalmazzák: – kezdő-egyed azonosítója
63 – vég-egyed azonosítója – kapcsolatvonal azonosítója – színe – vastagsága – kapcsolatvonal neve – vonal eleje pontozott – vonal vége pontozott – kizáró körív a vonal elején – kizáró körív a vonal végén – vonalrendszer koordinátái [L]
L-el jelöljük, hogy az ezután következő sorok az egyedtéglalapot felépítő szakaszok koordinátáit tartalmazzák:
Procedure TDrawingDesk.AddTitleCBoard; A modell fejadatainak hozzáadása a CBMemo szövegtároló listájához. [H] H-val jelöljük, hogy az ezután következő sorok a fejadat leírását tartalmazzák: – egy fix szöveg mely utal arra, hogy egy LDM adatait tartalmazza a szövegtároló (SSADM Logical Data Model 1.0) – project neve – modell neve – szerző – verzió – dátum procedure TDrawingDesk.CutToClipboard; Az rajzasztalon kijelölt objektumok másolása a vágólapra. Elsőször kiürítjük a vágólapot, valamint a rajzasztal Memo objektumát. Egy ciklussal végighaladva az egyedtéglalapokat tartalmazó listán, minden jelölt egyedtéglalap leírását áthelyezzük a CBMemo-ba az AddEntityCBorad metódus meghívásával, majd ugyanezt elvégezzük egy külön ciklus segítségével a kapcsolatvonalak esetében is, az AddContactCBoard metódus meghívásával. Áthelyezzük a CBMemo szövegtartalmát a vágólapra és töröljük a CBMemo tartalmát. Mivel a 'kivágás vágólapra' művelet magával vonja a másolt objektumok megszüntetését, ezért meghívjuk SelectedDelete metódust, mely törli a jelöltre állított objektumokat. procedure TDrawingDesk.PasteFromClipboard; A vágólapon szereplő objektumok átmásolása a rajzasztalra. Feltöltjük a CBMemo-t a vágólap tartalmával, majd meghívjuk a ReadCBoard metódust, amely a vezérlő karakterek és az objektumok adatai alapján létrehozza és elhelyezi az egyedtéglalapokat és kapcsolatvonalakat a rajzasztalon. Ezek után el kell végeznünk az azonosítók aktualizálását. A kapcsolatvonalak rendelkeznek egy kezdő-egyedtéglalap (FromEntity) és egy végegyedtéglalap (ToEntity) tulajdonsággal. A vágólap használatakor ezeknek az objektumoknak az azonosítóit tároljuk. Amikor a vágólapról a rajzasztalra másoljuk az egyedtéglalapokat, előfordulhat, hogy azok azonosítói már léteznek, így a kapcsolatvonalak más egyedtéglalapokat fognak összekötni. Ennek elkerülése végett egy ideiglenes OldID tulajdonsággal ruházzuk fel az egyedtéglalapokat. Ezekben helyezzük el az azonosítókat és ezekre hivatkozunk a
64 kapcsolatvonal kirajzolásakor. Tehát az OldID-knek megfelelő egyedtéglalapok címeit helyezzük be a kapcsolatvonalak FromEntity és ToEntity tulajdonságaiba. Természetesen az objektumok rajzasztalon történt létrehozása és elhelyezése után, aktualizáljuk az azonosítókat. Végig haladunk egy ciklus segítségével az egyedtéglalapokon, majd a kapcsolatvonalakon és a NewEntityID illetve NewContactID függvényekkel új egyedi azonosítót osztunk ki ezen objektumoknak, mindeközben az OldID tulajdonságokat nullázzuk. Itt már nincs jelentősége az azonosítóknak abból a szempontból, hogy egy kapcsolatvonal mely két egyedtéglalapot köti össze, mivel magát az egyedtéglalapok címet tároljuk a kapcsolatvonal kezdő-, és vég-egyedtéglalap tulajdonságában. Procedure TDrawingDesk.ReadCBoard(IsFromFile:Boolean); Egyedtéglalapok és kapcsolatvonalak létrehozása, elhelyezése a rajzasztalon, a rajzasztal részét képező CBMemo objektum tárolt adatai alapján. A paraméterként kapott IsFromFile értéke dönti el, hogy egy fájlból történt beolvasás eredményén, vagy pedig a vágólap tartalma alapján kell elvégezni a reprodukciót, ugyanis a fejlécet csak fájl esetén kell aktualizálni. Megvizsgáljuk, hogy a Memo első sora megegyezik-e következő szöveggel: ’ SSADM Logical Data Model 1.0’. Amennyiben nem, akkor nem LDM típusú a tárolt adathalmaz. Egy ciklus alkalmazásával végig haladunk a Memo sorain, és eközben meghatározzuk a vezérlő karaktereket, melyek kapcsos zárójel között helyezkednek el. A karakterek különböző értéke vezérli a reprodukció folyamatát: [H] H-val jelöljük, hogy az ezután következő sorok a fejadat leírását tartalmazzák. Természetesen ezt csak akkor aktualizáljuk, ha fájlbeolvasás történt. [S] S-el jelöljük, hogy az ezután következő sorok egy egyedtéglalap leírását tartalmazzák: Ennek hatására létrehozzuk az új egyedtéglalapot és a további tárolt sorok alapján beállítjuk tulajdonságait. Az azonosítót az OldID tulajdonságába helyezzük. [F] F-el jelöljük, hogy az ezután következő sorok az előbb létrehozott egyedtéglalap Font tulajdonságait tartalmazza. Mivel itt a sorok száma változó lehet a font stílusok miatt, ezért egy belső ciklust iktatunk be, amely a következő ’[’ karakterig ’él’. A cikluson belül beállítjuk a font Bold, Italic, Underline, StrikeOut tulajdonságait, amennyiben ezekre utaló sort találunk. [T] T-vel jelöljük, hogy az ezután következő sorok az egyedtéglalap szöveg tulajdonságait tartalmazza. A font beállításához hasonlóan itt is egy belső ciklussal olvassuk ki az egyedtéglalap szöveg tulajdonsását. [C] C-vel jelöljük, hogy az ezután következő sorok egy kapcsolatvonal leírását tartalmazzák. Először kiolvassuk az általa összekötött kezdő- és vég-egyedtéglalap azonosítóját, majd megkeressük ezeket az egyedtéglalapokat az OldID tulajdonságaiknak vizsgálatával (WhereIsOldID). Találat esetén ezek címeire állítjuk a kapcsolatvonal FromEntity és ToEntity tulajdonságát. Tovább haladva a Memo sorain aktualizáljuk a kapcsolatvonal többi tulajdonságát. Ismételten egy belső ciklust kell használnunk pontozott és a kizáró körív létezésének beállításához. És végül, a kapcsolatvonalat felépítő szakaszok koordinátáit kell aktualizálni egy 1-től 4-ig tartó ciklus alkalmazásával. Procedure TDrawingDesk.SaveToFile(FileName:String); A modell fájlba mentése.
65 Először meghívjuk a CBMemoUpLoad metódust, amely feltölti a rajzasztal CBMemo-ját a modell objektumainak szövegtranszformáltjával. Meghívjuk a CBMemo.SaveToFile metódusát a paraméterként kapott fájlnévvel, amely egy text állományba helyezi CBMemo taralmát. Procedure TDrawingDesk.LoadFromFile(FileName:String); Egy új modell betöltése. Kiürítjük a CMemo-t, majd meghívjuk a CBMemo.Lines.LoadFromFile metódust a paraméterként kapott fájlnévvel. A Memo feltöltése után a ReadCBoard metódussal reprodukáljuk az abban szövegesen tárolt objektumokat. Mivel ez magában foglalja az OldID már ismertetett használatát, ezeket egy ciklus segítségével kinullázzuk és töröljük valamennyi objektum jelöltségét. Procedure TDrawingDesk.CBMemoUpLoad; A rajzasztal valamennyi objektumának áttöltése a CBMemo-ba. Először az AddTitleCBoard metódus meghívásával átmásoljuk a modell fejléc-adatait a CBMemo-ba. Ezek után két ciklus segítségével végighaladva az egyedtéglalapokat és kapcsolatvonalakat tároló listán, azok tartalmát az AddEntityCBoard és AddContactCBorad meghívásával hozzátoldjuk a CBMemo szövegtárolójához. Eseménykezelő metódusok Function TDrawingDesk.NewContactLine(ShFrom,ShTo:TShapeEntity): TContactLine; Egy új kapcsolatvonalat hoz létre a paraméterben megadott két egyedtéglalap között, melynek mente: - Létrehozzuk a kapcsolatvonal egy új példányát - Beállítjuk az összekötött egyedtéglalapokat tároló tulajdonságait (FromEntity, ToEntity) - Jelöltségét hamisra állítjuk (Marked) - Beállítjuk a nagyítás/kicsinyítés tulajdonságát (Percent), mely azonos a rajzasztal aktuális Percent értékével. - A rajzasztal alapbeállításának megfelelően beállítjuk a kapcsolatvonal színét (LineColor) és vastagságát (LineWidth) - Kiszámítjuk a kapcsolatvonalat felépítő szakaszok koordinátáit (CalcContactPoint). - Kiszámítjuk a kapcsolatvonalat felépítő szakaszok valódi, azaz rajzolási koordinátáit (ActualContact.SetTruePoint). - Felvesszük a kapcsolatvonalat, a kapcsolatvonalat tároló listába A függvény visszatérő értéke maga a létrehozott egyedtéglalap, pontosabban annak címe. Function TDrawingDesk.NewEntityCreate(X1,Y1:Integer):TShapeEntity; Egy új egyedtéglalapot létrehozó függvény Az egyedtéglalap létrehozásának menete a következő: - Meghatározunk egy új egyedtéglalap azonosítót (EntityNumber), melyet később beállítunk az egyedtéglalap ID tulajdonságában. - Létrehozzuk az egyedtéglalapot, és beállítjuk az azonosítóját. - A paraméterként kapott X1,Y1 rajzolási koordinátákat a rácsponthoz igazítjuk a SnapToGrid eljárás meghívásával
66 -
-
-
Beállítjuk a nagyítás/kicsinyítés tulajdonságát, mely a rajzasztal aktuális Percent értéke. Meghatározzuk az aktuális nagyítás/kicsinyítés százalékával arányos valódi pozíciókat (TrueLeft,TrueTop). Az egyedtéglalap további adatait a rajzasztal alapbeállítási értékei (Options) szolgáltatják: szélesség (TrueWidth) magasság (TrueHeight) háttérszín (Brush.Color) keretszín (Pen.Color) keretvastagság(Pen.Width) betűtípus (Font) Átirányítjuk az eseményeit a saját eljárásainkra: OnEndDrag (Vonszolás befejezése) OnMouseDown (Egérgomb lenyomása) OnStartDrag (Vonszolás elkezdése) Az egyedtéglalap szöveg tulajdonságának (Text) beállítása. Alapértelmezésben az ’Entity’ szó és az azonosító Végül felvesszük új egyedtéglalapunkat az őket tartalmazó listába (EntityList).
A függvény visszatérő értéke maga a létrehozott egyedtéglalap, pontosabban annak címe. procedure TDrawingDesk.ShapeEntityMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Az egyedtéglalapon történt egérgomb lenyomás, mint esemény lekezelése. Egérgom lenyomás az egyeden
Bal egérgomb
Egyedtulajdonság beállítása
Rajzeszköz: dtContact
Új kapcsolat...
Klikkelés Shift-tel
Jelöltség: Not Marked
Jelöltség vizsgálata
Az egyed nem jelölt Minden jelölés megszüntetése
49. Ábra
Egyed jelöltre állítása
Egyedvonszolás elõkészítése
67
Megvizsgáljuk, hogy bal vagy jobb egérgomb került lenyomásra. Amennyiben a jobboldali, és a rajzolóeszköz tulajdonság (DrawingTool) ’kapcsolatvonal’ (dtContact) módban van, akkor egy új kapcsolatvonal létrehozását kell elindítani. Tehát beállítjuk a kapcsolatvonalat jelölő vonal kezdő koordinátáit (NewLineEndPoint.X, NewLineEndPoint.Y), valamint az előző vonal törléséhez szükséges segédváltozókat (NewLineEndPoint.oX, NewLineEndPoint.oY). Elindítjuk a vonszolást (BeginDrag), és átállítjuk az egérkurzort crContact formára.
(NewLineEndPoint.oX, NewLineEndPoint.oY)
moz gás Kezdõpont (x,y) (NewLineEndPoint.X, NewLineEndPoint.Y)
50. Ábra
Ha a rajzolóeszköz nem kapcsolatvonal (dtContact), akkor megvizsgáljuk a shift billentyű állapotát. Amennyiben nyomva volt a kattintás időpontjában, akkor ellenkezőjére változtatjuk az egyedtéglalap jelöltségét, egyébként pedig az összes objektum jelöltségének törlése után, jelöltre állítjuk az egyedtéglalapot. Ezt követően előkészítjük, majd elindítjuk az egyedtéglalap vonszolását. Amennyiben az egér mutatója az egyedtéglalap nem valamelyik méretező pontján áll, akkor az egérkurzort EntiyDrag formára váltjuk. Továbbá a rajzoló eszközt ’csoportvonszolás’ (dmEntGroup) állapotúra állítjuk. Természetesen a vonszolás, csak akkor fog érvényesülni, ha az egérgomb a mozgatás alatt is nyomva marad. A jobb egérgomb lenyomása esetén meghívjuk az egyedtéglalap tulajdonságait beállító metódust. procedure TDrawingDesk.ShapeEntityStartDrag(Sender: TObject; Var DragObject: TDragObject); Az egyedtéglalap vonszolása előtt elvégzendő beállítások. Le kell tiltani az összes objektumot, mivel ezek fölött a vonszolás érvénytelen lenne. Továbbá igazra állítjuk az eseményt kiváltó egyedtéglalap vonszolt (Dragged) változóját. procedure TDrawingDesk.ShapeEntityEndDrag(Sender, Target: TObject; X, Y: Integer); Az egyedtéglalap vonszolása után elvégzendő beállítások. Engedélyezni kell a vonszolás előtt letiltott objektumokat, majd hamisra állítjuk az eseményt kiváltó egyedtéglalap Dragged változóját. Ha rajzolóeszköz ’kapcsolatvonal’ (dtContact) volt, akkor ezt alaphelyzetbe hozzuk.
68 A vonszolás (DragCursor) egérkurzor formáját visszaállítjuk az alapértelmezettre. Végül frissítjük a rajzasztalt. procedure TDrawingDesk.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Az egérgomb lenyomása, mint esemény kezelése. Az egérgomb lenyomásának hatását a rajzasztal rajzeszköz (DrawingTool) tulajdonságának értéke határozza meg. dtEntity: Új egyed létrehozása (NewEntityCreate) dtArrow: További vizsgálat (DeskDowndtArrow) dmMove: A vonszolás adatait tartalmazó rekord (DeskMoveRec) inicializálása. Az egér kurzor koordinátáinak tárolása és a vonszolás engedélyezése. Procedure TDrawingDesk.DeskDowndtArrow(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Az egérgomb lenyomás eseményének metódusa, ha a rajzeszköz 'szerkesztés' (dtArrow) állapotban van. Egérgomb lenyomás a rajzasztalon
Kattintás kapcsolaton
Kattintás a rajzasztalon
Minden jelölés megszüntetése
Jobb egérgomb
Kapcsolattulajdonság beállítása
Csoportos kijelölés elõkészítésa
Klikkelés Shift-tel
Jelöltség: Not Marked
Jelöltség vizsgálata
Kapcsolat jelöltre állítása
Rajzeszköz: dmContact (vonszolás)
A kapcsolat nem jelölt
Minden jelölés megszüntetése
51. Ábra
Ha kattintás pillanatában a kurzor egy kapcsolatvonalon állt, akkor megvizsgáljuk, hogy a bal, vagy a jobb egérgomb került-e lenyomásra. Amennyiben a jobboldali, akkor a kapcsolatvonal jellemzőinek beállítását kell elindítani. A bal gomb lenyomásakor megvizsgáljuk, a Shift gomb állapotát. A mennyiben nyomva volt a kattintás időpontjában, akkor ellenkezőjére változtatjuk a kapcsolatvonal jelöltségét, egyébként pedig az összes objektum jelöltségének törlése után, jelöltre állítjuk a
69 kapcsolatvonalat. Ezt követően előkészítjük a kapcsolatvonal vonszolását, a rajzeszközt dmContact állapotúra állítjuk. A változások érvényesítése érdekében újrarajzoljuk a rajzasztalt. Ha a kattintás pillanatában a kurzor a rajzasztalon állt, akkor az összes objektum jelöltségének törlése után, beállítjuk a csoport választó piros keret alapadatait és a rajzeszközt ’csoportos jelölés’ állapotra állítjuk (dmEntGroup). procedure TDrawingDesk.MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); Az egérgomb felengedés eseményének metódusa. Az egérgomb felengedésének hatását a rajzasztal rajzeszköz (DrawingTool) tulajdonságának értéke határozza meg. dmEntGroup: A csoportos kijelölés műveletének befejezése. Töröljük a csoport választó piros keretet és rendezzük a bal-felső és jobbalsó koordinátákat. Ezek után jelöltre állítjuk a kereten belül elhelyezkedő objektumokat és a rajzeszközt alaphelyzetbe hozzuk (dtArrow). dmContact: További beállítások végzünk a ContactEndDrag metódus meghívásával, majd alaphelyzetbe hozzuk a kurzort. dmMove: A vonszolás letiltása. procedure TDrawingDesk.MouseMove(Shift: TShiftState; X,Y: Integer); Az egér mozgatás eseményének metódusa. Az egér mozgatásának hatását a rajzasztal rajzeszköz (DrawingTool) tulajdonságának értéke határozza meg. dtArrow: Ha a jobb egérgomb le van nyomva és az egérkurzor legalább 5 pixelnyi elmozdulást produkált, akkor rajzeszközt csoportos kijelölés állapotúra állítjuk. dmEntGroup: A GroupMove metódus meghívása, amely a csoportos kijelölés keretének mozgatását végzi. dmContact: Ha az egér gombja lenyomott állapotban van, akkor egy újabba feltétellel megvizsgáljuk, hogy a kapcsolatvonal-vonszolás jelző be van-e állítva. Amennyiben igen, akkor a ContactDragMove eljárást, ellenkező esetben a ContactBeginDrag eljárást hívjuk meg. A ContactDragMove eljárás a kapcsolatvonal további vonszolását teszi lehetővé, míg a ContactBeginDrag egy új kapcsolatvonal-vonszolás alapadatait állítja be. dmMove: Az asztal csúsztatása, amennyiben az asztal felületének csúsztatása engedélyezett és a bal egérgomb is le van nyomva. procedure TDrawingDesk.DragDrop(Source: TObject; X, Y: Integer) A vonszolt objektum elengedés eseményének a kezelése. A vonszolt objektum elengedésének hatását a rajzasztal rajzeszköz (DrawingTool) tulajdonságának értéke határozza meg. dtContact: A NewContactDrop metódus meghívása, amely lezárja az új kapcsolatvonal szerkesztési folyamatát és létrehozza az új kapcsolatvonalat. dmEntGroupt: A SelectedGroupDragDrop metódus meghívása, amely véglegesíti a vonszolt, illetve átméretezett egyedtéglalapokat.
70 Procedure TDrawingDesk.ContactBeginDrag(x,y:Integer); Egy kapcsolatvonal vonszolásának elindítása. A vonszolt kapcsolatvonal adatait a rajzasztal DragContact rekordtípusú tulajdonsága tárolja, mely kezdő értékét a CursorOnAnyLine metódus meghívásakor kapja. A CursorOnAnyLine a következő adatokat állítja be: Moving: A mozgatás engedélyezése és tiltása. ActualContact: A kapcsolatvonal, amelyen ez egérgomb lenyomásra került. ActualPoint: A kapcsolatvonalat felépítő vonalrendszer azon töréspontjának a sorszáma, amelyen az egérgomb lenyomásra került. ActualLine: A kapcsolatvonalat felépítő vonalrendszer azon szakaszának a sorszáma, amelyen az egérgomb lenyomásra került. A vonszolás elkezdése előtt, töröljük a kapcsolatvonal rajzát az asztalról, majd ismét kirajzoljuk, de már a vonszolást jelölő piros vonallal. A ContactBeginDrag a következő adatokat állítja be: CursorStartX: A paraméterként kapott kurzorpozíció x koordinátája. CursorStartY: A paraméterként kapott kurzorpozíció y koordinátája. StartX1, StartY1: A kapcsolatot felépítő vonalrendszer vonszolt szakaszának kezdő koordinátája StartX2, StartY2: A kapcsolatot felépítő vonalrendszer vonszolt szakaszának vég koordinátája LineBreak: A töréspontok száma OPoints: A kapcsolatvonal előző koordinátái. Moving: A mozgatás engedélyezése
(StartX2,StartY2)
(CursorStartX,CursorStartY)
(StartX1,StartY1)
(x,y)
52. Ábra
Procedure TDrawingDesk.ContactDragMove(x,y:Integer); A vonszolt kapcsolatvonal mozgatása a rajzasztalon. A mozgatott kapcsolatvonal előző helyének törlése után, attól függően, hogy a vonszolt egység egy vonal, vagy töréspont hívjuk meg a LineDragMove, illetve a PointDragMove eljárást. Mindkét eljárás a vonszolt kapcsolatvonal új koordináta-adatait állítja be az egérkurzor helyzetének megfelelően.
71 Ezek után kirajzoljuk a vonszolt kapcsolatvonalat és elmentjük az aktuális koordináta adatokat. Procedure TDrawingDesk.LineDragMove(x,y:Integer); A vonszolt kapcsolatvonalat alkotó vonal mozgatása. Attól függően, hogy a kapcsolatvonal mely szakaszát vonszoljuk, különböző tevékenységeket kell elvégeznünk. 3. szakasz
2. szakasz Points[4] 1. szakasz Points[3]
Points[2]
Points[1]
53. Ábra
1. szakasz vonszolása A szakasz kezdőkoordinátájának beállítása csak abban az esetben végezzük el, ha az elmozdítás következtében az nem hagyja el a kezdő-egyedtéglalap területét. A következő lépésben aktualizáljuk a szakasz vég-koordinátáit, mivel ez ’szabadon’ van. (StartX2,StartY2)
(CursorStartX,CursorStartY) (x,y) (StartX1,StartY1)
mo zgá
s
54. Ábra
72
Az új koordináta beállítása a következő képlettel történik: Points[j].X:=StartX1+(X-CursorStartX); Points[j].Y:=StartY1+(Y-CursorStartY); Points[j+1].X:=StartX2+(X-CursorStartX); Points[j+1].Y:=StartY2+(Y-CursorStartY);
Points[..] j StartX1,StartY1: StartX2,StartY2: CursorStartX: CursorStartY: X,Y:
a töréspontokat tartalmazó tömb a töréspont sorszáma a vonszolt szakasz kezdő-koordinátája a vonszolt szakasz vég-koordinátája a szakasz ’megfogásának’ x koordinátája a szakasz ’megfogásának’ y koordinátája az egérkurzor aktuális koordinátája
A CursorStartX és CursorStartY értékét minden egyes mozdulás lekezelése után az éppen aktuálisra kell állítani. CursorStartX:=X;CursorStartY:=Y ;
Ha a kapcsolatvonal egyetlen törésponttal rendelkezik, a második és harmadik töréspontnak azonosnak kell lenni. Points[j+2].X:=Points[j+1].X; Points[j+2].Y:=Points[j+1].Y;
3. szakasz vonszolása A szakasz végkoordinátájának beállítását csak abban az esetben végezzük el, ha az elmozdítás következtében, az nem hagyja el a vég-egyedtéglalap területét. A következő lépésben aktualizáljuk a szakasz kezdő koordinátáit, mivel ez ’szabadon’ van. Az változók aktualizálása az 1. szakasz vonszolásával azonos módon történik, természetesen a megfelelő pont-indexek használatával. Points[j+1].X:=StartX2+(X-CursorStartX); Points[j+1].Y:=StartY2+(Y-CursorStartY); Points[j].X:=StartX1+(X-CursorStartX); Points[j].Y:=StartY1+(Y-CursorStartY);
2. szakasz vonszolása Abban az esetben, ha 3 töréspont található a kapcsolatvonalban és a középső szakasz kerül vonszolásra, akkor azt az eredeti szakasszal párhuzamosan kell elmozdítani. (StartX2,StartY2)
(CursorStartX,CursorStartY) (x,y) (StartX1,StartY1)
mo zg
ás
55. Ábra
73
Points[2].X:=StartX1+(X-CursorStartX); Points[2].Y:=StartY1+(Y-CursorStartY); Points[3].X:=StartX2+(X-CursorStartX); Points[3].Y:=StartY2+(Y-CursorStartY);
Procedure TDrawingDesk.PointDragMove(x,y:Integer); A vonszolt kapcsolatvonal töréspontjának mozgatása. A töréspontok mozgatásakor egyszerűen csak az egérkurzor pozíciójába kell áthelyezni a vonszolandó pont koordinátáját. Points[j].X:=X ; Points[j].Y:=Y ;
Ha a kapcsolatvonal egyetlen törésponttal rendelkezik, a második és harmadik töréspontnak azonosnak kell lenni. Points[3].X:=Points[2].X; Points[3].Y:=Points[2].Y;
Procedure TDrawingDesk. NewContactDrop (Source: TObject; X, Y: Integer); Az új kapcsolatvonal jelölő folyamat befejezése és a kapcsolatvonal létrehozása. Először töröljük a kapcsolatvonal kijelölésére használt piros segéd egyenest. A kapcsolatvonal kezdő-egyedtéglalapja a paraméterben kapott Source lesz, a második egyedtéglalap pedig az, amelynek a területén az egérgomb felengedésre került. Természetesen figyelni kell, hogy a kezdő-egyedtéglalap nem lehet azonos a végegyedtéglalappal. Ennek vizsgálatához egy ciklus segítségével végig haladunk az egyedtéglalapokat tároló listán és amelyiknek a koordináta-párja közre fogja az egér koordinátáját, az lesz a végegyedtéglalap. Ezek után meghívjuk a NewContactLine metódust a két egyedtéglalap paraméter átadásával, amely létrehozza az új kapcsolatvonalat. Procedure TDrawingDesk.ContactEndDrag; A kapcsolatvonal vonszolásának befejezése. Töröljük a vonszolás jelölésére használt piros vonalat, majd újra kalkuláljuk a vonszolás eredményeként kapott kapcsolatvonal koordinátáit. Kirajzoljuk a végleges kapcsolatvonalat és a DragContact rekord adatainak beállításával jelöljük a vonszolás befejezését. procedure TDrawingDesk.SelectedGroupDragDrop(Source: TObject; X, Y: Integer); A vonszolt illetve átméretezett egyedtéglalapok elengedése, véglegesítése. Egy ciklus segítségével végighaladunk az egyedtéglalapokat tároló listán és beállítjuk az új pozíciójukat, illetve méretüket az EntityMovePos értékeinek megfelelően. Minden egyedtéglalap rendelkezik az EntityMovePos tulajdonsággal, amely a következő adatokat tárolja: X1,Y1: Az egyedtéglalap piros körvonalának bal-felső koordinátája X2,Y2: Az egyedtéglalap piros körvonalának jobb-alsó koordinátája oX1,oY1: Az egyedtéglalap piros körvonalának előző bal-felső koordinátája oX2,oY2: Az egyedtéglalap piros körvonalának előző jobb-alsó koordinátája MouseX, MouseY: Az egyedtéglalapon annak a pontnak a koordinátája, ahol az egérgomb lenyomásra került
74 DragX, DragY:
A rajzasztalon annak pontnak a koordinátája, ahol az egérgomb lenyomásra került.
Az egyedtéglalapok valódi koordinátáját állítjuk be, melynek kiszámítása a következő képlettel történik. R:=Percent/100; TrueTop:=Trunc(EntityMovePos.Y1*(1/R)+0.5); TrueLeft:=Trunc(EntityMovePos.X1*(1/R)+0.5); TrueWidth:=Trunc((EntityMovePos.X2-EntityMovePos.X1)*(1/R)+0.5); TrueHeight:=Trunc((EntityMovePos.Y2-EntityMovePos.Y1)*(1/R)+0.5);
Természetesen az elmozdított, átméretezett egyedtéglalapokhoz tartozó kapcsolatvonalak koordinátáit aktualizálni kell. Egy ciklus segítségével végig haladva a kapcsolatvonalakat tároló listán, megvizsgáljuk, hogy az egyes kapcsolatvonalak kezdő- illetve vég-egyedtéglalapja jelöltre van-e állítva. Ha a kezdő egyedtéglalap jelölt, akkor kapcsolatvonal kezdő pontját, ha a végegyedtéglalap jelölt, akkor kapcsolatvonal vég-pontját módosítjuk az elmozdulás nagyságával. Az elmozdulás aktualizálása a következő képlettel történik: Points[1].x:=Points[1].x +(x-DragX); Points[1].y:=Points[1].y +(y-DragY); Points[4].x:=Points[4].x +(x-DragX); Points[4].y:=Points[4].y +(y-DragY);
Ahol az (x,y) az egér pozíciója a gomb felengedésének pillanatában. Mindkét esetben megvizsgáljuk hogy az átméretezés következtében nem csúsznak-e ki a kapcsolatvonal végpontjai az egyedtéglalap felületéről a PointOnEntity függvénnyel. Amennyiben kicsúszott, az egyedtéglalap középpontjába helyezzük a kapcsolatvonal kezdő-, illetve végpontját a CalcContactPoint metódussal, ellenkező esetben meghívjuk a ReCalcContactPoint metódust a kapcsolatvonal vonalainak pontos beállítása végett. procedure TDrawingDesk.DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); A rajzasztalon történő vonszolás, mint eseménynek kezelése. Az rajzasztalon történő vonszolás hatását a rajzasztal rajzeszköz (DrawingTool) tulajdonságának értéke határozza meg.
75
dtContact:
Két egyedtéglalap összekötése egy új kapcsolatvonallal. Egy piros szakaszt húzunk a kapcsolatvonal kezdő koordinátájától (NewLineEndPoint.X, NewLineEndPoint.Y) az egérkurzor aktuális koordinátájáig (X,Y). Az egérkurzor minden egyes elmozdulása után tároljuk annak koordinátáját (NewLineEndPoint.oX, NewLineEndPoint.oY). Ezen adat alapján végezzük az egér újabb mozgását megelőző vonaltörlést. (NewLineEndPoint.oX, NewLineEndPoint.oY)
(x,y)
moz gás
(NewLineEndPoint.X, NewLineEndPoint.Y)
56. Ábra
dmContact:
További beállításokat végzünk a ShapesDragOver metódus meghívásával.
Procedure TDrawingDesk.ShapesDragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); Az egyedtéglalap vonszolásának és átméretezésének, mint eseménynek a lekezelése. Az egyedtéglalapok vonszolási, átméretezési mehanizmusa során nem teszünk különbséget, abból a szempontból, hogy egyetlen, vagy több egyedtéglalapot mozgatunk. Továbbá az egyedtéglalapok mozgatásán túl az átméretezést is a Drag&Drop technika felhasználásával oldjuk meg. A mozgatás lekezelése előtt meg kell határoznunk az elmozdulás mértékét, az alap koordinátához képest. Ezt a koordinátát az egérkurzor lenyomásának pillanatában táruljuk el és az egyedtéglalapon belüli koordinátát jelenti (MouseX, MouseY). MoveX:=X-(Left + EntityMovePos.MouseX); MoveY:=Y-(Top + EntityMovePos.MouseY);
Ezek után egy ciklus segítségével végig haladva az egyedtéglalapokat tároló listán, a jelölteken elvégezzük ez egérmozgás hatását lekezelő beállításokat. Először megvizsgáljuk, hogy átméretezést kell-e végezni, melyről az egyes egyedtéglalapok SizingPoint tulajdonsága ad információt.
76 A SizingPoint 0-8 értékeket vehet fel, ahol 0 érték jelenti, hogy az egyedtéglalap mozgatásáról van szó. A többi 1-8 értékek az egyedtéglalapon lévő méretező pontok sorszámára utal. Tehát rajzasztalon történő átméretezés hatását az egyedtéglalap SizingPoint tulajdonságának értéke határozza meg.
1
2
8 7
3 4
6
5
57. Ábra
Az (XX1,XX2) a vonszolást jelölő piros keret bal-felső, az (YY1,YY2) pedig a jobb-alsó koordinátája. Az 1-es méretező pont mozgatásának hatására (XX1,YY1) az XX1 és YY1 értékét kell növelni, illetve csökkenteni az elmozdulás mértékével: MoveX, MoveY. Az XX2, YY2 koordináták ebben az esetben nem változnak. XX1:=(Left+MoveX); YY1:=(Top+MoveY) ; XX2:=Left+ Width; YY2:=Height+Top
Ehhez hasonlóan változtatjuk a megfelelő koordinátákat a többi méretező pont mozgatásának esetében is. A SizingPoint 0 értéke esetén az egyedtéglalap mozgatását kell elvégezni, amely azt jelenti, hogy mindkét koordinátapárt növelni, illetve csökkenteni fogjuk.
(XX2,YY2)
58. Ábra
XX1:=(Left+MoveX) ; YY1:=(Top+MoveY) ; XX2:=XX1 + Width ; YY2:=YY1 + Height;
Az így meghatározott (XX1,XX2 ; YY1,YY2) koordinátákkal meghívjuk a SnapToGrid metódust, amely beállítástól függően a rajzasztal rácspontjához igazítja a koordinátákat. Előfordulhat olyan mozgatás is, hogy a jobb-alsó koordináta közelebb kerül az origóhoz. Ennek rendezéséhez meghívjuk a RectOrder metódust. Végül töröljük az előző és kirajzoljuk az új koordinátáknak megfelelő jelölő keretet. oX1:=X1; oY1:=Y1; oX2:=X2; oY2:=Y2; MarkRectDraw(oX1,oY1,oX2,oY2); MarkRectDraw(XX1,YY1,XX2,YY2); X1:=XX1; Y1:=YY1; X2:=XX2; Y2:=YY2;
Az előző keret valamint az új keret koordinátáinak tárolására az EntityMovePos mezőit használjuk, ahol oX1,oY1,oX2,oY2 a előző (old) keret koordinátái X1,Y1,X2,Y2 az új keret koordinátái.
77 Procedure TDrawingDesk.GroupMove(x,y:Integer); A csoportos kijelölés keretének mozgatása A csoportos kijelöléshez használt tulajdonság a rekord típusú GroupMark, amely a következő mezőket tartalmazza: X1,Y1 a keret fix koordinátái, mely az egérgomb rajzasztalon történő lenyomásakor kap értéket X2,Y2 a keret mozgó koordinátája, mely az egér mozgását követi oX2,oY2 az egérkurzor előző koordinátája Első lépésben tehát frissítjük a GroupMark mozgó koordinátáját a paraméterként kapott egérkurzor koordinátáival. Ezután töröljük a régi keretet és kirajzoljuk az újat a MarkRectDraw metódus meghívásával. Végül elmentjük az aktuális ’új’ koordinátákat. X2:=X;Y2:=Y; MarkRectDraw(X1,Y1,oX2,oY2); MarkRectDraw(X1,Y1,X2,Y2); oX2:=X; oY2:=Y;
Nyomtatást végző metódusok Procedure TDrawingDesk.Preview; A rajzasztal nyomtatási képének megjelenítése, és a nyomtatási paraméterek beállítása. Másolatok száma
Fejléc nyomtatás
A nyomtatandó lapok
Keret nyomtatás Színes nyomtatás Monokróm nyomtatás
Margó távolsága a laspszéleitõl
59. Ábra
Meghívjuk a PreviewShow metódust, amely előkészíti a FormPreview dialógus ablakot, majd átadjuk neki a vezérlést. Amennyiben az ablakot ’OK’-val hagytuk el, akkor beállítjuk a PrintingParam rekord mezőit és meghívjuk a Printing metódust, vagyis elindítjuk a nyomtatást.
78 procedure TDrawingDesk.PreviewPrepare; A preview dialógus ablak előkészítése. Amennyiben a SetMinMax függvény igaz értékkel tér vissza, akkor van legalább egy egyedtéglalap a rajzasztalon. Ennek a függvénynek nem csak ez a feladata, hanem beállítja PageX1, PageY1 és PageX2, PageY2 változókat. Ezek a változók mutatnak, -mintegy mátrix index- a rajzasztalt alkotó lapok két szélső elemére. Tehát a PageX1,PageY1 azt a bal-felső lapot jelöli, amelyen már van egyedtéglalap, a PageX2,PageY2 jelöli azt a jobbalsó lapot, amin még van egyedtéglalap. (PageX1,PageY1) (6,5) 2
3
4
5
6
7
4
PaperHeight
5
6
PaperWidth
7
(PageX1,PageY1) (6,5)
60. Ábra
Létrehozunk egy listát, amelyek elemei egy-egy TImage típusú képre mutat. Ezekben a képekben fogjuk ábrázolni a rajzasztalt felépítő és a (PageX1, PageY1 ; PageX2, PageY2) keret által közrefogott lapok egy-egy egyedtéglalapját. A megjelenítendő képek mérete arányos az ábrázolandó lapok számával, mivel a megjelenítésre szánt terület fix. Meghatározzuk az ábrázolandó terület hosszabbik oldalát, melyet a DrawLonger változóban tárolunk el. DrawHeight:=(PageY2-PageY1+1)*2+((PageY2-PageY1+1)*PaperHeight); Drawidth:=(PageX2-PageX1+1)*2+((PageX2-PageX1+1)*PaperWidth); DrawLonger:=Drawidth; If DrawHeight>Drawidth Then DrawLonger:=DrawHeight; R:=200/DrawLonger;
Két egymásba ágyazott ciklus (sor,oszlop) segítségével létrehozzuk a szükséges mennyiségű képet, melyek tulajdonosa a dialógus ablak lesz. For Row:=PageY1 To PageY2 Do For Col:=PageX1 To PageX2 do Begin PageImage:=TImage.Create(Self); Try PageImage.Parent:=FormPreview;
79 Az egyes oldalak kicsinyített képét egy 200x200-as méretű panelen helyezzük el, ezért ehhez kell arányosítani a lapokat megjelenítendő kép magasságát és szélességét (R:=200/DrawLonger). PageImage.Width:= Trunc(PaperWidth * R); PageImage.Height:=Trunc(PaperHeight * R); PageImage.Left:=FormPreview.DrawFrame.Left+ 2 + (Col-PageX1)*2+((Col-PageX1)* PageImage. Width); PageImage.Top:=FormPreview.DrawFrame.Top+ 2 + (Row-PageY1)*2+((Row-PageY1)*PageImage.Height);
Ezek után rárajzoljuk az éppen megalkotott kép felületére, az eredeti oldalon szereplő egyedtéglalapokat, természetesen ez is a kicsinyítés arányában. For I:=0 To EntityList.Count-1 Do Begin ActualShape:=EntityList[I]; With ActualShape Do PageImage.Canvas.Rectangle( Trunc((TrueLeft-(Col*PaperWidth)) *R), Trunc((TrueTop- (Row*PaperHeight))*R), Trunc(((TrueLeft+TrueWidth)-(Col*PaperWidth)) *R), Trunc(((TrueTop+TrueHeight)-(Row*PaperHeight))*R)); End;
Végül az így elkészült képet hozzáadjuk tárolásukra létrehozott listához.
80
procedure TDrawingDesk.Printing; A rajzasztal tartalmának laponként történő nyomtatása. A nyomtatás során, lényegében újrarajzoljuk a rajzasztalon elhelyezett objektumokat a nyomtató rajzfelületén (Printer.Canvas). Hasonlóan a PreviewPrepare metódushoz, itt is a SetMinMax függvény értékétől tesszük függővé, hogy egyáltalán nyomtatunk-e. Két egymásba ágyazott ciklus (sor,oszlop) segítségével végig haladunk a (PageX1,PageY1 ; PageX2, PageY2) indexpárral meghatározott lapokon és kiküldjük őket a nyomtatóra. A rajzasztal nyomtatása
Példány
Lapok oszlopa
Lapok sora
Keret nyomtatás
Egyedek nyomtatása
Kapcsolatok nyomtatása
Egyedek
Kapcsolatok
Egyed nyomtatása
Csirkeláb nyomtatása
Kizáró körívek nyomtatása
Kapcsolat nyomtatása
61. Ábra
Procedure TDrawingDesk.PrintShapes(Col,Row:Integer); A paraméterben meghatározott lapon elhelyezett egyedtéglalapok nyomtatása. Valójában a rajzasztal minden objektumát ráhelyezzük a nyomtató rajzfelületére (Canvas), de mivel a Canvas méreteit a nyomtató felbontása határozza meg, ezért a nyomtatón csak Canvas-on szereplő rajz jelenik meg. Azok az objektumok melyek a canvas koordinátahatárain túllógnak, természetesen nem. Az egyedtéglalapok pozícióját és kiterjedését meghatározó értékek a rajzasztal bal-felső sarkában lévő (0,0) pozícióhoz van viszonyítva. Az egyes lapok nyomtatásakor az objektumok koordinátáit úgy kell meghatározni, mintha az origót a nyomtatás alatt lévő lap bal-felső sarkába helyeznénk. Egy ciklus segítségével végighaladunk az egyedtéglalapokat tartalmazó listán, és minden egyedtéglalap koordinátáján elvégezzük ; ezt a transzformációt. Az így kapott x1:=(TrueLeft-(Col*PaperWidth)) y1:=(TrueTop- (Row*PaperHeight)) ; értékek képezik a Canvas-ra rajzolandó x2:=((TrueLeft+TrueWidth)-(Col*PaperWidth)) ; y2:=((TrueTop+TrueHeight)-(Row*PaperHeight)); téglalapok koordinátáit. A Col,Row paraméterek tartalmazzák a nyomtatott lap indexét, az (x1,y1; x2,y2) koordinátapár pedig az egyedtéglalap keretét.
81 Be kell még állítani a keret vastagságát, színét, a háttérszínét. Ezek után történik a rajzolás RoundRect(x1,y1,x2,y2,50,50) metódussal. További számítások elvégzését igényli a szöveg tartalom kinyomtatása, mely a következő módon történik: CY:=(TextExtent(Text.Strings[0]).cy *Text.Count) div 2; For J:=0 To Text.Count-1 do Begin CX:=TextExtent(Text.Strings[J]).cx div 2; TextOut(X1+((X2-X1) div 2) - CX, Y1+((Y2-Y1) div 2) - CY + (TextExtent(Text.Strings[J]).cy * J), Text.Strings[J]); End;
CY tartalmazza a szöveg nyomtatásának kezdő függőleges koordinátáját figyelembe véve a szöveg fonttípusát jellemző pixelmagasságot valamint a középre helyezés igényét. Ezt elég egyszer meghatározni, mivel ez állandó vonatkozási pont lesz. CX tartalmazza a szöveg nyomtatásának vízszintes koordinátáját, itt is figyelembe véve a szöveg fonttípusát jellemző pixelmagasságot valamint a középre helyezés igényét. Ezt az érétket minden sorban meg kell határozni, hiszen a sorok szélessége eltérő lehet.
CXCX CYCY
szöveg A Aszöveg másodiksora sora második harmadiksora sora harmadik CXCX 62. Ábra
Procedure TDrawingDesk.PChickenFoot(ActualContact:TContactLine); A csirkeláb kirajzolása a paraméterben megadott kapcsolatvonalhoz. A kapcsolatvonalat felépítő szakaszokból az utolsót meghatározó koordinátákat rövidebb változókba tesszük át. (x3,y3; x4,y4). Akár el is lehetne hagyni, azonban rövidebb változókkal áttekinthetőbb a metódus további része. Meghatározzuk a csirkeláb magasságát (CFHeight) és szélességét (CFWidth) a nagyítás / kicsinyítés mértékével arányosan. Ha a szakasz vízszintesen helyezkedik el (y3=y4), akkor el kell dönteni, hogy a csirkeláb csúcsa merre mutasson jobbra vagy balra. Amennyiben a szakasz első vízszintes koordinátája jobbra helyezkedik el a másodikhoz képest (y3
(x4,y4)
(x3,y3)
(x4,y4)
(x3,y3) y3=y4 y3
63. Ábra
y3=y4 x3>y4 64. Ábra
82
Ha a szakasz függőlegesen helyezkedik el (x3=x4), akkor el kell dönteni, hogy a csirkeláb csúcsa merre mutasson fel vagy le. Amennyiben a szakasz első függőleges koordinátája a második felett helyezkedik el (y3
(x3,y3) (x4,y4)
(x4,y4)
x3=x4 y3>y4
x3=x4 y3
65. Ábra
66. Ábra
Procedure TDrawingDesk.PDrawLockOutBegin(DrawPoints:TPoints); Kizáró ív rajzolása a paraméterben megadott kapcsolatvonal első szakaszára. A kapcsolatvonalat felépítő szakaszokból az utolsót meghatározó koordinátákat rövidebb változókba tesszük át. (xF,yF; xT,yT). Meghatározzuk a körív magasságát (CFHeight) és szélességét (CFWidth) a nagyítás / kicsinyítés mértékével arányosan. CFWidth
CFHeight
(x3,y3)
67. Ábra
Ha a szakasz vízszintesen helyezkedik el (yF=yT), akkor el kell dönteni, hogy a körív domború oldala merre mutasson jobbra, vagy balra. Amennyiben a szakasz első vízszintes koordinátája jobbra helyezkedik el a másodikhoz képest (xF>XT), akkor a körív balra mutat (68. Ábra), ellenkező esetben jobbra. Az előbbiekhez hasonlóan (xF,yF) kell eldönteni a függőlegesen elhelyezkedő szakaszra rajzolt körív orientációját (xF=yF). Amennyiben a szakasz első függőleges koordinátája a második fölött helyezkedik el (yFxT
68. Ábra
83
Procedure TDrawingDesk.PDrawLockOutEnd(DrawPoints:TPoints); Kizáró ív rajzolása a paraméterben megadott kapcsolatvonal utolsó szakaszára. A kapcsolatvonalat felépítő szakaszokból az elsőt meghatározó koordinátákat rövidebb változókba tesszük át. (xF,yF; xT,yT). Akár el is lehetne hagyni, azonban rövidebb változókkal áttekinthetőbb a (xT,yT) metódus további része. Meghatározzuk a körív magasságát (CFHeight) és szélességét (CFWidth) a nagyítás / kicsinyítés (xF,yF) mértékével arányosan. Ha a szakasz vízszintesen helyezkedik el (yF=yT), yF=yT akkor el kell dönteni, hogy a körív domború oldala xF<xT merre mutasson jobbra vagy balra. Amennyiben a szakasz első vízszintes koordinátája balra helyezkedik el a másodikhoz képest (xF<xT), akkor a körív balra 69. Ábra mutat (69. Ábra), ellenkező esetben jobbra. Az előbbiekhez hasonlóan kell eldönteni a függőlegesen elhelyezkedő szakaszra rajzolt körív orientációját. Amennyiben a szakasz első függőleges koordinátája (yF) a második (yT) fölött helyezkedik el (yF
Procedure TDrawingDesk.PrintHead; A modell fejadatának nyomtatása.
84 2.5.2
A TShapeEntity osztály
Metódusok A TShapeEnity tervezési időben is beállítható, published jellemzői: A TShapeEntiy pozícióját a TrueLeft és a TrueTop, méretét a TruWidth és TrueHeight tulajdonságok valamint a PozPercent és SizePercent tulajdonságok értékei határozzák meg. A két Percent jellegű tulajdonság beállításával a SHapeEntity nagyítását illetve kicsinyítését valósíthatjuk meg.
Text
Brush
Több soros szöveg
Pen
TrueHeight
(TrueLeft,TrueTop)
TrueWidth
70. Ábra
A nagyítás/kicsinyítés bázisa tehát ’True’ kezdetű tulajdonságok, melyek meghatározzák az ősosztályból örökölt rajzolási pozíciót és méretet (Left,Top,Height,Width). A tökéletes működés érdekében nem szabadna állítani az eredeti Left,Top,Height és Width tulajdonságokat, azonban ennek letiltása nem lehetséges. A Brush tulajdonsággal a SHapeEntity háttér jellemzőit a Pen tulajdonsággal pedig a keret jellemzőit állíthatjuk be. A Text tulajdonság tartalmazza a ShapeEntity-ben megjelenő szöveget, míg a Font tulajdonsággal e szöveg jellemzőit tudjuk beállítani. A Marked tulajdonság értékével állíthatjuk be a ShapeEntity jelöltségét, melynek igazra állítása a 8 méretező pont megjelenését idézi elő. R:=FSizePercent/100; Height:=Trunc(FTrueHeight*R+0.5); Width:=Trunc(FTrueWidth*R+0.5); Top:=Trunc(FTrueTop*R+0.5); Left:=Trunc(FTrueLeft*R+0.5);
constructor TShapeEntity.Create(AOwner: TComponent); A ShapeEntity objektum létrehozása. A létrehozás magában foglalja az FPen, FBrush és FText objektumok létrehozását, továbbá az FPen, FBrush és Font tulajdonságok OnChange eseményeinek beállítását. destructor TShapeEntity.Destroy; A ShapeEntity objektum megszüntetése. A megszüntetés magában foglalja az FPen, FBrush és FText objektumok által foglalt memóriaterület felszabadítását.
85
procedure TShapeEntity.Paint; A ShapeEntity objektum kirajzolása. E metódus alapját a Delphi komponenseinek forráskódjából, a TShape.Paint metódusa képezi. (\DELPHI\SOURCE\VCL\EXTCTRLS.PAS) Néhány dologgal bővíteni kellett ezt a metódust. R:=FSizePercent/100; Az első a keret vastagságának meghatározása a NewWidth:=Trunc(FPen.Width*R+0.5); If NewWidth<1 Then NewWidth:=1; nagyítás/kicsinyítés mértékétől függően. Pen.Width:=NewWidth;
H
A szöveg elhelyezéséhez a ShapeEntity közepén, figyelembe kell venni a Font tulajdonságokat, valamint a CX nagyítás/kicsinyítés mértékét. A CY értékét elég egyszer, viszont a CX értékét a szöveg minden egyes CY A szöveg sorának kirajzolása előtt meg kell második sora határozni. A W és H a ShapeEntity azt a valódi szélességét illetve magasságát harmadik sora tárolják, amely már nem tartalmazza a keretvonal által elfoglalt területet. W 71. Ábra
CY:=(TextExtent(Text.Strings[0]).cy *Text.Count) div 2; For I:=0 To Text.Count-1 do Begin CX:=TextExtent(Text.Strings[I]).cx div 2; TextOut(X+(W div 2) - CX, Y+(H div 2) - CY + (TextExtent(Text.Strings[I]).cy * I), Text.Strings[I]); End;
Amennyiben az FMarked tulajdonság igaz értékén áll, azaz a ShapeEntity jelölt, akkor ki kell rajzolni a méretező pontokat. Ezt a MarkOn metódus meghívásával érjük el. Procedure TShapeEntity.MarkOn; A méretező pontok kirajzolása a ShapeEntity keretén. Meghívjuk a SizerBoxCalc metódust, amely beállítja a SizerBox tömb elemeit. E tömb 8 eleme a 8 méretező négyzet kirajzolásához szükséges koordinátapárokat tartalmazza. Ezek után egy ciklus segítségével végighaladunk a tömb elemein és a tárolt koordinátáknak megfelelően kirajzoljuk a négyzeteket.
86 procedure TShapeEntity.SizerBoxCalc; A méretező pontok koordinátáinak meghatározása. A SizerBox tömb első elemét meghatározó koordináták kiszámítása: With SizerBox[1] Do Begin X1:=0; Y1:=0; X2:=M; Y2:=M; End;
Az M egy konstans 5 érték, amely a méretező négyzet oldalának hossza. A második elem koordinátája: With SizerBox[2] Do Begin X1:=(Width div 2)-(M div 2); Y1:=0; X2:=(Width div 2)-(M div 2)+M; Y2:=M; End;
(x1,y1)
M (x2,y2)
1
2
8 7
A SizerBox egy eleme
3 4
6
5
72. Ábra
A további elemek meghatározása a forrásprogramba megtekinthető. Procedure TShapeEntity.MouseMove(Shift: TShiftState; X, Y: Integer); Az egér kurzorformájának beállítása a helyzetétől függően. Amennyiben az egér valamely méretező pont felett van, akkor a kurzorformáját át kell állítani, mégpedig a méretező pontnak megfelelő módon. A kurzorok formáját tároló tömb egy konstans CrMouseCursor. Az egér 1 2 3 mozgatása során meg kell vizsgálni, hogy a kurzor hányas számú méretező pont felett 73. Ábra tartózkodik. Ezt jelöljük N-el. A kurzor beállítása ezek után: If N>0 Then Begin If N>4 Then Cursor:=crMouseCursor[N-4] Else Cursor:=crMouseCursor[N]; SizingPoint:=N; DragCursor:=Cursor; End Else Begin Cursor:=crDefault; DragCursor:=crDrag; SizingPoint:=0; End;
4
A kurzorforma beállításán túl a SizingPoint tulajdonság beállításárát is el kell végeznünk, amely külső objektumok számára is elérhető. A DragCursor tulajdonság beállításával az esetleges vonszoláskor megjelenő kurzorformát határozzuk meg.
87
2.5.3
A ContactLine osztály
Metódusok A TContactLine published jellemzői: A kapcsolatvonalat felépítő vonalrendszert egy 4 elemet tartalmazó tömbbel határozzuk meg, amely a kezdő-, a vég-, és a töréspontok koordinátáit tartalmazza. A TruePoints tömb tartalmazza a bázis koordinátákat, amely alapja a nagyítás/kicsinyítés értékeinek, a Points tömb pedig a valódi rajzolási koordinátákat tartalmazza. LockOutEnd
DotEbd
Points[3]
Points[4]
DotBegin
Points[2] Points[1]
LockOutBegin
74. Ábra
A Percent tulajdonság beállításával a ContactLine nagyítását illetve kicsinyítését valósíthatjuk meg. Ez nem jelent mást, mint a kapcsolatvonalat felépítő szakaszok rajzolási koordinátáinak aktualizálását. R:=FPercent/100; For I:=1 To 4 Do Begin Points[I].X:=Trunc(TruePoints[I].X * R); Points[I].Y:=Trunc(TruePoints[I].Y * R); End;
A DotBegin, illetve DotEnd tulajdonság beállításával meghatározhatjuk a kapcsolatvonal első- illetve második felének pontozott vonalként történő ábrázolását. A LockOutBegin, illetve LockOutEnd tulajdonság beállításával érhetjük el, a kapcsolatvonal első-, illetve második felén történő félkörív megrajzolását. A LineWidth és LineColor tulajdonságokkal a kapcsolatvonal vastagságát illetve színét állíthatjuk be. Az Enabled tulajdonsággal szabályozhatjuk a kapcsolatvonal elérhetőségét.
88 A Marked tulajdonság értékével állíthatjuk be a ShapeEntity jelöltségét, melynek igazra állítása a ’méretező’ pont (pontok) megjelenését idézi elő. Jelölőlség pontok
75. Ábra
Procedure TContactLine.SetTruePoint; A valódi koordináták (TruePoints) meghatározása a rajzolási koordinátákból (Points). A Contact rajzasztalon történő elhelyezése, mozgatása a rajzolási koordináták beállításában nyilvánul meg, viszont a nagyítás bázisa mindig a valódi koordináta ezért szükséges ez a ’visszatranszformáló’ metódus.
89
2.5.4
A TWorkPad osztály
A WorkPad form esetében szükségünk van két tulajdonságra, az egyik a fájlnevét tároló FileName tulajdonság, a másik a rajztáblát megtestesítő TDrawingDesk típusú Desk elnevezésű objektum. procedure TWorkPad.FormCreate(Sender: TObject); A Form létrehozása után végrehajtandó metódus. Meghívjuk a NewDesk metódust, mely létrehozza a rajzasztalt (Desk) és beállítja annak tulajdonságait. procedure TWorkPad.FormClose(Sender: TObject; var Action: TCloseAction); A form bezárása előtt végrehajtandó metódus. Egy dialógus ablakon keresztül rákérdezünk a menés szükségességére. Az ablak elhagyásának módja alapján 3 eset lehetséges. - Fájlmentés Meghívjuk a FileSaveItemClick metódust, mely elvégzi a mentést. Amennyiben ez volt az utolsó gyermek-ablak, akkor letiltjuk a MainForm szerkesztő panelján elhelyezett gombokat, majd folytatjuk az ablak bezárását végző mechanizmust. - Nincs mentés Amennyiben ez volt az utolsó gyermek-ablak, akkor letiltjuk a MainForm szerkesztő panelján elhelyezett gombokat, majd folytatjuk az ablak bezárását végző mechanizmust. - Kilépés megszakítása Megszakítjuk az ablak bezárását végző mechanizmust. procedure TWorkPad.SetCentreScrollBar(Sender: TObject); Pozícionálás az ablak közepére. A függőleges és vízszintes gördítősáv pozicionálása a rajzasztal közepére, figyelembe véve a függőleges gördítősáv szélességét valamint a ToolBar és vízszintes gördítősáv magasságát. HorzScrollBar.Position:=(Desk.Width div 2)-((Width-12) div 2); VertScrollBar.Position:=(Desk.Height div 2) -((Height-12-32) div 2);
procedure TWorkPad.SBNewEntity(Sender: TObject); A MainForm ’New Entity’ üzenetének hatására végrehajtandó metódus. Letiltjuk a rajzasztalon elhelyezkedő valamennyi objektumot az AllEnable(False) metódussal, a Desk.AllEnable(False); Desk.DrawingTool:= dtEntity; rajzeszközt és az egérkurzort ’új egyedtéglalap’ Desk.Cursor:= crNewEntity; állapotra állítjuk. procedure TWorkPad.SBNewContact(Sender: TObject); A MainForm ’New Contact’ üzenetének hatására végrehajtandó metódus. Elérhetővé tesszük a rajzasztalon elhelyezkedő Desk.AllEnable(True); valamennyi objektumot az AllEnable(True) Desk.DrawingTool:= dtContact; metódussal, a rajzeszközt és az egérkurzort ’új Desk.Cursor:= crContact; kapcsolatvonal’ állapotra állítjuk.
90 procedure TWorkPad.SBArrow(Sender: TObject); A MainForm ’szerkesztés’ üzenetének hatására végrehajtandó metódus. Elérhetővé tesszük a rajzasztalon elhelyezkedő Desk.AllEnable(True); valamennyi objektumot az AllEnable(True) Desk.DrawingTool:= dtArrow; Desk.Cursor:= crDefault; metódussal, a rajzeszközt és az egérkurzort ’szerkesztés’ állapotra állítjuk. procedure TWorkPad.DeskMove(Sender: TObject); A MainForm ’Desk Moving’ üzenetének hatására végrehajtandó metódus. Elérhetővé tesszük a rajzasztalon elhelyezkedő Desk.AllEnable(False); valamennyi objektumot az AllEnable(True) Desk.DrawingTool:= dmMove; metódussal, a rajzeszközt és az egérkurzort Desk.Cursor:= crHand; ’csúsztató kéz’ állapotra állítjuk. procedure TWorkPad.NewDesk(Sender: TObject); A MainForm ’New ’ üzenetének illetve az ’New’ menüpont hatására végrehajtandó metódus. Létrehozzuk a Desk objektum egy példányát a TDrawingDesk osztályból. Beállítjuk - a vízszintesen és függőlegesen elhelyezkedő lapok számát (7,5), - a rajzasztal pozícióját az ablakban (0,0) - a rajzasztal háttérszínét (clTeal) - a nagyítás/kicsinyítés mértékét (15) - a rajzeszközt (dtArrow) Az egérmozgás eseményét átirányítjuk a DeskMouseMove metódusunkra és végül beállítjuk a lapok méretét a nyomtató paramétereinek megfelelően. procedure TWorkPad.SetPageSize(PageWidth, PageHeight:Integer); A paraméterként kapott lapmagasság és szélesség értékének átmásolása a rajzasztal megfelelő tulajdonságaiba. procedure TWorkPad.IncDecPercent(IPerc:Integer); A MainForm ’Zoom In ’, ’Zoom Out’ üzenetének hatására végrehajtandó metódus. Meghívjuk a SetPercent metódust a rajzasztal aktuális Percent érékének és az IPerc éték összegével. procedure TWorkPad.SetPercent(NewPercent:Integer); A rajzasztal nagyítás/kicsinyítés értékeinek beállítása. Megvizsgáljuk, hogy megfelelő-e a paraméterként kapott NewPercent értéke: - nagyobb-egyenlő mint 5, és - a nagyítás hatására kisseb lesz-e a rajzasztal magassága, mint 32769 - a nagyítás hatására kisseb lesz-e a rajzasztal szélessége, mint 32769 (Mivel a rajzasztal nem más, mint egy panel, melynek szélessége és magassága Integer típusú és a legnagyobb ábrázolható szám: 32769) Amennyiben megfelel a feltételeknek a NewPercent értéke, akkor beállítjuk a rajzasztal Precent értékét, valamint a MainForm ToolBar-ján megjelenő nagyítási értéket. További lényeges dolog az, hogy a rajzasztal ablakban látható részének közepe a művelet után is középen helyezkedjen el amennyiben ez lehetséges. Ezt úgy érjük el, hogy a rajzasztal
91 nagyítása után a gördítősávok pozícióit a rajzasztal méretváltozásának arányában változtatjuk meg. HP:=HorzScrollBar.Position+((Width-12) div 2); VP:=VertScrollBar.Position+((Height-12-32) div 2); DW:=Desk.Width; DH:=Desk.Height; Desk.Percent:=NewPercent; HorzScrollBar.Position:=Trunc(HP * Desk.Width/DW) - ((Width-12) div 2) ; VertScrollBar.Position:=Trunc(VP * Desk.Height/DH) -((Height-12-32) div 2);
procedure TWorkPad.SetFont; A MainForm ’Font’ üzenetének hatására végrehajtandó metódus. Átadjuk a vezérlést a Windows saját Font beállító dialógus ablakának. Amennyiben ’OK’val hagytuk el, akkor egy ciklus segítségével végighaladunk a rajzasztal egyedtéglalapokat tároló listáján és beállítjuk a jelöltre állított egyedtéglalapok font tulajdonságát. procedure TWorkPad.SetProperties; A MainForm ’Properties’ üzenetének hatására végrehajtandó metódus. Egy ciklus segítségével megvizsgáljuk, hogy van-e jelölt egyedtéglalap, ha van, akkor meghívjuk az egyedtéglalap tulajdonságát beállító metódust (SetEntityProperties). Ha nincs egyetlen jelölt egyedtéglalap sem, akkor egy másik ciklus segítségével megvizsgáljuk, hogy van-e jelölt kapcsolatvonal, ha van, meghívjuk a kapcsolatvonal tulajdonságát beállító metódust (SetContactProperties). Ha egyetlen objektum sincs jelölve, akkor meghívjuk a rajzasztal tulajdonságát beállító metódust (MainForm.ViewOptionsForm). procedure TWorkPad.EditDelItemClick(Sender: TObject); A ’Delete’ menüpont választása illetve a ’Del’ billentyű leütése esetén végrehajtandó metódus. Amennyiben a rajzasztal tartalmaz jelölt objektumot, akkor megjelenítünk egy ’Biztosan töröl ?’ dialógus ablakot. Ha ezt ’OK’-val hagytuk el, akkor meghívjuk a rajzasztal SelectedDelete metódusát, mely törli a jelölt objektumokat. procedure TWorkPad.SelectAllClick(Sender: TObject); A SelectAll menüpont választása esetén végrehajtandó metódus. Meghívjuk a rajzasztal SelectAll metódusát, amely a rajzasztal valamennyi objektumát jelöltre állítja. procedure TWorkPad.FilePrintSetupItemClick(Sender: TObject); A PrinterSetup menüpont választása esetén végrehajtandó metódus. Átadjuk a vezérlést a Windows saját nyomtató beállító dialógus ablakának. Amennyiben ’OK’-val hagytuk el, akkor meghívjuk a SetPageSize metódust a Printer aktuális paramétereivel. procedure TWorkPad.PrintPreview(Sender: TObject); A MainForm ’Print’ üzenetének illetve a ’Print’ menüpont választása esetén végrehajtandó metódus. Meghívjuk a rajzasztal Preview metódusát, amely megjeleníti a nyomtatási képet, lehetőséget ad bizonyos nyomtatási paraméterek beállítására és a nyomtatás elindítására.
92 procedure TWorkPad.FormActivate(Sender: TObject); A form aktívvá válásakor végrehajtandó metódus. Beállítjuk a nagyítás/kicsinyítés számértékét a ToolBar-ban. procedure TWorkPad.EditCopyItemClick(Sender: TObject); A ’Copy’ menüpont választása, illetve a ’Ctrl+C’ lenyomása esetén végrehajtandó metódus. Meghívjuk a rajzasztal CopyToClipboard metódusát, amely vágólapra másolja a jelölt objektumokat. procedure TWorkPad.EditCutItemClick(Sender: TObject); A ’Cut’ menüpont választása, illtve a ’Ctrl+X’ lenyomása esetén végrehajtandó metódus. Meghívjuk a rajzasztal CutToClipboard metódusát, amely vágólapra viszi át a jelölt objektumokat. procedure TWorkPad.EditPasteItemClick(Sender: TObject); A ’Paste’ menüpont választása, illetve a ’Ctrl+V’ lenyomása esetén végrehajtandó metódus. Meghívjuk a rajzasztal PasteFromClipboard metódusát, amely a rajzasztalra másolja vágólap tartalmát. procedure TWorkPad.EditMenuClick(Sender: TObject); A menüválasztáskor végrehajtandó metódus. A ’Cut’, ’Copy’, ’Delete’ menüpontok engedélyezése illetve tiltása annak függvényében, hogy van-e jelölt objektum a rajzasztalon. A ’Paste’ menüpont engedélyezése illetve tiltása annak függvényében, hogy van-e Text formátumú tartalma a vágólapnak. procedure TWorkPad.FileNewItemClick(Sender: TObject); A ’New’ menüpont választása esetén végrehajtandó metódus. Meghívjuk a MainForm FileNewItemClick metódusát, mely egy új gyermek-ablakot generál. procedure TWorkPad.FileSaveAsItemClick(Sender: TObject); A ’SaveAs’ menüpont választása esetén végrehajtandó metódus. Átadjuk a vezérlést a Windows saját mentés dialógus ablakának. Amennyiben ’OK’-val hagytuk el, átállítjuk a gyermek-ablak címét az új fájlnévre és meghívjuk a rajzasztal SaveToFile metódusát a fájlnév paraméterrel. procedure TWorkPad.FileSaveItemClick(Sender: TObject); A MainForm ’Save’ üzenetének illetve a ’Save’ menüpont választása esetén végrehajtandó metódus. Amennyiben az ablak FileName tulajdonsága üres, akkor meghívjuk a FileSaveItemClick metódust. Ellenkező esetben a rajzasztal SaveToFile metódusát hívjuk meg a FileName tulajdonság paraméterként történő átadásával.
93 procedure TWorkPad.WindowTileItemClick(Sender: TObject); A ’Title’ menüpont választása esetén végrehajtandó metódus. Meghívjuk a MainForm.Tile metódust, amely a gyermek-ablakokat úgy rendezi át, hogy azok befedjék a főablakot. procedure TWorkPad.WindowCascadetemClick(Sender: TObject); A ’Cascade’ menüpont választása esetén végrehajtandó metódus. Meghívjuk a MainForm.Cascade metódust, amely a gyermek-ablakokat lépcsőzetesen helyezi el a főablakba. procedure TWorkPad.FileOpenItemClick(Sender: TObject); A MainForm ’Open’ üzenetének illetve a ’Open’ menüpont választása esetén végrehajtandó metódus. Meghívjuk a MainForm FileOpenItemClick metódusát. procedure TWorkPad.LoadFromFile(FileName:String); Egy modell betöltése. Meghívjuk a rajzasztal LoadFromFile metódusát a paraméterként kapott fájlnévvel. Majd megjelenítjük a modell nevét a StatusLine második cellájában. procedure TWorkPad.DeskMouseMove(Sender: TObject; Shift: TShiftState; X,Y:Integer); A rajzasztalon történő egérmozgást, mint eseményt lekezelő metódus. Amennyiben engedélyezett a rajzasztal csúsztatása, akkor beállítjuk a gördítősávokat a rajzasztal DeskMoveRec.MovedX és DeskMoveRec.MovedX tulajdonsága alapján. A két tulajdonság tartalmazza az egér elmozdulását vízszintes és függőleges irányba. If Desk.DeskMoveRec.Enable Then Begin HorzScrollBar.Position:= HorzScrollBar.Position + Desk.DeskMoveRec.MovedX; VertScrollBar.Position:= VertScrollBar.Position + Desk.DeskMoveRec.MovedY; End;
Megjelenítjük az ablak státusz sorában az egér koordinátáját (X,Y). Procedure TWorkPad.NewMenuItem(MI:String); Új menüpont hozzáadása az ablak menüszerkezetéhez. Létrehozzuk az új menüpont objektumot, majd ezt hozzáadjuk a WindowMenu legördülő soraihoz. Az MI paramétert átmásoljuk a menü megjelenő szövegrészébe, majd az OnClick eseményét a WindowItemClick-re irányítjuk. procedure TWorkPad.WindowMenuClick(Sender: TObject); Az ablak menürendszerének ’Window’ menüpontjára történő kattintás eseményét lekezelő metódus. Egy ciklus segítségével töröljük a menüpontokat a harmadik sortól, melyek a gyermek-ablakok hivatkozásait tartalmazzák. Ezek után ismét felépítjük a menütételeket a gyermek-ablakok alapján. Ezzel aktualizáljuk a gyermek-ablakok életében bekövetkezett változásokat.
76. Ábra
94 Procedure TWorkPad.WindowItemClick(Sender:TObject); A Window menü dinamikus elemire történt kattintás, mint esemény lekezelése. Meghívjuk a Show metódusát a kattintott menüpont indexe alapján megállapított gyermekablaknak. Procedure TWorkPad.SetUpOptions(Opt:TOptions); A rajzasztal Options tulajdonságainak aktualizálása. Az ablak Options tulajdonságával aktualizáljuk a rajzasztal saját Options tulajdonságát. procedure TWorkPad.GeneralClick(Sender: TObject); A ’General’ menüpont választása esetén végrehajtandó metódus. Meghívjuk a MainForm.ViewOptionsForm metódusát, mely a modell alap tulajdonságait állítja be. procedure TWorkPad.HeadClick(Sender: TObject); A ’Model Head’ menüpont választása esetén végrehajtandó metódus. Átmásoljuk a modell fejadatát a beállításához használt dialógusablakba. Megjelenítjük a FormHead dialógus ablakot és amennyiben ’OK’-val hagytuk el, frissítjük a gyermekablak fejadatait. Megjelenítjük az ablak státusz sorában a modell címét.
95
2.5.5
A TMainForm osztály
A programban az un. MDI (Multi Document Interface) technikát alkalmazzuk, mely lehetővé teszi több modell egyszerre történő kezelését. Szükségünk van egy, un. szülő (Parent) ablakra, mely több gyerek (Child) ablakot tartalmazhat. A Parent ablak (MainForm) Szükség van egy TOptions típusú tulajdonságra, amelyben a gyermek ablakokban lévő rajzasztal alaptulajdonságait határozzuk meg (Options). procedure TMainForm.FormCreate(Sender: TObject); A Form létrehozásakor végrehajtandó metódus. Mielőtt megjelenne az alapképernyő, létrehozzuk, megjelenítjük , majd megszüntetjük a program címét tartalmazó egyszerű dialógus ablakot. Ezután létrehozzuk a fent említett objektumot: Options. procedure TMainForm.FormClose(Sender: TObject); A Form bezárása előtt végrehajtandó metódus. Megszüntetjük a két létrehozott objektumot. procedure TMainForm.FilePrintSetup(Sender: TObject); A ’PrinterSetup’ menüpont kiválasztása esetén végrehajtandó metódus. Átadjuk a vezérlést a Windows saját nyomtató beállító dialógus ablakának. Amennyiben OK-val lépünk ki akkor a SetPageSize(Printer.PageWidth, Printer.PageHeight) üzenet küldjük az éppen aktuális gyerek-ablaknak, ha létezik. A PageWidth és PageHeight a beállított papír szélességét és magasságát tartalmazza pixelben. procedure TMainForm.FileExit(Sender: TObject); A FileExit menüpont kiválasztása esetén végrehajtandó metódus. Lezárjuk az ablakot. procedure TMainForm.SBNewEntityClick(Sender: TObject); Az ’New Entity’ gomb lenyomása esetén végrehajtandó metódus. SBNewEntity üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik. procedure TMainForm.SBArrowClick(Sender: TObject); A ’Edit’ (nyíl) gomb lenyomása esetén végrehajtandó metódus. SBArrows üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik. procedure TMainForm.SBZoomInClick(Sender: TObject); A ’Zoom In’ gomb lenyomása esetén végrehajtandó metódus. IncDecPercent(5) üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik. procedure TMainForm.SBZoomOutClick(Sender: TObject); A ’Zoom Out’ gomb lenyomása esetén végrehajtandó metódus. IncDecPercent(-5) üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik.
96 procedure TMainForm.SBNewContactClick(Sender: TObject); Az ’New Contact’ gomb lenyomása esetén végrehajtandó metódus. SBNewContact üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik. procedure TMainForm.PrintSetupDialogClose(Sender: TObject); Az ’New Entity’ gomb lenyomása esetén végrehajtandó metódus. SBNewContact üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik. procedure TMainForm.SBMoveClick(Sender: TObject); A ’Desk Moving’ gomb lenyomása esetén végrehajtandó metódus. DeskMove üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik. procedure TMainForm.SBFontClick(Sender: TObject); A ’Font’ gomb lenyomása esetén végrehajtandó metódus. SetFont üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik. procedure TMainForm.FileNewItemClick(Sender: TObject); A ’New’ gomb lenyomása és a ’New’ menüpont választása esetén végrehajtandó metódus. Létrehozunk egy új ablakot, azaz a TworkPad osztály egy példányát. Beállítjuk az ablak cím tulajdonságát, amely az ’LDM’ szöveg és a gyerek ablak sorszáma. A gyerek ablak közepére pozícionálunk a saját SetCentreScrollBar metódusának meghívásával. Beállítjuk az ablak jellemzőit az ablak szintén saját SetUpOptions metódusának meghívásával. Megjelenítjük az új ablakunkat és engedélyezzük a szerkesztő panelen elhelyezett ikonok elérhetőségét. procedure TMainForm.FileOpenItemClick(Sender: TObject); A ’Open’ gomb illetve az ’Open’ menüpont választása esetén végrehajtandó metódus. Átadjuk a vezérlést a Windows saját fájlkezelő dialógus ablakának. Az ablakból történt ’OK’ kilépés esetén meghívjuk a FileNewItemClick metódust, amely létrehoz egy új ablakot. Beállítjuk az ablak cím és fájlnév tulajdonságát, majd meghívjuk az ablak saját LoadFromFile metódusát, amely betölti a paraméterében megadott fájlt. Végül engedélyezzük a szerkesztő panelen elhelyezett ikonok elérhetőségét. procedure TMainForm.SBFileSaveClick(Sender: TObject); A ’Save’ gomb illetve a ’Save’ menüpont választása esetén végrehajtandó metódus. FileSaveItemClick üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik. procedure TMainForm.SBPrintClick (Sender: TObject); A ’Print’ gomb illetve a ’Print’ menüpont választása esetén végrehajtandó metódus. PrintPreview üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik.
97 procedure TMainForm.EditPanelEnable(Value:Boolean) A szerkesztő gombok engedélyezése/tiltása. Egy ciklus segítségével végig haladunk a szerkesztő panel (EditPanel) komponensein és azok elérhetőség (Enabled) jellemzőit a paraméterként kapott Value értékkel tesszük egyenlővé. Új
Mentés
Nagyítás
Kicsinyítés
Jellemzõk
Új egyed
Asztal csúsztatás
Betöltés
Nyomtatás
Szerkesztő panel
Szerkesztés
Új kapcsolat
Font
77. Ábra
Procedure TMainForm.ViewOptionsForm; Az ’opciók’ menüpont választása esetén végrehajtandó metódus. A rajzasztal beállításai
Az egyed alapbeállításai
A kapcsolat alapbeállítása
78. Ábra
Ez egy speciális eset abból a szempontból, hogy e metódus hívása csak a gyermek-ablak menüpontjából érhető el. Átadjuk a vezérlést az OptionsForm ablakának. Az ablakból történt ’OK’ kilépés esetén meghívjuk az OptionsRead metódust, amely átmásolja az OptionsForm ablak beállított adatait a MainForm Options tulajdonságába. Ezután meghívjuk a SetUpOptions-t mely végighaladva a gyermek-ablakokon, aktualizálja azok saját Options tulajdonságát.
98 Procedure TMainForm.OptionsRead; Az OptionsForm ablak adatainak átmásolása a MainForm Options tulajdonságába. Procedure TMainForm.SetUpOptions; A gyerek-ablak Options tulajdonságainak aktualizálása. Egy ciklus segítségével végighaladva a gyermek-ablakokon a MainForm Options tulajdonságával aktualizálja az ablakok saját Options tulajdonságát. procedure TMainForm.FormActivate(Sender: TObject); A Form aktiválásakor végrehajtandó metódus. Meghívjuk az OptionsRead metódust, amely átmásolja az OptionsForm ablak adatait a MainForm Options tulajdonságába. procedure TMainForm.SBPropertiesClick(Sender: TObject); A ’Properties’ gomb lenyomása esetén végrehajtandó metódus. SetProperties üzenet küldése az éppen aktuális gyerek-ablaknak, ha létezik.
99
3 Mellékletek 3.1 Felhasználói kézikönyv Bevezető A kézikönyv a Logical Data Model Designer tervező program telepítéséhez és használatához ad útmutatás. A dokumentáció és a program használata, kezelői szintű Windows ismeretet feltételez a felhasználó részéről. A felhasználói felület és a kezelési mechanizmus tervezésekor, kivitelezésekor törekedtem a mai vizuális rajzoló, dokumentumkezelő, modellező alkalmazásokban használt -jól bevált- megoldások alkalmazására, mivel így gyorsabban elsajátítható a program kezelése. Bár a menüben szerepel, az ’on-line help’ egyelőre nem érhető el. A szoftver hardverigénye minimum 486-DX/100 processzor, 16 MByte memória, SVGA monitor. A szoftver fut minden ma ismert 32-bites Windows operációs rendszer alatt: Windows’95, Windows’98, Windows NT. Telepítés A mellékelt CD gyökérkönyvtárának tartalmát a merevlemez egy teszőleges könyvtárába kell másolni, majd az LDM.EXE-t kell futtatni. A program indítása A program elindítása után megjelenő képernyőn a Start gomb megnyomásával tudunk túljutni.
Ekkor következő ablak jelenik meg:
100
Új
Betöltés
A file menüpont alatt található menüpontok jelentése: Új modell létrehozása Egy létező modell betöltése valamely háttértárról Az aktuális nyomtató kiválasztása, beállítása Kilépés a programból
New: Open: Print Setup: Exit:
Az új modell elérését és a model-fájl megnyitását a két első gyors-gomb megnyomásával is elérhetjük. A rajzfelületet egymásmellé helyezett szabványos papírlapok alkotják, így a modell készítése nem korlátozik az A4-es lapok fizikai kereti közé. A modell rajzasztala zöld színben jelenik meg, a lapok széleit jelző kék vonalakkal. Az ablak tetején látható menürendszer kibővül, az eddig szürke gyors-gombok elérhetővé válnak.
A gyors gombok jelentése: Új
Mentés
Nagyítás
Kicsinyítés
Jellemzõk
Új egyed
Asztal csúsztatás
Betöltés
Nyomtatás
Szerkesztő panel
Szerkesztés
Új kapcsolat
Font
Új: Betöltés: Mentés: Nyomtatás: Nagyítás: Kicsinyítés: Font: Jellemzők:
Új modell létrehozása Egy létező modell betöltése valamely háttértárról A modell mentése valamely háttértárolóra A nyomtatási kép megjelenítése, nyomtatás A rajzasztal nagyítása 5%-kal A rajzasztal kicsinyítése 5%-kal Amennyiben van kijelölt egyed a rajzasztalon, e gomb megnyomásával beállíthatjuk font tulajdonságát. Megnyomásakor három eset lehetséges: - ha van jelölt egyed az asztalon, akkor annak jellemzőit állíthatjuk be - ha van jelölt kapcsolat az asztalon, akkor annak jellemzőit állíthatjuk be - ha nincs jelölt objektum, akkor a rajzasztal alapbeállításait
101
Szerkesztés: Új egyed: Új kapcsolat: Asztal csúsztatás Exit:
határozhatjuk meg A rajzeszközt ’szerkesztés’ állapotúra állítja A rajzeszközt ’új egyed’ állapotúra állítja A rajzeszközt ’új kapcsolat’ állapotúra állítja A rajzeszközt ’csúsztatás’ állapotúra állítja Kilépés a programból
Egyedek létrehozása, beállítása, törlése Új egyed létrehozásához először a rajzeszközt ’új egyed’ állapotúra kell állítani a megfelelő gyors-gomb megnyomásával. Ezután, a megváltozott alakú egérkurzort arra a pontra kell mozgatnunk a rajzasztalon, ahová az új egyedet helyezni akarjuk. A bal egérgomb minden egyes megnyomásakor egy új egyed jelenik meg. A már létező egyedek tulajdonságainak kezeléséhez először át kell váltanunk ’szerkesztés’ rajzolásmódra, majd ki kell jelölnünk a módosítandó egyedet. A jelölés történhet egyedileg és csoportosan. Egy egyed kijelöléséhez csak rá kell kattintanunk a jelölésre szánt egyed felületére. Ha több egyedet akarunk kijelölni, akkor ezt megtehetjük egy jelölő kerettel, illetve a Shift billentyű nyomva tartása mellett történő kattintással. A jelölő keret használathoz vigyük az egérkurzort a kijelölésre szánt terület bal-felső sarkába, majd az egérgombot lenyomva –és folyamatosan nyomva tartva- vigyük a kijelölésre szánt terület bal-alsó sarkába. Itt felengedve az egérgombot a kereten belül elhelyezkedő valamennyi objektum (egyed, kapcsolat) jelöltté válik. A jelöltséget kis piros méretező négyzetek jelölik. Bármely egyed, egyedcsoportot át tudunk helyezni, illetve méretezni a nyolc fő irányba. Az gyedek áthelyezéséhez, nyomjuk le az egérgombot a jelölt egyed felett –és
folyamatosan nyomva tartva vigyük az egeret a kívánt irányba. Az elengedés után az egyedek az új pozíciókban jelennek meg. Az egyedek átméretezéséhez a piros méretező pontok valamelyike felett kell lenyomnunk az egérgombot. Az átméretezést és mozgatást az egyedek között lévő kapcsolat automatikusan követik. Az egyed, egyedek tulajdonságainak beállításhoz kattintsunk a jobb egérgombbal valamely egyed felett, vagy kattintsunk a ’jellemzők’ gyors-gombra.
102 Az egyed tulajdonságait beállító dialógusablak: Azonosító Szöveg Szélesség Magasság
Keretszín Háttérszín Keret vastagság Betûtípus
Csoportos tulajdonság beállítás esetén a szövegek nem változnak meg, hiszen az általában minden egyednél különböző. A jelölt egyedet, egyedeket a ’Del’ billentyű leütésével, illetve az ’Edit’ menüpont ’Delete’ almenüpontjának választásával tudjuk törölni. Törléskor az egyed valamennyi kapcsolata megszűnik. Megjegyzés: - Az ’Edit’ menüpont ’Select All’ almenüpontjának választásával az aktuális rajzasztal valamennyi objektuma jelöltté válik. - Törléskor valamennyi jelöltobjektum törlésre kerül.
Kapcsolatok létrehozása, beállítása törlése. Új kapcsolat létrehozásához először a rajzeszközt ’új kapcsolat’ llapotúra kell állítani a megfelelő gyors-gomb megnyomásával. Ezután, a megváltozott alakú egérkurzort arra az egyedre kell vinnünk, amelyhez hozzá akarunk kapcsolni egy másikat. Majd az egérgombot lenyomva –és folyamatosan nyomva tartva- vigyük az egérkurzort a kapcsolni kívánt egyed fölé. Az egérgomb elengedése után egy új kapcsolat jelenik meg. A már létező kapcsolatok tulajdonságainak kezeléséhez először át kell váltanunk ’szerkesztés’
rajzolás módra, majd ki kell jelölnünk a módosítandó kapcsolatot. A jelölés történhet egyedileg és csoportosan. Egy kapcsolat kijelöléséhez csak rá kell kattintanunk a jelölésre szánt kapcsolatra. Ha több kapcsolatot akarunk kijelölni, akkor ezt megtehetjük egy jelölő kerettel, illetve a Shift billentyű nyomva tartása mellett történő kattintással. A jelölő keret használathoz vigyük az egérkurzort a kijelölésre szánt terület bal-felső sarkába, majd az
103 egérgombot lenyomva –és folyamatosan nyomva tartva- vigyük a kijelölésre szánt terület bal-alsó sarkába. Itt felengedve az egérgombot a kereten belül elhelyezkedő valamennyi objektum (egyed, kapcsolat) jelöltté válik. A jelöltséget kis piros méretező négyzetek jelölik. A csoportosan kijelölt kapcsolatoknak csak a tulajdonságait tudjuk beállítani, együtt mozgatásuk nem lehetséges. A kapcsolatok mozgatása egyrészt lehetséges valamely egyed átmozgatásával, másrészt lehetséges a kapcsolatot jelölő vonal, illetve a töréspontok közvetlen ’megragadásával’. A ’megragadáshoz’ nyomjuk le az egérgombot a vonszolni kívánt kapcsolat felett –és folyamatosan nyomva tartva- vigyük az egérkurzort tetszőleges irányba. Elengedés után a kapcsolat felveszi az új pozícióhoz legjobban illeszkedő formát. A kapcsolatok kezdő és végpontja nem hagyhatja el az egyedek területét, ezt a program nem is engedi. A cikk-cakk jellegű összekötés csak a kapcsolat, vonszolásával érhető el, az egyed áthelyezésével nem. Amennyiben a kapcsolat egy törésponttal rendelkezik és ez a pont a két egyed egymáshoz legközelebb eső sarkai által közrezárt téglalap területén helyezkedik el, akkor cikk-cakk lesz az eredmény vonal jellege. Az kapcsolat, kapcsolatok tulajdonságainak beállításhoz kattintsunk a jobb egérgombbal valamely kapcsolat felett, vagy kattintsunk a ’jellemzők’ gyors-gombra. Az kapcsolat tulajdonságait beállító dialógusablak: Kapcsolat azonosító
A kizáró kapcsolat beállítása
A kapcsolat jellege A kapcsolat színe Vonalvastagság A kapcsolat megnevezése
Csoportos tulajdonság beállítás esetén a szövegek nem változnak meg, hiszen az általában minden kapcsolatnál különböző. A jelölt kapcsolat, kapcsolatokat a Del billentyű leütésével, illetve az ’Edit’ menüpont ’Delete’ almenüpontjának választásával tudjuk törölni. Megjegyzés: - Az ’Edit’ menüpont ’Select All’ almenüpontjának választásával az aktuális rajzasztal valamennyi objektuma jelöltté válik. - Törléskor valamennyi jelölt objektum törlésre kerül.
104 A program alapbeállításának megadása Az ’Options’ menüpont ’General’ almenüpontját kiválasztva megjelenik a program alapbeállításait kezelő dialógus ablak. A rácspontok egymáshoz viszonyított távolsága vízszintes irányba
A rajzasztal beállításai
A rácspontok egymáshoz viszonyított távolsága függõleges irányba
A rácsponthoz történõ igazítás engedélyezése és tiltása
A rácspont megjelenítésének engedélyezése és tiltása
Az egyed alapbeállításai A rácspont színe
A kapcsolat alapbeállítása
A beállítások valamennyi modellre érvényesek lesznek, nem csak az aktuálisra. A model fejadatának beállítása: Az ’Options’ menüpont ’General’ almenüpontját kiválasztva megjelenik a program alapbeállításait kezelő dialógus ablak.
A projekt neve A model neve
Szerzõ neve
A megadott értékek csak nyomtatáskor jelennek meg a lap bal-alsó sarkában.
Verziószám
105
A model nyomtatása Az ’File’ menüpont ’Print’ almenüpontját kiválasztva, illetve a ’Nyomtatás’ gyors-gombra kattintva, megjelenik a nyomtatási paraméterek beállítására és a nyomtatási kép megtekintésére szolgáló dialógus ablak. Másolatok száma
Fejléc nyomtatás
A nyomtatandó lapok
Keret nyomtatás Színes nyomtatás Monokróm nyomtatás
Margó távolsága a laspszéleitõl
A nyomtatás elindítása a ’Print’ gomb lenyomásával érhető el. Az aktuális nyomtató kiválasztása, beállítása az ’File’ menüpont ’Print Setup’ almenüpontjának kiválasztásával lehetséges, melynek hatására megjelenik a Windows szabványos nyomtató kezelő dialógus ablaka. A model mentése, betöltése háttértárolóról. Az ’File’ menüpont ’Save’ almenüpontját kiválasztva, illetve a ’Mentés’ gyors-gombra kattintva, a modell azonnal mentésre kerül. Természetesen, ha a modell először kerül mentésre, akkor megjelenik a Windows szabványos fájlmentés dialógus ablaka, ahol beállíthatjuk –többek között- a fájl nevét. Az ’File’ menüpont ’Save As’ almenüpontját kiválasztva lehetőségünk van fájlnevének felülbírálására, szintén a Windows szabványos fájlmentés dialógus ablakán keresztül.
A vágólap használata Először ki kell jelölnünk a vágólapra helyezendő objektumokat, majd az ’Edit’ menüpont almenüpontjai közül kell kiválasztani a megfelelőt: Cut Ctrl+X A jelölt objektumokat áthelyezi a vágólapra Copy Ctrl+C A jelölt objektumokat átmásolja a vágólapra Természetesen a kapcsolatok csak akkor kerülnek vágólapra, ha az általuk összekötött egyedek is jelöltek voltak.
106 A vágólapra helyezett objektumok beillesztése a ’Paste’ menüpont választásával, illetve a Ctrl+V billentyű kombináció lenyomásával lehetséges. Az ’Edit’ menüpont ’Select All’ almenüpontjának választásával az aktuális rajzasztal valamennyi objektuma jelöltté válik.
107
3.2 Nyomtatási képek
108
109
3.3 CD
110
4 Tapasztalatok, továbbfejlesztési lehetőségek Ahhoz, hogy ez a szoftver komoly rendszerfejlesztések hatékony segédeszközévé váljon, még nagyon sok munkát kellene belefektetni és egy ember által talán meg is oldhatatlan. Elkészítésével nem is ez volt a célom. Sokkal inkább arra szerettem volna rávilágítani, hogy az általunk más szoftverekben is használt, egyszerűnek és magától érthetődőnek tűnő szolgáltatások (pl. nagyítás/kicsinyítés) megvalósítása nem is olyan egyszerű feladat. Ami ebben a dolgozatban (szoftverben) szerintem érték, és mások számára is hasznosítható az felmerült problémákra talált megoldási módok, algoritmusok Néhány ezek közül: - az egér használatával történő kapcsolatvonal-kezelés - a kapcsolatot felépítő szakaszok számát és elhelyezését meghatározó algoritmus - a csoportos áthelyezés, átméretezés - kicsinyítés és nagyítás - nyomtatási képet generáló és megjelenítő algoritmus - a vágólap- és fájlkezelés megoldása a TMemo osztály felhasználásával Mint a dolgozat elején említettem a szoftver külső megjelenését és működési mechanizmusát erősen befolyásolták a kereskedelmi forgalomban is kapható professzionális szoftverek. Azonban ezek belső működése rejtve maradtak előttem, ezért biztos vagyok benne, hogy léteznek sokkal hatékonyabb és egyszerűbb megoldások. Az alkalmazás magában foglalja a továbbfejlesztés lehetőségét. Az egyik fontos elem, amit a felhasználó hiányolhat, az az on-line help, melynek elkészítése inkább idő és akarat kérdése. Az általam származtatott és létrehozott osztályok esetében törekedtem a komponensként történő deklarálásukra, azonban ez nem teljesen sikerült. Ennek tökéletesebb eléréséhez alkalmazásfüggetlenebb szemlélet és precízebb tesztelés szükséges, de a lehetőség benne van az osztályokban. Tovább kellene tökéletesíteni a kapcsolatok kezelését is, különösen az egyeden elhelyezkedő végpontok megragadását, valamint az 1 pixelnél vastagabb szaggatott vonalat tartalmazó kapcsolatok megjelenítését illetően. (Ez utóbbi sajnos nem működik a Delphi által nyújtott rajzolási metódusok felhasználásával) Igen fontos lenne, hogy a program általános alkalmazások számára is értelmezhető állományt tudjon előállítani. Ezzel megoldanánk a modell rajzának beillesztését, pl. egy Word dokumentumba. Ebben az alkalmazásban az egyedeket és kapcsolatokat illetően a nevükön kívül, más attributomok nem adhatók meg. Bár ennek pótlása további komoly tervezési és fejlesztési munkát jelentene, azonban az alkalmazás sokkal teljesebbé válna és újabb szolgáltatások beépítést irányozná elő. Összességében úgy érzem, a feladatspecifikácóban előírtaknak a szoftver megfelel és ötletforrásává válhat a vizuális tervező alkalmazások fejlesztése iránt érdeklődőknek.
111
5 Külső forrásanyagok 5.1 Irodalomjegyzék 1. Angster Erzsébet: Az objektumorientált tervezés és programozás alapjai, 4KÖR Bt. 1999. 2. Bana István: Az SSADM redszerszervezési módszertan, LSI Oktatóközpont 3. Dr. Kovácsné Cohner Judit, Takács Tibor: Ismerkedés az SSADM-mel, Budapest, ComputerBooks, 1997 4. Dr. Szelezsán János: Adatbázisok, LSI Oktatóközpont 5. Baga Edit: Delphi másképp, 1998 6. JAVA 1.1 utikalauz programozóknak, Budapest, ELTE TTK Hallgatói Alapítvány 7. Xavier Pacheco, Steve Teixeira: Delphi 2 Developer’s Guide, Indianapolis, SAMS Publishing 1996.
5.2 Tanulmányozott alkalmazások 1. 2. 3. 4.
Visio Corporation: Visio 4.0c for Microsoft Windows, 1991-1995 Sybase, Inc: S-Designor AppModeler Desktop for PowerBuilder, Version 5.0.3 32-bit Pacestar Software: EDGE DiagrammerVersion 2.01b, 1997 CSA Research Ltd.: Silverrun-RDM 2.4.4. 1996