掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ディスプレイの解像度以上の大きさを持つフォームを印刷するには? (ID:34339)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Mr.XRAYさん、KHE00221さん、何度もご回答感謝しています。 私の説明が悪いのと、Delphiについての勉強不足とで、大変なお世話をおかけしています。 さて、これ以上、要領を得ない説明を重ねては大変失礼ですので、 お恥ずかしいしだいではありますが、 私の自作のコンポーネント(作成途中です。フォントの表示サイズが不安定です)とそれを載せたProjectのソースをご覧ください。 (Delphi上級者からご覧になれば、まことにつたないものですが、その点、初心者ゆえのことと、どうぞご勘弁を願います。) A4版横置きの一枚のプリントに、縦横600ドットの時計が4×3=12個表示される算数のプリント問題を作りたかったのです。 しかし、このprojectでできたのは、2つの時計しか表示されず、スクロールしたら他の時計は見えるけれど、やはり12個全部が見えるわけではない、予想とはずいぶん違ったものでした。 ごらんいただき、どうぞ、ご教授ください。 ---------------------- unit ImageClock01; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,math; type TImageClock = class(TCustomControl) private { Private 宣言 } ri,ro: real;//目盛の内外径 rl,rs: real;//長針、短針の長さの割合(width/2との比) FPenWidthBorderLine: byte; //境界線の幅 FPenWidthScaleNoon: byte; //正午の線の幅 FPenWidthScale1Minutes: byte; //1分毎の線の幅 FPenWidthScale5Minutes: byte; //5分毎の線の幅 FPenWidthLongHand: byte; //長針の幅 FPenWidthShortHand: byte; //短針の幅 ValueTextRect: TRect;//Position値の描画領域 ValueText: string; //Position値の内容 TextHeight:byte; //キャプションとPosition値のフォント高 FFontSize: Byte; //フォントのサイズ FHours: integer; //時 FMinutes: integer; //分 FLength: integer; //縦横の長さ FOnChange: TNotifyEvent; procedure SetHours(const Value: Integer); procedure SetMinutes(const Value: Integer); procedure SetLength(const Value: Integer); procedure SetFontSize(const Value: byte); //フォントンサイズ設定 procedure SetPenWidthBorderLine(const Value: byte); //境界線の幅設定 procedure SetPenWidthScaleNoon(const Value: byte); //正午の線の幅設定 procedure SetPenWidthScale1Minutes(const Value: byte); //1分毎の線の幅設定 procedure SetPenWidthScale5Minutes(const Value: byte); //5分毎の線の幅設定 procedure SetPenWidthLongHand(const Value: byte); //長針の幅設定 procedure SetPenWidthShortHand(const Value: byte); //短針の幅設定 function HalfAdjust(x: Extended): Longint; //四捨五入 protected { Protected 宣言 } procedure Change; virtual; // OnChangeイベントのイベントディスパッチャ procedure Paint; override; public { Public 宣言 } constructor Create(AOwner: TComponent); override; published { Published 宣言 } property Length: integer read FLength write SetLength default 600;//縦横の長さ property Hours: Integer read FHours write SetHours default 0; // 短針の位置(値) property Minutes: Integer read FMinutes write SetMinutes default 0; // 長針の位置(値) property FontSize: byte read FFontSize write SetFontSize default 48;// キャプションと「値」のフォントサイズ property PenWidthBorderLine: byte read FPenWidthBorderLine write SetPenWidthBorderLine default 3; property PenWidthScaleNoon: byte read FPenWidthScaleNoon write SetPenWidthScaleNoon default 11; property PenWidthScale1Minutes: byte read FPenWidthScale1Minutes write SetPenWidthScale1Minutes default 3; property PenWidthScale5Minutes: byte read FPenWidthScale5Minutes write SetPenWidthScale5Minutes default 5; property PenWidthLongHand: byte read FPenWidthLongHand write SetPenWidthLongHand default 17; property PenWidthShortHand: byte read FPenWidthShortHand write SetPenWidthShortHand default 25; property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnClick; // property Font; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TImageClock]); end; function TImageClock.HalfAdjust(x: Extended): Longint; //四捨五入 begin if x >= 0 then Result := Trunc(x + 0.5) else Result := Trunc(x - 0.5); end; constructor TImageClock.Create(AOwner: TComponent);// コンストラクタ begin inherited Create(AOwner); rl:=80/100; rs:=55/100; Length:=600; FPenWidthBorderLine:=3; FPenWidthScaleNoon:=11; FPenWidthScale1Minutes:=3; FPenWidthScale5Minutes:=5; FPenWidthLongHand:=17; FPenWidthShortHand:=25; FHours:=0; FMinutes:=0; FFontSize:= 48; TextHeight:=HalfAdjust(Font.Size*4/3); // 描画にはチラツキを抑えるためダブルバッファ方式を使う DoubleBuffered := True; end; procedure TImageClock.Paint; var i: integer; begin inherited; Width:=Length; Height:=Length; ri:= round(length div 2 *95/100); ro:= round(length div 2); //境界線 canvas.Pen.Width:=FPenWidthBorderLine; canvas.Pen.Color:= clBlack; canvas.Ellipse(canvas.Pen.Width div 2,canvas.Pen.Width div 2, Length-canvas.Pen.Width div 2, Length-canvas.Pen.Width div 2); //正午 canvas.Pen.Width:=PenWidthScaleNoon; canvas.MoveTo(round(ro-ri*cos(0*2*pi/12+pi/2)),round(ro-ri*sin(0*2*pi/12+pi/2))); canvas.lineTo(round(ro-(ro-canvas.Pen.Width div 2)*cos(0*2*pi/12+pi/2)), round(ro-(ro-canvas.Pen.Width div 2)*sin(0*2*pi/12+pi/2))); //1分毎の線 canvas.Pen.Width:=PenWidthScale1Minutes; for i:=1 to 59 do begin canvas.MoveTo(round(ro-(ri+canvas.Pen.Width*2)*cos(i*2*pi/60+pi/2)), round(ro-(ri+canvas.Pen.Width*2)*sin(i*2*pi/60+pi/2))); canvas.lineTo(round(ro-(ro-canvas.Pen.Width)*cos(i*2*pi/60+pi/2)), round(ro-(ro-canvas.Pen.Width)*sin(i*2*pi/60+pi/2))); end; //5分毎の線 canvas.Pen.Width:=PenWidthScale5Minutes; for i:=1 to 11 do begin canvas.MoveTo(round(ro-ri*cos(i*2*pi/12+pi/2)),round(ro-ri*sin(i*2*pi/12+pi/2))); canvas.lineTo(round(ro-(ro-canvas.Pen.Width)*cos(i*2*pi/12+pi/2)), round(ro-(ro-canvas.Pen.Width)*sin(i*2*pi/12+pi/2))); end; // 文字盤の数値を描く for i:=1 to 12 do begin ValueText := inttostr(i); ValueTextRect := Rect(round(ro-(ri-HalfAdjust(Font.size/2*5/3))*cos(i*2*pi/12+pi/2))-Font.Size, round(ro-(ri-HalfAdjust(Font.size/2*5/3))*sin(i*2*pi/12+pi/2))-HalfAdjust(Font.Size/3*2), round(ro-(ri-HalfAdjust(Font.size/2*5/3))*cos(i*2*pi/12+pi/2))+Font.Size, round(ro-(ri-HalfAdjust(Font.size/2*5/3))*sin(i*2*pi/12+pi/2))+HalfAdjust(Font.Size/3*2));//領域を設定する Canvas.Font.Color := clWindowText; Canvas.Font.Size:= FFontSize; // TextHeight:=HalfAdjust(FFontSize*4/3); DrawText(Canvas.Handle, PChar(ValueText), -1, ValueTextRect, DT_CENTER or DT_SINGLELINE); end; // randomize; // hours:= 0;//random(12); // minutes:= 0;//random(60); //短針 canvas.Pen.Color:= clRed; canvas.Pen.Width:=PenWidthShortHand; canvas.MoveTo(round(ro),round(ro)); canvas.LineTo(round((ro-rs*ro*cos((Fhours+Fminutes/60)*2*pi/12+pi/2))), round((ro-rs*ro*sin((Fhours+Fminutes/60)*2*pi/12+pi/2)))); //長針 canvas.Pen.Color:= clBlack; canvas.Pen.Width:=PenWidthLongHand; canvas.MoveTo(round(ro),round(ro)); canvas.LineTo(round((ro-rl*ro*cos(Fminutes*2*pi/60+pi/2))), round((ro-rl*ro*sin(Fminutes*2*pi/60+pi/2)))); end; procedure TImageClock.Change;// OnChangeイベントのイベントディスパッチャ begin if Assigned(FOnChange) then FOnChange(Self); end; procedure TImageClock.SetHours(const Value: Integer);// 短針の位置(値)を変更する var NewHours: Integer; begin NewHours := Value; if NewHours > 11 then NewHours := 11; if NewHours < 0 then NewHours := 0; // 新しい値(位置)が前の値と異なるなら位置を更新しOnChangeイベントを起こす if FHours <> NewHours then begin FHours := NewHours; Refresh; Change; // OnChangeイベント end; end; procedure TImageClock.SetMinutes(const Value: Integer);// 長針の位置(値)を変更する var NewMinutes: Integer; begin NewMinutes := Value; if NewMinutes > 59 then NewMinutes := 0; if NewMinutes < 0 then NewMinutes := 0; // 新しい値(位置)が前の値と異なるなら位置を更新しOnChangeイベントを起こす if FMinutes <> NewMinutes then begin FMinutes := NewMinutes; Refresh; Change; // OnChangeイベント end; end; procedure TImageClock.SetLength(const Value: Integer);// 縦横の長さを変更する var NewLength: Integer; begin NewLength := Value; if NewLength < 100 then NewLength := 100; // 新しい値(位置)が前の値と異なるなら位置を更新しOnChangeイベントを起こす if FLength <> NewLength then begin FLength := NewLength; Width:=FLength; Height:= FLength; Refresh; Change; // OnChangeイベント end; end; procedure TImageClock.SetFontSize(const Value: byte);// フォントサイズを変更する var NewFontSize: Byte; begin NewFontSize:= Value; if Font.Size <> NewFontSize then begin Font.Size:= NewFontSize; FFontSize:= NewFontSize; TextHeight:=HalfAdjust(FFontSize*4/3); Refresh; Change; end; end; procedure TImageClock.SetPenWidthBorderLine(const Value: byte); var NewPenWidthBorderLine: byte; begin NewPenWidthBorderLine:= Value; if PenWidthBorderLine <> NewPenWidthBorderLine then begin FPenWidthBorderLine:= NewPenWidthBorderLine; Refresh; Change; end; end; procedure TImageClock.SetPenWidthScaleNoon(const Value: byte); var NewPenWidthScaleNoon: byte; begin NewPenWidthScaleNoon:= Value; if PenWidthScaleNoon <> NewPenWidthScaleNoon then begin FPenWidthScaleNoon:= NewPenWidthScaleNoon; Refresh; Change; end; end; procedure TImageClock.SetPenWidthScale1Minutes(const Value: byte); var NewPenWidthScale1Minutes: byte; begin NewPenWidthScale1Minutes:= Value; if PenWidthScale1Minutes <> NewPenWidthScale1Minutes then begin FPenWidthScale1Minutes:= NewPenWidthScale1Minutes; Refresh; Change; end; end; procedure TImageClock.SetPenWidthScale5Minutes(const Value: byte); var NewPenWidthScale5Minutes: byte; begin NewPenWidthScale5Minutes:= Value; if PenWidthScale5Minutes <> NewPenWidthScale5Minutes then begin FPenWidthScale5Minutes:= NewPenWidthScale5Minutes; Refresh; Change; end; end; procedure TImageClock.SetPenWidthLongHand(const Value: byte); var NewPenWidthLongHand: byte; begin NewPenWidthLongHand:= Value; if PenWidthLongHand <> NewPenWidthLongHand then begin FPenWidthLongHand:= NewPenWidthLongHand; Refresh; Change; end; end; procedure TImageClock.SetPenWidthShortHand(const Value: byte); var NewPenWidthShortHand: byte; begin NewPenWidthShortHand:= Value; if PenWidthShortHand <> NewPenWidthShortHand then begin FPenWidthShortHand:= NewPenWidthShortHand; Refresh; Change; end; end; end. -------------------------------------------------------------- unit UnitImageClock04; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ImageClock01, StdCtrls; type TForm1 = class(TForm) ImageClock1: TImageClock; ImageClock2: TImageClock; ImageClock3: TImageClock; ImageClock4: TImageClock; ImageClock5: TImageClock; ImageClock6: TImageClock; ImageClock7: TImageClock; ImageClock8: TImageClock; ImageClock9: TImageClock; ImageClock10: TImageClock; ImageClock11: TImageClock; ImageClock12: TImageClock; PrinterSetupDialog1: TPrinterSetupDialog; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin width:=2700; height:=2220; WindowState:=wsMaximized; ImageClock1.Top:=120; ImageClock2.Top:=120; ImageClock3.Top:=120; ImageClock4.Top:=120; ImageClock5.Top:=920; ImageClock6.Top:=920; ImageClock7.Top:=920; ImageClock8.Top:=920; ImageClock9.Top:=1620; ImageClock10.Top:=1620; ImageClock11.Top:=1620; ImageClock12.Top:=1620; ImageClock1.left:=0; ImageClock5.left:=0; ImageClock9.left:=0; ImageClock2.left:=700; ImageClock6.left:=700; ImageClock10.left:=700; ImageClock3.left:=1400; ImageClock7.left:=1400; ImageClock11.left:=1400; ImageClock4.left:=2100; ImageClock8.left:=2100; ImageClock12.left:=2100; ImageClock1.FontSize:=48; ImageClock2.FontSize:=48; ImageClock3.FontSize:=48; ImageClock4.FontSize:=48; ImageClock5.FontSize:=48; ImageClock6.FontSize:=48; ImageClock7.FontSize:=48; ImageClock8.FontSize:=48; ImageClock9.FontSize:=48; ImageClock10.FontSize:=48; ImageClock11.FontSize:=48; ImageClock12.FontSize:=48; end; procedure TForm1.Button1Click(Sender: TObject); begin randomize; ImageClock1.Hours:= random(12); ImageClock1.Minutes:= random(60); ImageClock2.Hours:= random(12); ImageClock2.Minutes:= random(60); ImageClock3.Hours:= random(12); ImageClock3.Minutes:= random(60); ImageClock4.Hours:= random(12); ImageClock4.Minutes:= random(60); ImageClock5.Hours:= random(12); ImageClock5.Minutes:= random(60); ImageClock6.Hours:= random(12); ImageClock6.Minutes:= random(60); ImageClock7.Hours:= random(12); ImageClock7.Minutes:= random(60); ImageClock8.Hours:= random(12); ImageClock8.Minutes:= random(60); ImageClock9.Hours:= random(12); ImageClock9.Minutes:= random(60); ImageClock10.Hours:= random(12); ImageClock10.Minutes:= random(60); ImageClock11.Hours:= random(12); ImageClock11.Minutes:= random(60); ImageClock12.Hours:= random(12); ImageClock12.Minutes:= random(60); PrinterSetUpDialog1.Execute; Print; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.