Category Archives: BHGridCtrl

Oktobarski sastanak Bihać .NET User grupe


Sastanak Bihac .NET User Grupe: Edukativni Centar Laser Doo, 28. Oktobar u 17 sati.

Bihać .NET User grupa organizira svoj drugi odnosno treći po redu sastanak. Ovog puta će to biti live prenos uvodnog predavanja sa PDC2010 – Microsoftove  konferencije za developere, koji će se održati od 28.-29 10. 2010. godine u Redmondu.

Koliki je interes za ovu konferenciju pokazuje i činjenica da su mjesec dana prije početka konferencija sva mjesta rasprodana. Ove godine PDC2010 će se po prvi put prenositi i uživo gdje će pored učesnika konferencije hiljade ljudi dijem svijeta uživo gledati cijelokupnu konferenciju. Pored navedenog PDC2010 će se grupno prenositi na rednovnim sastancima User grupa diljem svijeta. I naša grupa kao i user grupe u Bosni i Hercegovini prenosit će grupno uvodno predavanje. Na http://www.microsoftpdc.com/Local zvaničnoj stranici PDC2010 izlistane su sve User grupe koje će ovaj događaj pratiti uživo. Naravno i naša kao i ostale user grupe iz BiH se nalaze na ovoj listi. Biće vrlo interesantno pratiti ovaj događaj kada znamo da Microsoft sprema grupu novih proizvoda da objavi poput Windows Phone 7, Internet Exporer 9, skup novih alata, cloud servisi i mnoštvo drugih stvari.

Na PDC2010 pored uvodnog predavanja održaće se ukupno 160 predavanja raspoređenih u 3 smijera i to: Client & Device, Cloud Service i Framework & Tools.

Client & Device – smijer na kojem će se najviše govoriti o Windows Phone 7 i razvoju aplikacija na ovoj platformi, kao i Internet Explorer 9 koji će vjerojatni biti objavljen na ovoj konferenciji. Ovu informaciju nisam nigdje čuo nego iz iskustva bi se moglo pretpostaviti da će se to desiti.

Cloud Service – tehnologija budućnosti u kojoj je Microsoft skoro sve svoje proizvode poput Windows OS, SQL Server, Office application razvio i verzije koje se vrte u oblacima. Računanje u oblacima je budućnost i na PDC2010 će se čuti zadnja dostignuća u ovoj oblasti.

Frameworks & Tools – razne teme posvećene microsoftovima programskim jezicima, i alatima za razvoj poput LightSwitch i sličnim razvojnim alatima.

Kao i svaki drugi sastanak imaćemo i vrijedne nagrade, a i predstavit ćemo neke nove sponzore, koje smo dobili od zadnjeg sastanka. Registracija na sastanak je kao i svaki put na oficijelnoj stranici www.bihac.mscommunity.ba.

Vidimo se na sastanku.

Advertisements

Šta se dešavalo na prvom sastanku Bihac.NET User grupe


IMAG0977Na samom početku ovog posta moram priznati da organizovanje sastanaka nije nimalo jednostavna rabota, otud skidam kapu Damiru i drugim leaderima user grupa kako u Bosni i Hercegovini tako i šire. U Bihaću je ovog četvrtka to bilo posebno jer se radilo o prvom zvaničnom sastanku, a drugom po redu, jer smo u maju ove godine imali inicijalni sastanak.

IMAG0980Imao sam skoro mjesec dana do sastanka, tako da sam skoro pa spamovo informaciju o sastanku na FB, Twitteru, kafićima mahalama i sl. Džaba ti sve ali niko ni da trepne, javiše se nekoliko mojih kolega i kad sam na kraju prebrojao i oduzeo one što i kad kazu da će doći 100% ne dođu, ostade 11 posjetilaca uključujući i gosta i domaćina. Ali rekoh kad u Sarajevu ne dođe 20 ljudi onda u Bihaću ovih 11 i previše.

