Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Как напечатать форму, не открывая её полностью?   Найти похожие ветки 

 
allucard   (2007-04-26 15:17) [0]

Доброго всем дня.

Использую метод Form2.Print, но он выводит на печать только видимую часть формы.
Форма большая (А4) и на экран не влазит по вертикали.
Как напечатать форму целиком, не открывая её на весь экран?

Спасибо.


 
allucard   (2007-04-26 15:49) [1]

Добрался до function TCustomForm.GetFormImage: TBitmap;

изменил

   Result.Width := ClientWidth;
   Result.Height := ClientHeight;

на

   Result.Width := Width;
   Result.Height := Height;

не помогло.

Может файл Forms.pas нужно откомпилировать?
Если да, то как?


 
Сергей М. ©   (2007-04-26 15:55) [2]


> allucard   (26.04.07 15:49) [1]


> Добрался


> изменил


>
> Может файл Forms.pas нужно откомпилировать?


Самоделкин, блин)


 
clickmaker ©   (2007-04-26 15:56) [3]


> [1] allucard   (26.04.07 15:49)

зачем генофонд-то трогать? А если в следующий раз понадобится именно ClientWidth?
Возьми лучше код функции, подправь и используй отдельно. Или наследника от TForm напиши с перекрытой


 
allucard   (2007-04-26 16:06) [4]


> зачем генофонд-то трогать?

ради интереса и познания непознаваемого)


> Возьми лучше код функции, подправь и используй отдельно.

ты думаешь там одна функция за печать отвечает?)


> Или наследника от TForm напиши с перекрытой

функцией GetFormImage?


 
allucard   (2007-04-26 16:08) [5]


> Самоделкин, блин)

от вас пока ответа дождёшься, так проще и велосипед придумать,
хоть и с квадратными колёсами, но велосипед)


 
allucard   (2007-04-26 16:17) [6]


> clickmaker ©   (26.04.07 15:56) [3]

> Или наследника от TForm напиши с перекрытой

Перекрыть Static method?
А как?


 
clickmaker ©   (2007-04-26 16:25) [7]


> [6] allucard   (26.04.07 16:17)

ну не помню я, какие там методы виртуальные, какие нет...
код, значит, возьми оттуда


 
allucard   (2007-04-26 16:29) [8]


> код, значит, возьми оттуда

там не одна функция.


> clickmaker ©   (26.04.07 16:25) [7]

а всётаки, как откомпилировать Forms.pas?


 
clickmaker ©   (2007-04-26 16:50) [9]


> как откомпилировать Forms.pas?

если у тебя не "build with runtime packages" с vcl, то можно forms.pas положить в lib, а forms.dcu убрать
Но, ИМХО, не лучший способ. разве что в познавательных целях


 
allucard   (2007-04-26 20:02) [10]


> clickmaker ©   (26.04.07 16:50) [9]

Спасиб.
Буду думать.


 
Loginov Dmitry ©   (2007-04-26 23:42) [11]

> как откомпилировать Forms.pas?


Скопировать данный модуль в каталог со своей прогой, в файле проекта удалить ссылку на данный модуль, далее выполнить команду Project/Add To Project, выбрав свою версию модуля. Далее можешь делать с этим модулем все, что хошь.


 
allucard   (2007-04-27 08:21) [12]

Не печатает ту часть изображения, которая не влазит на экран.
Даже если изменить ClientWidth и ClientHeight.

Что делать?


 
allucard   (2007-04-27 10:07) [13]

Что если при переписывании метода не указать override?


 
stakan ©   (2007-04-27 10:19) [14]


> Перекрыть Static method?

Зачем override?


 
allucard   (2007-04-27 12:25) [15]


> stakan ©   (27.04.07 10:19) [14]

я о Dynamic.


 
allucard   (2007-04-27 12:35) [16]

Почему Height устанавливается не более чем на 780?


 
ЮЮ ©   (2007-04-27 13:02) [17]


> Почему Height устанавливается не более чем на 780?

мониторчик возьми получше и пикселей в высоту выставь по-больше.
Форму на экране ты, между прочим, скроллируешь, а не перемещаешь, чтобы работать со совоим "A4 ".


 
allucard   (2007-04-27 13:15) [18]

По логике:

из-за того что я не могу установить Height на 780 у меня и не печатается.
Т.к. метод GetFormImage использует значения Height, которые неизвестно как вычисляются.

   property Height: Integer read GetHeight write SetHeight;

запутался короче.

Неужели нельзя вывести форму, пусть она и не влазит на экран?


 
allucard   (2007-04-27 13:17) [19]

