[ FranjoZG @ 12.12.2019. 09:33 ] @
Koristim QRRichText kontrolu za ispis teksta koji kreiram u toku izvršenja programa.
Da li postoji mogučnost da se napravi poravnanje teksta Justify, tj. da tekst bude od margine do margine, da nije "nazubljen".
U property-ima ima mogučnosti: taCentar, taLeftJustify, taRightJustify

Ili možda neki drugi način ispisa teksta za kog ne znam unaprijed niti sadržaj niti veličinu?
[ savkic @ 12.12.2019. 11:59 ] @
Jedino da sam iscrtavas tekst putem DrawTextEx WinApi funkcije i tu ima ta opcija za poravnanje.
[ Rapaic Rajko @ 13.12.2019. 12:52 ] @
Radio sam to ne tako davno, napravio novi komponent od TQRMemo.

Dakle, treba pronaci u kodu komponenta gde se text split-uje u linije, i u svakoj liniji dopunjavati postojece praznine (izmedju reci) dodatnim space-ovima.
Krajnji rezultat je bio ok, ali nikad tako dobar kao sto radi recimo Word. To zato sto Word radi to isto na grafickoj osnovi ('umece' pixel-e, a ne space-ove).

[ FranjoZG @ 13.12.2019. 14:23 ] @
Rapaic Rajko, hvala, nije mi palo na pamet :). Probat ću s ubacivanjem space-ova ili možda "i" ili "." s fontcolor = clWhite jer je "uži"
FastReport koji je uz Delphi XE 10 ima tu mogučnost, ali... stari, glomazni program... tko će platit njegovo prepisivanje...

Pokušavam dogovorit da samo taj dio programa (ispise) prebacim u novi Delphi.
[ tkaranovic @ 13.12.2019. 14:41 ] @
Nisam sa QR koristio ali kad god mi je trebalo nesto iz novijeg Delphija u starijem pravio sam dll.
[ FranjoZG @ 13.12.2019. 16:58 ] @
Da li se može dobiti TextWidth na QuickReportu? Umetanje "i" mi izgleda OK, ali sam dodao tqrLabel, stavio Enabled := false (da se ne vidi na ispisu) i preko nje dobijem širinu retka. To mi je malo "zaobilazno".
Može li se dobiti (kao na formi) stvarna širina teksta, sa fontrom koji mi je zadan u rich-u, bez da ga upisujem u Caption labele?

Gledao sam malo kod same kontrole, prekomplicirano mi izgleda njega mijenjati...
[ Rapaic Rajko @ 16.12.2019. 09:01 ] @
Postoji metod TCanvas.TextWidth(aText: string): integer;

Treba ti neki Canvas. Ukoliko nije dostupan u samoj RichText kontroli (kroz property), mozes da ga kreiras. Zatim napucas Canvas.Font na font koji te zanima, i konacno pozoves Canvas.TextWidth().
Ukoliko kreiras Canvas, ne zaboravi da ga unistis (na kraju).
[ delfi1122 @ 16.12.2019. 09:35 ] @
Možda glupa ideja ali treba probati. U wordu spremiti .rtf kao full width poravnanje, kopirati tekst koji treba u taj .rtf file i onda ga učitati u Rich? Možda bi upalilo?
[ FranjoZG @ 16.12.2019. 09:43 ] @
Imam problem pri prinutu, na preview je OK. Ne izgleda isto tekst. Funkcija jednako razlomi tekst, ali ne izgleda isto tj. na preview je lijepo poravnat, a na printu je i dalje nazubljen. Širina retka je dugačija.
Napravio sam sljedeće:
- kreiram tqrlabel koju postavim na isti band gdje mi je RichText, postavim font, lijevu marginu, širinu. Kad sam gotov - naravim free
- u labelu stavljam tekst, riječ po riječ dok ne dođem do max. širine koja je <= zadatoj
- idem od prvog space-a na dalje i dodajem po jedan dok ne dobijem širinu koja je <= zadatoj

Na Preview tekst izgleda sasvim ok (nije kao word, ali...), kad ga ispišem ili spremim u PDF, kao da je promijenjen font, nazubljenost je prilična.