Za ovaj prvi sastanak pozvao sam Dragana, rekoh Dragane spašavaj situaciju i nafali, laži petljaj samo da uspijemo malo probuditi zainteresiranost ljudi u Bihaću oko tema koje im sutra mogu biti kruh, kako  za njih tako i za njihovu familiju.I fakat prevalivši više od 1000 km (nije da se sad ulizivan i hvalim Smile) Dragan je tačno u pola 3 došao u Bihać. Vidno umoran jer putuje iz Bijeljine (uvijek izostavljam ovo i  kod ovog grada neznam zašto, pa moram posebno pratiti kako ga pišem), u kojoj je dan prije držao također sastanak Bijeljniske user grupe, bio je odlučan da izvuče situaciju i u Bihaću :).

I ored toga što sam pretpostavio kako će se stvari odvijati na sastanku, ipak ništa se nije odvijalo onako kako sam zamislio jer je umjesto 11 ljudi koji su se prijavili na predavanje došlo njih blizu 25, što mi u jednom trenutku vrati osmijeh na lice, da se ne osramotim pred gostom koji prevali 1000 km. Nako početnih stresova i 20-tak telefonski poziva sa upitima gdje se nalazi taj edukativni centar, evo mene nema nikoga, i sličnih ubadanja konačno i započe prvi tako očekivani sastanak.

IMAG0983I dok se Dragan pripremao za prezentaciju, nisam ni vidio da je počeo prezentaciju otvorivši notepad sa tekstom gdje radi (to svi znaju jer stim sam ih navlačio da dođu), mail adresom i  web stranicom MSCommunityBiH. E onda sam već bio svjestan da se ovo odvija u potpuno drugom smijeru. Malo zatim otvori Dragan Powerpoint, i poče rešetati po LightSwitchu, WebMatrixu i Windows Phone 7-mici. Kad poče ovo zadnje reko “ustavi de nešto i meni ostavi”.

Na kraju i domaćina zapade nešto da kaže na ovom sastanku, prvi demo otključani Windows Phone Emulator, skinut sa rapidshare, za kojeg sam ranije rekao da ne pokušavaju kod kuće jer nije baš 100% legalno, tek se sad Dragan poče preznojavati šta će ovaj do kraja sastanka još pokazati.

Na kraju podijelismo skromne poklone prisutnim jednu MSPress knjigu, svakome svesku, nešto naljepnica i prospekata. Dovoljno dok ne dođe Kits koji sam naručio.

Šalu na stranu prvi sastank prođe u vrlo dobroj atmosferu sa posjetom više od oečekivanog, te vidno zainteresiranim gledateljima sa sastanka. Obećaše doći za mjesec dana na live prenos keynotea iz Redmonda. Dobih obećanja od nekih da bi prezentaciju bili voljni spremiti.

Nakon sastanka Dragan i ja odosmo, ……. ovo je već druga tema pa možda se u jednom budućem blog postu i napiše šta to bi poslije sastanka Smile.

BHGridCtrl – Zadnja implementacija


Zadnja implementacija BHGridCtrl projekta, podrazumijevala je povezivanje tabela sa bazom podataka preko ADO. Zadnjom verzijom podaci koji se učitaju nije moguće vršiti modifikaciju. Za zadnji primjer potrebno je imati instaliran SQL server i NorthWind bazu podataka. Svi podaci u tabeli se mogu isprintati i implementirane su funkcije za printanje GridKontrole, zaglavlja i podnožja. Primjer sa zadnjom implementiranom verzijom BHGriCtrl možete skinuti sa ovog  linka. Primjer je kompajliran sa VS 2008.

BHGridCtrl -III dio. Implementacija spajanja ćelija (merge cells)


image

Implementacija spajanja ćelija u Grid kontroli nastavak je razvoja ove kontrole. Spajanje ćelija omogućeno je članom:

CArray<CBHCellRange, CBHCellRange&> m_MergedCellArray;

koji čuva infomacija o spojenim ćelijama. Manipulacija oko spajanja ćelija vrši se preko sljedećih metoda:

//Cell merge support
void UnMergedCells(int nStartRow, int nStartCol, int nEndRow,int nEndCol);
void   MergedCells(int nStartRow, int nStartCol, int nEndRow,int nEndCol);
CBHCellRange GetMergedRange(CCellID celMerged);

