喫茶XRAYトップページ

[▲前のスレッド]

[783] 自前のFormに縦書きしたい返信 削除
2006/4/29 (土) 18:16:48 taki
マスター 教えてください。

やりたい事は、
自前のFormにButton1とEdit1とImage1が配置してあり、
Edit1に文字を入力するとImage1に縦書きで表示される。
また、Button1をクリックするとイメージのまま印刷できる。

私が試みたのは、
逐次表示形式と専用のプレビューフォーム以外の使用の
例を組み合わせました。

※ EnterFormUnit がずばりそのものなのですが、フォームを
フォームの新規作成で作るせいか、コードを書き換えると
コンパイラに叱られてしまいます。
それで、以下のような方法をとりました。

Form1にはplSetPrinter1とplPrev1とボタンとEdit1を配置、
Form2にはImage1とボタンを配置しました。

以下にコードを示します。

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    plSetPrinter1: TplSetPrinter;
    plPrev1: TplPrev;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    procedure Kakikomi;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  plPrev1.ProcName := Kakikomi;
  plPrev1.PageCount := 1;
  plPrev1.FormName := 'Form2';
  plPrev1.ShowModal;
end;

procedure TForm1.Kakikomi;
begin
  plPrev1.TextSpecial(300,300,270,100,Edit1.text);
end;

end.

=======================================================
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  Image1.Canvas.StretchDraw(Image1.ClientRect,
                        Form1.plPrev1.GetMetaimage(1));
end;

end.

これを実行して、Form1のボタンを押すと、Form2が表示
されます。ボタンを押すと何かクシャクシャの表示に
なってしまいます。
さらに、一度Form2を閉じて、再びForm1のボタンでForm2を
表示しようとすると、
例外クラスEStackOverflow(メッセージ’スタック
オーバーフロー’)になります。(暴走している!?)

この方法では無理なのでしょうか。
連続して投稿になりますが、よろしくお願いします。

[784] Re:自前のFormに縦書きしたい返信 削除
2006/4/29 (土) 19:46:23 Mr.XRAY
▼ takiさん

失礼しました。TplPrevのマニュアルのサンプルを参考にしたと思います。

> されます。ボタンを押すと何かクシャクシャの表示に
> なってしまいます。

このクシャクシャになるのはわかりませんが。

私の場合、他のFormをShowModalで表示する時は、リソース節約のため、
[プロジェクト][オプション]で、表示するFormを[選択可能なフォーム]
にして、非表示する度に生成して利用しています。
以下のような具合です。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Form2=nil then Form2:=TForm2.Create(Self);
  try
    plPrev1.ProcName := Kakikomi;
    plPrev1.PageCount := 1;
    plPrev1.FormName := 'Form2';
    plPrev1.ShowModal;
  finally
    FreeAndNil(Form2);
  end;
end;

もし、takiさんの様に、自動生成でない場合(アプリ起動時同時にForm2も
生成してしまう場合)は、以下の様に、Form2を表示して下さい。
Form2を表示したらプレビューするコードを実行します。
個人的には、特別の理由がない限り、上のコードをお勧めします。
というのは、必要な時に生成して、必要がなくなったら破棄して利用する
と、Form2の存在が確実に把握できるからです。

procedure TForm1.Button1Click(Sender: TObject);
begin
    plPrev1.ProcName := Kakikomi;
    plPrev1.PageCount := 1;
    plPrev1.FormName := 'Form2';
    Form2.ShowModal;
  end;
end;

[786] Re2:自前のFormに縦書きしたい返信 削除
2006/4/30 (日) 00:13:32 Mr.XRAY
▼ takiさん

前のレスの現象は、TplPrevの仕様です。

plPrev1.FormName:='XXX';
で指定したフォームを監視して、自動的に(再度ShowModalした時に)検出
して操作するように修正することも可能ですが、あえてしていません。
これは、プレビューフォームに対する操作に柔軟性を持たすためと考えて
下さい。
この現象に関しての、修正予定は、全くありません。(^_^;)
必要であれば、ご自分で修正して下さい。
FormNameプロパティで指定するフォームを(nilでなければ)一度破棄して
生成するようにします。ただし、汎用的にするには、多少工夫が必要とな
るでしょう。


[788] Re3:自前のFormに縦書きしたい返信 削除
2006/4/30 (日) 15:33:24 taki
▼ Mr.XRAYさん

マスター ありがとうございます。

Form2にEditを配置して、Form1.Edit1.Text := Form2.Edit1.Text;
としておいて、Form2のボタンを押して再表示させたら、縦書きで文字が
出ました。

くしゃくしゃになっていたのは、フォントを適切に設定したら直りました。
それと、用紙の端の数mmは印刷できない領域なのですね。
ワードなどで分かっていたはずなのに、気づくのに時間がかかりました。

それと、表示する時にFormを生成して、非表示では破棄する方法のソースを
そのまま使わせていただきます。
勉強になりました。m(__)m

[794] Re4:自前のFormに縦書きしたい返信 削除
2006/5/23 (火) 23:25:01 taki
▼ Mr.XRAYさん

失礼しました。削除します。

[800] Re5:自前のFormに縦書きしたい返信 削除
2006/5/27 (土) 22:58:30 Mr.XRAY
▼ takiさん こんにちは。

> 失礼しました。削除します。
あれっ、ゴメンなさい。確かに発言は読んだのですが、レスしようと
している間に...

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82