BG Development


Страници: (5) « първа ... 3 4 [5]   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Delphi разни питания., Въпроси от начинаещ.
Pavlov
Публикувано на: 17-03-2017, 16:52
Quote Post



Име: Вълкан Павлов
Група: Потребител
Ранг: Новопостъпил

Мнения: 29
Регистриран на: 21.12.16



Важен въпрос. В случая точно не, но в други сигурно да. При тези гридове обаче може би е по-важно да се направи автоматичното побиране чрез пренасяне на текста, в клетката, с предварително зададен размер. Лично аз ги ползвам само за схематично показване на списък, а правя отделни форми за цялостно визуализиране на съдържанието.В конректния случай просто чета една книга и правя примерите.

Това обаче ми напомни за друг проблем, който от известно време стои без разрешение. В общи линии ситуацията е следната.

1) Текст
2) Стринг или ДБ Грид
3) Текст

Това е за създаване на документ, който съдържа списък. Проблемът е че списъкът може да бъде произволно голям. Как да подходя, за да принтирам формата на колкото страници е нужно? Знам, че мога да обвържа дължината на формата с височината на грида, същото и за позицията на текста под него. Но ако го принтирам, какво ще се случи? Съжалявам че нямам принтер за да тествам, но в обджект инспектора имам една настройка PrintScale. Ако я сложа на poProportional ще се раздели ли формата на повече от една страница? Въобще правилно ли подхождам, опитвайки се да принтирам цялата форма?
PMEmail PosterUsers Website
Top
r4nd0m
Публикувано на: 17-03-2017, 18:48
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1007
Регистриран на: 05.09.07



нещо като Crystal Reports?


--------------------
"Happiness only real when shared."
PMEmail Poster
Top
enf
Публикувано на: 18-03-2017, 09:47
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 42
Регистриран на: 01.08.14



QUOTE

Съжалявам че нямам принтер за да тествам


Не ти трябва физически принтер. Можеш да си дръпнеш виртуален. Пишеш нещо от рода на "print to pdf" в гугъл и си избираш. Ако си с виндовс 10, той си има "вграден" -
Microsoft Print to PDF.

QUOTE
Ако я сложа на poProportional ще се раздели ли формата на повече от една страница? Въобще правилно ли подхождам, опитвайки се да принтирам цялата форма?


Ако си с pro или arch версия на делфи, най-вероятно имаш достъп до сорса на vcl-a. Та,

CODE

procedure TCustomForm.Print;
begin
 Printer.BeginDoc;
 try
   FormImage := GetFormImage;
   Canvas.Lock;
   try
     { Paint bitmap to the printer }
     with Printer, Canvas do
     begin
       Bits := FormImage.Handle;
       
       ...

     end;
   finally
     Canvas.Unlock;
     FormImage.Free;
   end;
 finally
   Printer.EndDoc;
 end;
end;

function TCustomForm.GetFormImage: TBitmap;
begin
 Result := TBitmap.Create;
 try
   Result.Width := ClientWidth;
   Result.Height := ClientHeight;
 ....  
end;


И съответният извод - ще се принтира само *видимата* част от формата. Механизмът е много подобен и при самото визуализирана на формата на екран.

Това, което искаш е т.н. репорт. По-бързият вариант е да използваш готово решение (както предлага r4nd0m). Делфи обикновено върви с някаква "лайт" версия на такива компоненти. Ако си с XE3 или нагоре, трябва да имаш FastReport, иначе - RaveReport. Като цяло са доста бъгави, но вършат работа.

Но при положение, че всичко го правиш за упражнение, ти препоръчвам сам да си направиш печата. Така ще се разбереш що е Canvas и как въобще можеш да рисуваш.

Пример:

CODE

uses
 System.Types,
 Vcl.Printers;

procedure Print;
begin
 Printer.BeginDoc;  // "Printer" е глобална функция, която ти връща default принтера
 try
   Printer.Canvas.Font.Color := $0000FF;
   Printer.Canvas.TextOut(0, 0, 'test test test');
   Printer.Canvas.Font.Color := $000000;
   Printer.Canvas.TextRect(TRect.Create(100, 100, 200, 200), 0, 0, 'another test');
 finally
   Printer.EndDoc;
 end;