Prvom metodom rastavljamo jednu ćeliju na osnovne početne ćelije, dok s drugom metodom spajamo ćelije. U oba slučaja argumenti metoda se startne kolone i vrste.

Treća metoda GetMergedRange(CCelID cellMerged) – je metoda koja provjerava i vraća cjelokupan spojeni region u kojem se nalazi data ćelija, a koja je prosljeđena kao argument. U biti sve tri metode manipulišu poljem ćelija koji je definisan na početku.

Ćelije se mogu spajati bilo da se radi o zaleđenim ili standardnim kolonama ili vrstama. Jedino  se ne mogu spajati jedna zaleđena i druga obična ćelija.

Način na koji se iscrtavaju spojene ćelije je da se odredi širina i dužina ćelije, stim da se preko navedene metode (GetMergedRange) provjerava da li je dotična ćelija u sastavu grupe ćelija koje su spojene. Na taj način se prva u nizu ćelija iscrta, dok ostale ćelije u grupi spojenih ćelija se ne iscrtavaju.

Source code za ovu verziju možete skinuti ovdje.

BHGridCtrl- open source


BHGridCtrl

BHGridCtlr zadnja verzija Februar 2006

C++ Grid kontrola razvijana isključivo iz hobija u slobodno vrijeme. Na blogu je otvorena stranica na kojoj su sumirani članci koje sam ranije pisao, kao i članci koje ću objaviti, vezano za ovu kontrolu.U slučaju da imate vremena na pretek ili veliku želju da programirate u C++ ovakvu kontrolu, slobodno me kontaktiraje, zaista bi bilo lijepo kada bi se ova kontrola nastavila razvijati.

Više o projektu na stranici Projekti->BHGridCtrl.

Iscrtavanje BHGrid kontrole


1. Uvod

Iscrtavanje grid kontrole je najvažniji segment u implementaciji. Vizuelni efekt grid kontrole daje kontroli izgled i za korisnika je, osim samih mogućnosti manipulacije podacima, najvažniji aspekt.

Grid kontrola se uglavnom sastoji iz nekoliko segmenata:

  • Zamrznute kolone/vrste (gornji lijevi ugao)
  • Nepokretne (fiksirane) vrste ili vrste zaglavlja (Header rows)
  • Nepokretne (fiksirane) kolone ili frozen columns
  • Grid cells ili sama grid polja za prikaz podataka

clip_image002

Slika 1. Prikaz komponenata Grid Kontrole

Gornja slika pokazuje šemu i medjusoban odnos komponenata Grid kontrole: virtualna veličina, virtuelne veličine pojedinih dijelova u odnosu na klient površinu koja trenutno pokazuje Grid kontrolu.

Radi same brzine i optimiziranog korištenja memorije računara grid kontrola se iscrtava samo onoliko koliko je potrebno da se iscrta klient površina, dočim Scroll kontrole obezbjedjuju da se pogleda cijela grid kontrola.

Da bi se valjano i efikasno iscrtala grid kontrola potrebno je u odnosu na poziciju scroll kontrola iscrtavati komponente i sama grid polja.

Radi kontinuiranog scrollanja redoslijed iscrtavanja komponenata kontrole je vrlo važan.

Redoslijed iscrtavanja kontrole treba da se odvija sljedećim redom:

· Iscrtavanje Grid polja

· Iscrtavanje fiksiranih vrsta

· Iscrtavanje fiksiranih kolona

· Iscrtavanje zamrznuto kolona/vrsta (gornji lijevi pravougaonik koji se iscrtava nezavisno od pozicije klizača)

· Iscrtavanje Fokusa i Aktivne cečije

Kako se iz same slike vidi da početna tačka iscrtavanje grid kontrole može biti u polju u kojem se iscrtavaju ostale dvije komponente. Potrebno je obezbjediti da se ona prva iscrta, a zatima fiksirane vrste koje opet mogu biti iscrtane u polju koji je predvidjen za fiksirane kolone, pa zatim one same kako bi se ostvarilo preklapanje crtanja, a izgled kontrole bio ispravan.

