programare wxGTK

7 posts / 0 new
Last post
ono
programare wxGTK

Lucrez la un program de evidenţă persoane şi trebuie să printez diverse rapoarte. Programul este în wxGTK şi lucrează cu o bază de date în mysql, folosind API-urile corespunzătoare pentru C/C++. Nu sunt probleme până aici. Nu am optat neapărat pentru o aplicaţie doc-view (cu toate că am dezvoltat şi o astfel de variantă). Afişarea datelor (un tabel destul de simplu) se face pe o fereastră derivată din wxScrollWindow, şi sunt vizibile corespunzător. Pentru listarea la imprimantă am derivat din clasa wxPrintout. Tabelul se întinde peste mai mult de o pagină. Dacă vreau să văd fiecare pagină separat în preview sau, chiar să dau listare, nu îmi apare decât prima pagină. Mai ştiu că aş putea rezolva această problemă cu HTML easy printing, folosind o clasă derivată din wxHTMLWindow, dar nu am încercat încă. Mă chinui de vreo 2 săptămâni să găsesc o soluţie, în cazul mai multor pagini. Pentru una sau două, am reuşit, separând funcţia de desenare în secţiuni de goto şi return-uri. Ce mă pot face dacă am de desenat folosind o buclă for sau while, iar pagina se termină în toiul buclei, trebuind să treacă la una nouă? Şi mai ales dacă nu ştiu nici pe câte pagini exact s-ar putea întinde un astfel de tabel? Rog mult pe cei ce citesc acest răvaş, să mă ierte că vin cu astfel de probleme care nu ţin direct de mandriva (e doar S.Op. în acest caz) şi dacă au idee sau experienţă cu aceste probleme, să mă ajute. Mulţumesc frumos!

cosmin
cosmin's picture
Re: programare wxGTK

Ai putea să izolezi problema și să uploadezi un exemplu scurt? Adică un program de sine stătător, care să nu facă altceva decât să afișeze niște pagini în print preview, așa cum ți se întâmplă ție. Ar fi mai ușor de discutat.

Și apropo, ar trebui să eviți goto-urile.

[url=http://counter.li.org/]Linux registered user #368449[/url]

ono
Re: programare wxGTK

Am mesterit un program de sine statator, pe care pot sa-l afisez, un program cat de simplu posibil, dar merge. La ce adresa sa-l trimit? Scuzele mele, dar sunt chiar novice, fac asta prima oara. As vrea sa trimit fisierul sursa si makefile, cu executabil cu tot, intr-un folder, pe care l-as arhiva. Vreau sa stiu doar, unde, si - cum.
Multumesc foarte mult!  ono.

ono

cosmin
cosmin's picture
Re: programare wxGTK

Dacă arhiva nu are mai mult de 1MB atunci poți să o atașezi la următorul mesaj pe care îl scrii pe forum (vezi la "Additional Options...", sub caseta în care scrii mesajul). Dacă e mai mare atunci las-o fără executabil, doar sursele.

[url=http://counter.li.org/]Linux registered user #368449[/url]

ono
Re: programare wxGTK

Am afacut sa aiba mult sub 1 MB. O trimit imediat.

ono

cosmin
cosmin's picture
Re: programare wxGTK

Uite mai jos diff-ul cu modificările pe care le-am făcut. Am atașat și codul complet, poate ți-e mai la îndemână.

Pe scurt, am făcut variabila contor să fie membru al clasei MyPrintout, ca să nu o ia de la zero de fiecare dată când procesezi o pagină. Contorul se inițializează la începutul imprimării (OnBeginPrinting()). De asemenea, metoda Tabel() întoarce un rezultat care spune dacă a încăput sau nu conținutul. Și în while, nu mai scrii toate liniile până ajungi la sfârșit, ci doar atâtea linii câte încap. Acest lucru îl afli comparând poziția-părții-de-jos-a-liniei (pcrt.y + h) cu dimensiunea paginii (max_y), calculată anterior.

47a48
>     int contor;
58c59,62
 	/**
> 	 * \return 0 if the content fit on the page, or 1 if it did not.
> 	 */
>     int Tabel(wxDC& dc);
145a150
> 
179c184,188
     int fit = Tabel(dc);
> 	if(fit) {
> 		// That was the last page
> 		pageAmount = pageNum;
> 	}
205a215
> 	contor = 0;
208c218
 int MyPrintout::Tabel(wxDC& dc)
212c222
 	int line_count = 150;
218c228
 	if(!dc.Ok()) return 0;
264c274,275
 	int page_full = 0;
> 	while(contor  			if(pcrt.y + h > max_y) {
> 				page_full = 1;
> 				contor--; // last line did not fit
> 				break;
> 			}
275a292
> 		contor++;
276a294
> 	return !page_full;
277a296
> 

Probabil că soluția asta nu e tocmai elegantă, fiind făcută în pripă, dar măcar rezolvă problema.

[url=http://counter.li.org/]Linux registered user #368449[/url]

ono
Re: programare wxGTK

Multumesc foarte mult, Cosmine!

ono