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

Вниз

Нужно содержимое большой панели вывести в EMF файл   Найти похожие ветки 

 
Mielofon   (2008-07-11 19:47) [0]

Нужно всё содержимое панели вывести в EMF файл.

Имеем следующий код. Просто тест.

unit Unit24;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm24 = class(TForm)
   ScrollBox1: TScrollBox;
   Panel1: TPanel;
   Button1: TButton;
   Edit1: TEdit;
   procedure FormShow(Sender: TObject);

   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   procedure PaintScaleVCLToEMF(Scale: double);
   { Private declarations }
 public
   { Public declarations }
   sp: TPanel;
 end;

var
 Form24: TForm24;

implementation

{$R *.dfm}

procedure TForm24.Button1Click(Sender: TObject);
begin
 PaintScaleVCLToEMF(StrToFloat(Edit1.Text));
end;

procedure TForm24.PaintScaleVCLToEMF(Scale: double);
var
 i, j, res: integer;
 sl: TLabel;
 mf: TMetaFile;
 mfc: TMetafileCanvas;
 rect: TRect;
 rgn: HRgn;
begin
 if sp <> nil then FreeAndNil(sp);

 //Создаём панель и кучу лабелов с учтом масштаба
 sp := TPanel.Create(nil);
 sp.Visible := false;
 sp.Parent := ScrollBox1;

 sp.Left := 10; sp.Top := 10;
 sp.Width := round(1000*Scale);
 sp.Height := round(1000*Scale);

 for j := 0 to 8 do begin
   for i := 0 to 65 do begin
     sl := TLabel.Create(sp);
     with sl do begin
       Parent := sp;
       Top := Round(i*15*Scale);
       Left := Round(20+ j*110*Scale);
       Width := Round(100*Scale);
       Height := Round(10*Scale);
       Caption := "Text "+ IntToSTr(i);
       Font.Height := Round(-11*Scale);
       Alignment := taCenter;
       BevelWidth := Round(2*Scale);
       Layout := tlCenter;
       AutoSize := False;
       case ((i+j) mod 4) of
         0: Color := clWhite;
         1: Color := clGray;
         2: Color := clGreen;
         3: Color := clRed;
       end;
       ParentColor := False;
       ParentFont := False;
     end;
   end;
 end;
 sp.Visible := true;

 mf := TMetaFile.Create;
 mf.width := sp.Width;
 mf.Height := sp.Height;

 mfc := TMetafileCanvas.Create(mf, 0);

//  res := GetClipBox(mfc.Handle, rect);
//  rect.Right := sp.Width div 2;
//  rect.Bottom := sp.Height div 2;
//  rect.Left := 500;
//  rect.Top := 500;

//  rgn := CreateRectRgnIndirect(rect);
//  ExtSelectClipRgn(mfc.Handle, rgn, RGN_OR);
//  SelectClipRgn(mfc.Handle, rgn);

//  res := GetClipBox(mfc.Handle, rect);

 sp.paintTo(mfc, 0,0);
 with mfc do begin
   pen.color := clRed;
   pen.width := 4;

   // рисуем крест по диагонали
   moveto(0,0);
   lineto(sp.width, sp.Height);
   lineto(0, sp.Height);
   lineto(sp.width, 0);

   GetClipBox(mfc.Handle, rect);

   // рисуем ClipBox нашего MetaFileCanvas
   moveto(rect.Right,rect.Top);
   lineto(rect.Right, rect.Bottom);
   lineto(rect.Left, rect.Bottom);
 end;

 mfc.Destroy;
 deletefile("123.emf");
 mf.SaveToFile("123.emf");

 mf.Destroy;
end;

procedure TForm24.FormCreate(Sender: TObject);
begin
 sp := nil;
end;

procedure TForm24.FormShow(Sender: TObject);
begin
 PaintScaleVCLToEMF(StrToFloat(Edit1.Text));
end;

end.


Так вот получается следующая петрушка:
Если панель влазит на экран (зависит от разрешения, у меня например PaintScaleVCLToEMF(0.5) ), то все созданые TLabel прекрасно выводятся в EMF.

Но если размер выводимой панели зашкаливает (PaintScaleVCLToEMF(10) например) то выводится только та часть TLabel-ов, которая "как бы" попадает на экран (в левом верхнем углу EMF). Хотя на самой форме они все прекрасно показываются (если поскролить TScrollBox). При этом LineTo, MoveTo отрабатывают по всей площади EMF.

Вот вопрос:
 как бы сделать что бы вывелись все компоненты?


 
MultIfleX   (2008-07-18 14:51) [1]

А для чего создавать кучу лабелов с именами "text 1","text 2","text 3"..а потом их выводить в метафайл ?? Если нужно выводить только текст, то используй DrawText(). Или нормально поясни задачу, лично пока смотрел код сломал голову.

> Хотя на самой форме они все прекрасно показываются (если
> поскролить TScrollBox).

поясни как скроллиш, если создаются и выводятся в одной процедуре?

улыбнуло TForm24 )) у тебя 24 формы ? o_O

ЗЫ. Код твой запустил в малюююсеньком окне, выполнил и ВЫВЕЛИСЬ В ФАЙЛ ОБСОЛЮТНО ВСЕ МЕТКИ и КРАСНЫЙ КРЕСТ ПОВЕРХ, ничего не менял, нахожусь в замешательстве - ты чаво спросил то??


 
Mielofon   (2008-07-22 18:12) [2]

>А для чего создавать кучу лабелов с именами "text 1","text 2","text 3"..а >потом их выводить в метафайл ?? Если нужно выводить только текст, то >используй DrawText().
Это пример. Пример создал за 5ть минут на коленках только для демонстрации ошибки. Никакого практического смысла тут нет.
Там где есть смысл выводятся не TLabel-ы, а другие компоненты, но суть от этого не меняется.


 
Mielofon   (2008-07-22 18:12) [3]

>Или нормально поясни задачу, лично пока смотрел код сломал голову.
Там коду 3 строчки - где там разбираться то?

>поясни как скроллиш, если создаются и выводятся в одной процедуре?
Скролю ручками/мышкой - там справа и внизу скролбары.

Вот что мы видим (масштаб 2 в поле ввода - что бы картинки поменьше были) если отскролить в правый нижний угол:
http://img246.imageshack.us/img246/9429/p1xx8.jpg

т.е. на ScrollBox1 у нас 65 строчек с TLabel-ами (колонки не считаем)

А вот что выводится в наш EMF:
http://img170.imageshack.us/img170/7476/123resizeiw0.jpg

Увеличеный центр:
http://img413.imageshack.us/img413/1037/123resizebt0.jpg

Т.е. видно что вывелось только 28 рядов TLabel-ов, а остальные 17ть пропали.


 
Mielofon   (2008-07-22 18:13) [4]

Если увеличивать масштаб, то будет ещё хуже. Если уменьшать, то можно добится, когда  размер выводимой EMF будет меньше разрешения экрана и тогда все войдут.

>ЗЫ. Код твой запустил в малюююсеньком окне, выполнил и ВЫВЕЛИСЬ В >ФАЙЛ ОБСОЛЮТНО ВСЕ МЕТКИ и КРАСНЫЙ КРЕСТ ПОВЕРХ, ничего не менял, >нахожусь в замешательстве - ты чаво спросил то??
А у тебя что все 65 рядов вывелись при масштабе 10?
Если так, то давай скриншот в студию. Можешь куда-нибудь EMF запулить - они маленькие к Кб получаются, но правда большие по разрешению :-)

При масштабе 10, т.е. сразу после запуска данной програмки получается EMF размером 10006x10006 размером в 36Кб с 5тью строчками и 2мя рядами TLabel-ов.

Обсуждение есть ещё http://www.delphikingdom.com/asp/answer.asp?IDAnswer=63747, но решения проблемы так и нет.


 
Mielofon   (2008-07-22 19:11) [5]

Вот сам EMF http://depositfiles.com/files/6711200


 
multiflex   (2008-07-25 07:17) [6]

Повторно создал форму и разместил компоненты прям как у тебя, и снова все прекрасно вывелось...
http://img133.imageshack.us/img133/6738/votvedxga1.jpg

Вы скажете ДевидБлейн?? Аннет - в vcl косяк гдето.. у мну д2007.


 
Mielofon   (2008-07-25 15:24) [7]


> Вы скажете ДевидБлейн?? Аннет - в vcl косяк гдето.. у мну
> д2007.
>

В рот мне ноги! :-)
У меня Delphi 2006. Действительно исправили видимо.
Пошел думать насчёт перехода....

Спасибо.



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1247575543
b/@.
2009-07-14 16:45
2009.09.13
Как рисовать на форме поверх всего ?


15-1247725073
TUser
2009-07-16 10:17
2009.09.13
Уж не знаю, в каком мы веке живем,


15-1247605777
Игорь Шевченко
2009-07-15 01:09
2009.09.13
С днем рождения, Digitman!


1-1215010376
int64
2008-07-02 18:52
2009.09.13
Как узнать текущее московское время?


9-1181818935
MegaVolt
2007-06-14 15:02
2009.09.13
Несколько компонентов исспользующих OpenGL не работают вместе :(