Kako se vidi iz slike da postoji odredjena preklapanja u iscrtavanju potrebno je u svakoj funkciji koja vrši nevedena iscrtavanja prosljediti i klipovan pravougaonik u kojem će se osvježiti iscrtana površina. Ovim će se obezbjediti maximalno smanjenje fliking efekta odnosno blicanja iscrtavanih površina.

Maximalna vrijednost scroll kontrola je jednak ukupnoj širini odnosno ukupno dužini grid kontrole, tako da zadnji položaj klizača scroll kontrola iscrtava zadnji segment grid kontrole, tj. zadnje desno polje iscrtava se u donjem desnom klient pravougaoniku.

2. Određivanje elemenata za iscrtavanje Grid kontrole

clip_image003 clip_image004

Slika 2. raspored pravougaonika grid kontrole u odnosu na klient pravougaonik

Elementi potrebni za iscrtavanje komponenata Grid kontrole su sljedeći

  • Tekuća pozicija klizača Scroll Kontrola , m_nXScrollPos, m_nYScrollPos
  • Gornje lijevo polje izračunato u odnosu na poziciju Scroll kontrole, nTopRow, nLeftCol
  • Početne koordinate X0,Y0 za iscrtavanje polja kontrole u zavisnosti fiksiranih vrsta i kolona.
  • Donje desno polje izračunato u odnosu na poziciju Scroll kontrole te veličine klient površine nBottomRow,nRightCol
  • Gornja fiksirana vrsta nTopFixedRow u odnosu na poziciju vertikalne Scroll kontrole
  • Lijeva fiksirana kolona nLeftFixwdCol u odnosu na poziciju horizontalne Scroll kontrole

3. Matematički model iscrtavanja

Pretpostavimo da je P0(x0,y0) početna tačka za iscrtavanja polja kontrole u klient površini,

za P0 vrijedi, 0 ≤ x0 < fColWidth

0 ≤ y0 < fRowHeight

gdje je: fColWidth ≥ 0 – ukupna dužina fiksiranih kolona,

fRowHeight ≥ 0 – ukupna visina fiksiranih vrsta

Gornje lijevo polje tlCell od kojeg se počinje iscrtavati kontrole izračunava se u odnosu na tekući položaj Scroll kontrola:

tlCell=f(nScrollPos)

Virtualna koordinata početka iscrtavanja polja kontrole:

Xv0=xSxrollPos,

Yv0=yScrollPos

clip_image005

Slika 3. Mogući položaj vrha gornjeglijevog polja i vrha klient pravougaonuka

Virtualnu koordinatu početka iscrtavanja potrebno je korigovati na taj način da se poklopi sa gornjim lijevim uglom gornjeg lijevog polja s kojim se počinje isctavati polja kontrole.

Na osnovu izloženog možemo zaključiti da je :

Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1) ≤ Xv0 ≤ Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1)+ Widthcol(m)

Odnosno,

Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1) ≤ Yv0 ≤ Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1)+ Heightrow(n)

Gdje je m,n=1,2,….. etc.

Iz gornje nejednačine dobijamo virtualne koordinate početka crtanja,

Xv0 = Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1),

Yv0 = Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1)

Takodjer je vidljivo da lijevoGornje polje :

tlCell=Cell(m-1,n-1);

Na osnovu virtualnih koordinata nije teško izračunati client koordinate:

X0 = fColWidth + (Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1)) – xScrollPos

Y0 = fRowHeight +(Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1) )- yScrollPos

Analogno iznesenom možemo izračunati početnu tačku iscrtavanja fiksiranih kolona i vrsta, koje su direktno vezane za prethodnu koordinatu.

Xfixedcol0 = fColWidth + (Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1)) – xScrollPos

Y fixedcol0 = 0

Xfixedrow0 = 0

Y fixedrow0 = fRowHeight +(Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1) )- yScrollPos

Kada znamo prvo polje od kojeg se počinje iscrtavati nije teško izračunati zdanje polje koje treba biti iscrtano. Ono je u direktnoj vezi sa veličinom klienta pravougaonika te početnog polja za iscrtavanje.