end;


Трябва да си извъртиш един цикъл, за да обиколиш всички редове/клетки (в твоя случай - дейтасета, който си вързал с грида) и да ги изведеш на съответните координати. Вече по-нататък, ако разгледаш документацията, ще видиш как можеш да форматираш текст, да рисуваш изображения и т.н.
PMEmail Poster
Top
Pavlov
Публикувано на: 21-03-2017, 14:15
Quote Post



Име: Вълкан Павлов
Група: Потребител
Ранг: Новопостъпил

Мнения: 29
Регистриран на: 21.12.16



Здравейте Enf и r4nd0m

Извинявам се за закъснението, но нямах достъп до компютър няколко дни.
Ще ми трябва и малко време да проуча новите неща. Иначе не е само за упражнение, мъча се да правя една програма, която да ми улесни живота на работа.

Благодаря за включванията!
PMEmail PosterUsers Website
Top
Pavlov
Публикувано на: 23-03-2017, 14:12
Quote Post



Име: Вълкан Павлов
Група: Потребител
Ранг: Новопостъпил

Мнения: 29
Регистриран на: 21.12.16



Прегледах готовите неща, но реших да проуча как стоят работите с последния пример и да се опитам да го направя сам.
Имам обаче няколко неясноти. В Printer.Canvas.TextOut(0, 0, 'test test test'); двете нули са координати за позиция. Не разбирам в какви мерни единици са.
Да речем че имам константен текст в началото и края, и променлив по средата. Малко ми е трудно да уцеля точната позиция на крайния текст. Опитвам се да ползвам Edit1.GetTextLen, това обаче ми връща стойност с която не успявам да работя. С проба-грешка, го докарах до това един символ да е широк 18-19 от мерните единици на координатите. Сега умножавам броя на символите по 18, да речем, но хич не ми се получава точно. Подозирам че и ако се смени листа с друг формат, letter примерно, подредбите ще се развалят. За това ми се иска вместо да задавам цифрови координати, да навръзвам позициите на всяко следващо с предходното. Има ли начин да извлека размера на текст в канвас-а? И мога ли да го визуализирам по някакъв начин, освен с ПДФ-а?

Иначе разбрах че с TextRect, мога да задам размер, но прочетох че размерът е за самата фигура, ако текста стане по-дълъг от нея, ще бъде отрязан. Не можах и да го подкарам това TextRect да се покаже в ПДФ-а.

Поздрави и благодаря отново!

Това мнение е било редактирано от Pavlov на 23-03-2017, 15:50
PMEmail PosterUsers Website
Top
enf
Публикувано на: 23-03-2017, 15:30
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 42
Регистриран на: 01.08.14



Разгледай в документацията методите на TCanvas.

Обърни внимание на TextRect и TextExtent
PMEmail Poster
Top
Pavlov
Публикувано на: 23-03-2017, 15:49
Quote Post



Име: Вълкан Павлов
Група: Потребител
Ранг: Новопостъпил

Мнения: 29
Регистриран на: 21.12.16



Благодарности!

Това мнение е било редактирано от Pavlov на 23-03-2017, 15:49
PMEmail PosterUsers Website
Top
Pavlov
  Публикувано на: 24-03-2017, 17:55
Quote Post



Име: Вълкан Павлов
Група: Потребител
Ранг: Новопостъпил

Мнения: 29
Регистриран на: 21.12.16



TextWidth свърши страхотна работа! Сега всичко се получава много точно. Имам друг подобен проблем обаче този път добре прегледах методите на TCanvas, но може би търся на грешното място. Става въпрос за това че текста трябва да е центриран. С TextWidth мога да му взема широчината и да я разделя на две. Трябва ми широчината на страницата. Като извадя половината от широчината на текста от половината на широчината на страницата, би трябвало да получа точната позиция на въпросния текст. Не успявам обаче програмно да взема размерите на канваса. След като това е отпечатваната страница, може би ще мога да го взема от Printer.PageWidth. Сега се сетих че и отстъпите от началото на страницата ще трябва да бъдат обвързани с нейните размери и може би DPI настройката.
Утре ще тествам.

Това мнение е било редактирано от Pavlov на 24-03-2017, 19:42
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (5) « първа ... 3 4 [5]  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0