как сделать снимок невидимой части формы?


 
allucard   (2007-04-27 13:34) [20]

по частям что-ли?


 
Asail   (2007-04-27 13:59) [21]

А зачем все это? Не лучше-ли воспользоваться отчетами? Хоть QuickReport, хоть FastReports... А то завтра, глядишь, захочешь "A0" печатать...


 
allucard   (2007-04-27 15:11) [22]

Вот эта функция рисует:

procedure TWinControl.PaintTo(DC: HDC; X, Y: Integer);
var
 I, EdgeFlags, BorderFlags, SaveIndex: Integer;
 R: TRect;
begin
 Include(FControlState, csPaintCopy);
 SaveIndex := SaveDC(DC);
 MoveWindowOrg(DC, X, Y);
 IntersectClipRect(DC, 0, 0, Width, Height);
 BorderFlags := 0;
 EdgeFlags := 0;
 if GetWindowLong(Handle, GWL_EXSTYLE) and WS_EX_CLIENTEDGE <> 0 then
 begin
   EdgeFlags := EDGE_SUNKEN;
   BorderFlags := BF_RECT or BF_ADJUST
 end else
 if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
 begin
   EdgeFlags := BDR_OUTER;
   BorderFlags := BF_RECT or BF_ADJUST or BF_MONO;
 end;
 if BorderFlags <> 0 then
 begin
   SetRect(R, 0, 0, Width, Height);
   DrawEdge(DC, R, EdgeFlags, BorderFlags);
   MoveWindowOrg(DC, R.Left, R.Top);
   IntersectClipRect(DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top);
 end;
 Perform(WM_ERASEBKGND, DC, 0);
 Perform(WM_PAINT, DC, 0);
 if FWinControls <> nil then
   for I := 0 to FWinControls.Count - 1 do
     with TWinControl(FWinControls[I]) do
       if Visible then PaintTo(DC, Left, Top);
 RestoreDC(DC, SaveIndex);
 Exclude(FControlState, csPaintCopy);
end;


здесь для меня много непонятного, кто может увидит, где здесь задаётся высота и ширина?


 
clickmaker ©   (2007-04-27 15:16) [23]


> где здесь задаётся высота и ширина?

а почему она именно здесь должна задаваться?
Здесь просто рисуется содержимое контрОла заданных габаритов


 
allucard   (2007-04-27 15:23) [24]


> clickmaker ©   (27.04.07 15:16) [23]


> заданных габаритов

мне о нужны заданные габариты


 
{RASkov} ©   (2007-04-27 15:29) [25]

> [24] allucard   (27.04.07 15:23)

У тебя скролы у формы есть? ScrollBars


 
allucard   (2007-04-27 15:35) [26]


> {RASkov} ©   (27.04.07 15:29) [25]

Вообще есть.

Если их убрать форма обрежет всё, что попадёт ниже Height.


 
{RASkov} ©   (2007-04-27 15:45) [27]

> [26] allucard   (27.04.07 15:35)
> Вообще есть.

Ну так вот ни PaintTo ни GetFormImage не орисуют ту часть, что невходит в видимую область контрола...
Рисуй ручками... вот намек:
var B: TBitMap;
...........
X:=0; Y:=0;
B.Width:=HorzScrollBar.Range; B.Height:=VertScr....
начало какого-нить цикла begin
HorzScrollBar.Position:=X; VertSc...
PaintTo(B.Canvas, X, Y);
X:=X+.... ; Y:=Y+  // Вообщем здесь расчитывай новые координаты
end; //конец цикла
И в B: TBitMap у тебя форма целиком...
Сорри... убегаю, если не придумаешь то позже ченить решим. Но лучше сам.


 
allucard   (2007-04-27 15:59) [28]


> {RASkov} ©   (27.04.07 15:45) [27]

Спасиб.
Я понял, по частям, а начало дорисовки задавать в PaintTo через x, y.

А форма обязательно должна быть видимой?



Страницы: 1 вся ветка

Текущий архив: 2007.05.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.05 c
3-1172797089
Ш-К
2007-03-02 03:58
2007.05.20
Как получить записи с единственным значением поля?


1-1175036331
Димон
2007-03-28 02:58
2007.05.20
Ошибки при добавлнии элемента в TListView


2-1178093069
RomanLN
2007-05-02 12:04
2007.05.20
помогите новечку


11-1159541285
Redline
2006-09-29 18:48
2007.05.20
KolPng


2-1178280929
Sapos
2007-05-04 16:15
2007.05.20
Перехват нажатия клафиш