rbCell=f(clientRect, topleftCell)

Projekat BHGridCtrl


O projektu BHGridCtrl

BHGridCtrl je MFC projekat Grid kontrole, koji sam u slobodno vrijeme razvijao dvije godine 2004-2006. Obzirom da je u projekat uloženo poprilično truda kao i da je BHGrid kontrola na kraju implementacije imala popriličan broj osobina koje se mogu primjeniti u aplikacijama, odlučio sam je objaviti u obliku Open Source u fazama po kojim je i implementirana. U narednim postovima biće objavljene na način koko je sama kontrola bila razvijana.

U slučaju da imate vremena na pretek ili  veliku želju da programirate u C++ ovakvu kontrolu, slobodno me kontaktiraje, zaista bi bilo lijepo kada bi se ova kontrola nastavila razvijati.

Razlozi prestanka razvoja projekta:

  1. Projekat sam prestao razvijati jer zaista nemam vremena za ovakvo kompleksan projekat, jer mi rokovi i komercijalni projekti neostavljaju prostor.
  2. Prelazak na .NET platformu i C# programski jezik.

Projekat posjeduje popriličnu dokumentaciju, liste funkcionalnosti, odredjenih proračuna, kroz verzije. Source kod je također komentiran tako da se može razumijeti logika. Nekada zbog brzine i vremena komentari su mješavina egleskog i bosanskog jezika.

Imlementacija prve verzije BHGridCtrl – Ljeto 2004

Početak implementacije datira iz 2004, s tim da su određene metode bile dosta ranije implementirane. U to vrijeme primjenjivao sam dvije open source grid kontrole: ALXGrid te MFCGrid, koje su svaka za sebe imale prednosti i nedostatke. Ideja BHGridCtlr je bila bazirana na pomenutim kontrolama, ali BHGridCtrl sadrži svoju originalnu logiku. Prva verzija izbačena negdje u ljeto 2004 godine. Sadržavala je jednostavnu rešetku u kojoj su bile implementirane metode za iscrtavanje Grid kontrole, kao i ćelije koje su sadržavaje tekst sa koordinatama (indexima). Naredna slika pokazuje prvu alfa verziju kontrole.

clip_image002

Ova verzija nije imala nikakvih funkcija osim skrolanja i grafičkog manipulisanja vrstama, kolonama i ćelijama u smislu selekcije, resajziranja i skrolanja.

Projekat BHGridCtrl je sadržavao dvije datoteke (zajedno cpp i h):

1. BHGridCtrl.cpp i zaglavlje

2. BHGridCell.cpp i zaglavlje

Osobine BHGridCtrl ALFA

Osnovne osobine prve verzije:

1. Nepokretne (Fixed) kolone i vrste – sa SetFixedColumnCount(3) i SetFixedRowCount(3) definišemo broj nepokretnih kolona/vrsta

clip_image004

2. Selekcija ćelija, pojedinačno i grupno. Prilikom držanja tipke CTRL moguće je selektovati različite regione ćelija. Ova osobina je slična selekciji u Excelu (donja slika).

clip_image006

3. Automatsko resajziranje kolona i vrsta, resajziranje kolona i vrsta pomoću miša i dinamički. Različite visine vrsta su podržane.

clip_image008

4. Skrolanje Grid kontrole. Ako želimo da određena ćelija se pojavi u klijentsko vidljivo područje metode za skrolanje ćelije su implementirane. Test skrolanja je prikazan u demo programu. Skrolanje je vrlo važna i kompleksna osobina. Obziromda Grid kontrola može posjedovati veliki broj vrsta i kolona, ona se ipak svodi na iscrtanja samo onih ćelija koje su vidljive na monitoru. Kada se skrola ili prikazuje ćelija koja nije u vidnom polju potrebno je implementirati posebnu logiku.

clip_image010

Izvorni kod prve verzije projekata uradjen je u VS 2003, i može se skinuti sa ovog linka.

U narednom postu biće riječi oko same implementacije iscrtavanja Grid kontrole