Probao sam sa QRPrinter.Canvas.TextWidth, ako radim preview - ok, ali ako je print dobijem vrijednosti koje nemaju veze sa širinom teksta. Primjer za jedno slovo: label.width = 11; QRPrinter.Canvas.TextWidth = 66
[ delfi1122 @ 16.12.2019. 09:56 ] @
Probaj iz worda (poravnano) kopirati u Richtext i probaj to isprintati da vidimo kako će ispasti.
[ tkaranovic @ 16.12.2019. 15:09 ] @
Evo koda koji je za high a na isti nacin moze da se koristi za width.

Inace QR sam napisao da ne koristim a ovaj kod sam nasao jer kako to inace radi.


Code (delphi):

var
 W, x, y: Integer;
 R: TRect;
 Scale, TxtHeight: Extended;
 cap: String;
begin
 Scale := QRPrinter.XFactor / Screen.PixelsPerInch * 254;
 QRPrinter.Canvas.Font := Font;
 QRPrinter.Canvas.Font.Height := Round(Scale * Font.Height);

 SetRect(R, QRPrinter.XPos(OfsX + Size.Left),
   QRPrinter.YPos(OfsY + Size.Top),
   QRPrinter.XPos(OfsX + Size.Left + Size.Width),
   QRPrinter.YPos(OfsY + Size.Top + Size.Height));
 if not Transparent then
   with QRPrinter.Canvas do
   begin
     Brush.Color := Color;
     Brush.Style := bsSolid;
     FillRect(R);
     Brush.Style := bsClear;
   end;
 W := Round(Scale * 2);
 Frame.InsideRect(R, W);
 TxtHeight := (Canvas.TextHeight('W')) * Scale;

 Cap := 'Some text for print';
 W2 := QRPrinter.Canvas.TextWidth(Cap);
 Y := R.Top + Round(TxtHeight);
 X := R.Left;

 Frame.InsideRect(R, -W);
 ExtTextOut(QRPrinter.Canvas.Handle, X, Y, ETO_CLIPPED, @R, @Cap[1], Length(Cap), nil);
 Frame.InsideRect(R, W);

 PrintFinished := True;
 Frame.InsideRect(R, -W);
 Frame.PaintIt(QRPrinter.Canvas, R, Zoom, []);
end;
 

[ FranjoZG @ 16.12.2019. 15:21 ] @
Uspio sam, delfi1122 mi je dao dobru ideju. Ako će nekom trebati:

- Kreirao sam u word-u prazan dokument, poravnao redak (Justify) i spremio kao RTF
- prije upisa teksta u TQRRichText napravil .Lines.LodaFromFile('moj.rtf')
- Dodam tekst koji mi treba (.lines.Append('Neki tekst')

rtf sam linkao u exe preko resource file-a i radi ok.
Prview i print su odlični, lijepo poravnati. Još ostaje problem sa SaveToPDF, prvi redak teksta je "razmrljan", slova duplicirana, kao kad je nekad glava s trakom vukla traku po papiru.
[ FranjoZG @ 16.12.2019. 15:40 ] @
tkaranovic, zar to nije ispis direktno, bez slaganja forme u qr-u?
Imam TQRRichText na qr-u koji popunjavam. Kako to napraviti s tvojim kodom?
[ tkaranovic @ 16.12.2019. 15:59 ] @
Jeste direkno ali 66 daje ili zato sto fali isti font ili zato sto je XFactor drugaciji kad printuje.
[ FranjoZG @ 14.01.2020. 19:37 ] @
Nadopuna. Moja ideja Word -> rtf -> ispis je OK ako radite samo ispis, ali ako radite export u PDF, odustanite... Shvatio sam to nakon 3.000 ispisani i exportiranih u PDF.
Rtf tekst je "razmrljan", izgleda kao da glava štampača struže po papiru i razmazuje slova.

Nema mi druge ne taj kod napisati u Delphi XE, on ima to pravnanje. Program je preglomazan da ga cijelog pišem (nitko neće platit), samo ću taj dio pa ga pozivati kao vanjski, ne koristi se često.