Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];

Вниз

Нужно содержимое большой панели вывести в 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
6-1206613280
Stepper
2008-03-27 13:21
2009.09.13
IdHTTP - как в Get запросе обработать сразу два ЮРЛ?


15-1247250170
Аноним
2009-07-10 22:22
2009.09.13
С днем рождения, Ketmar


15-1247400180
Василий М
2009-07-12 16:03
2009.09.13
Посоветуйте, на какую версию Дельфи переходить


2-1247430369
dplz
2009-07-13 00:26
2009.09.13
Архивы и изображения :)


15-1247728694
desc
2009-07-16 11:18
2009.09.13
PostgreSQL, доступ из одной БД в другую, построение views...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский