喫茶XRAYトップページ


[936] 継承プレビューフォームを作成したいのですが返信 削除
2006/10/19 (木) 22:20:21 taki
マスター takiです。ご無沙汰しています。

また、教えて頂きたく喫茶XRAYに来店しました。

やりたい事は印刷プレビューフォームのボタンの配置を
変えたいのです。

それで、継承プレビューフォームを作成したいのですが、
印刷プレビューフォームをリポジトリに登録するという所から
出来ないのです。

Delhi2005Proをランチャーから起動
メインメニューのツール→リポジトリを開く
左にカテゴリ、右にリポジトリオブジェクトと表示されます。
で、編集と削除のボタンしかなく、さわるとまずいかなと思い、
止まっています。

まず、リポジトリの登録のやり方からご教授願います。m(__)m

[938] Re:継承プレビューフォームを作成したいのですが返信 削除
2006/10/19 (木) 22:52:10 Mr.XRAY
▼ takiさん

読み落としまた.

>やりたい事は印刷プレビューフォームのボタンの配置を
>変えたいのです。


ボタンの配置は,元のプレビューフォームをいじってしまう方法と,継承
フォームで,元のボタンを非表示にしたり,追加の場合はその位置を
  Button.Left:=XXXX
などで指定しないと希望の位置に表示されない場合があります.
でも,とりあえず継承フォームができるようになってからですね.


[940] Re:継承プレビューフォームを作成したいのですが返信 削除
2006/10/19 (木) 23:12:32 Mr.XRAY
▼ takiさん

苦戦ですか.
人生は悩んで大きくなっていくので.もちろん廃人になっていく人もいます.

> まず、リポジトリの登録のやり方からご教授願います。m(__)m
まず,Win32環境で起動するか,Win32開発状態にします.次に元の
plPrevfrm.pas(plPrevfrm.dfm)を開いて下さい.そのフォーム上のどこかで
マウス右クリックすると,以下の図2のようなメニューが現れます.
ここで登録します.

http://homepage2.nifty.com/Mr_XRAY/Delphi/CompoInstall/Repository2005.htm

うまく行かなかったら,またご来店下さい.

[945] Re2:継承プレビューフォームを作成したいのですが返信 削除
2006/10/20 (金) 16:46:08 taki
▼ Mr.XRAYさん

ありがとうございます。
お陰様でリポジトリに登録することができました。

早速、新規のプロジェクトで継承フォームを作成しました。
画面には印刷プレビューのフォームが表示されているのですが、
コードが新規のフォーム作成時のような状態になるのですね。

継承フォームの作成時に「コピー」「継承」「直接使用」と
3種類あるのですが、私の想像ですが、「継承」と「コピー」は
継承元(オリジナル)のコードが保護?されて、「直接使用」では
保護されない。

「直接使用」で継承元が変化すると、そのコンポーネントを既に使って
いたら、そのアプリに影響が出るのかな?
再コンパイルしない限り影響は出ないですよね?

私のやりたい、ボタンの配置を変える(種類も変えたい)場合は、
「コピー」が適当かも・・・と考えております。

根本的な思い間違いがあるかもしれませんが。

[947] Re3:プレビューフォームをコピーして使用する方法返信 削除
2006/10/20 (金) 18:13:49 Mr.XRAY
▼ takiさん

> 私のやりたい、ボタンの配置を変える(種類も変えたい)場合は、
> 「コピー」が適当かも・・・と考えております。


です。直接使用にすると、それを使用している他のアプリに影響します。

コピーを使用する場合は、以下の手順で使用します。

(1)コピーしたplPrevfrmの名前を変更します。変更しないとリソース重複の
   エラーとなります(Nameプロパティを変更)。
(2)名前を変更したら、プロジェクトのフォルダに保存します。
(3)名前を変更したフォームはいくらでも変更可能。
(4)TplPrevのオブジェクト・インスペクタのFormにそのフォームを選択します。
   (コード内で指定してもOK)
(5)自動生成の対象の場合は、そのまま普通に使用します。
(6)選択可能なフォームにした場合は、コード内で生成します。
   (usesにコピーしたフォームのユニットを追加します。
    [ファイル][ユニットを使う]でもOK)

場合によっては以下のコードが必要かも知れません。
継承フォームの場合は、継承元のフォームが自動的にTplPrevと連携を取りま
すが、そうでない時は明示的に指定する必要があることがあります。

  plPrevFormA:=TplPrevFormA.Create(Self); //選択可能なフォームとした時
  plPrevFormA.plPrev:=plPrev1;  //これが必要なことがある


[952] Re4:プレビューフォームをコピーして使用する方法返信 削除
2006/10/20 (金) 21:25:32 taki
▼ Mr.XRAYさん

> です。直接使用にすると、それを使用している他のアプリに影響します。

 おっと。危ないところだった。

> (1)コピーしたplPrevfrmの名前を変更します。変更しないとリソース重複の
>    エラーとなります(Nameプロパティを変更)。


 Nameプロパティの値をplPrevFormAに変更しました。

> (2)名前を変更したら、プロジェクトのフォルダに保存します。

この時に、PLPREVFRM.pasのままで良かったのでしょうか?

> (4)TplPrevのオブジェクト・インスペクタのFormにそのフォームを選択します。
>    (コード内で指定してもOK)


すみません。ここで分からなくなりました。
画面左の下のオブジェクト・インスペクタですよね。
画面右のプロジェクトマネージャではないのですね。
ちなみにプロジェクトマネージャでは
 
  PLPREVFRM.pas
    |
    --PLPREVFRM.dfm

 unit1.pas

となっています。

お手数をおかけしてすみません。よろしくお願いします。


[953] Re5:プレビューフォームをコピーして使用する方法返信 削除
2006/10/20 (金) 21:49:46 Mr.XRAY
▼ takiさん

新規プロジェクトを作成して,plPrevfrmのコピーを作成し,保存した状態
では,プロジェクトマネージャーは以下のようになりますね.

ProjectGroup1
 - Project1.exe
   Unit1.pas
     Unit1.dfm
   Unit2.pas
     Unit2.dfm   --- これがコピーしたplPrevFormA

> この時に、PLPREVFRM.pasのままで良かったのでしょうか?
名前を変更したフォームのユニットは,何もしなければUnit2.pasだと思います.
これを保存します.元のPLPREVFRMはコピーしたので使用しません(継承フォーム
を使用する時はマネージャに表示されます).

plPrevのオブジェクト・インスペクタのFormNameプロパティでリストから
plPrevFormAを選択します.


[954] Re6:プレビューフォームをコピーして使用する方法返信 削除
2006/10/20 (金) 23:15:38 taki
▼ Mr.XRAYさん

>    Unit2.pas
>      Unit2.dfm   --- これがコピーしたplPrevFormA


やり直してみました。

ファイル→新規作成→VCLフォームアプリケーションWin32
Form1(unit1)が表示される。

ファイル→新規作成→その他→項目カテゴリは操作フォーム
右ペインの「印刷プレビューフォーム」を選択して、
ラジオボタンが「コピー」であることを確認してOKボタンをクリック
すると、PLPREVFRM.pasが表示されます。
オブジェクト・インスペクタのNameプロパティはplPrevFormです。

XRAYさんの説明ではunit2になるのでしょうか。
プロジェクトに名前をつけて保存にすると、やはりPLPREVFRM.pasに
なっています。

どこで間違ったのかなぁ・・・

今日はここまでにします。


[955] Re7:プレビューフォームをコピーして使用する方法返信 削除
2006/10/21 (土) 00:12:45 Mr.XRAY
▼ takiさん

うむむ,失礼しました.Delphi7で作成したプロジェクトをD2006(D2005は今回
動作確認の対象外となっています)で開いていました(テストは全てD7のプロジ
ェクトを開いて実行しましたので...).
以下の手順でやってみて下さい.D2006で確認しました.
継承フォームだとunit2.pasとなるようです.

(1)新規Win32プロジェクト作成
(2)[ファイル][新規作成][その他]でplPrevfrmのコピー作成
(2)そのコピーのNameプロパティをplPrevfrmAとする
(3)IDEのまん中の[plPrevfrm]をクリックして,
   [ファイル][名前を付けて保存]でplPrevfrmAとする
(4)同じフォルダに[プロジェクトに名前を付けて保存]
(5)Form1にTButtonとTplPrevを配置
(6)Buttonクリックイベントを以下のコードにする.

実際にはプレビューフォームはCreateして利用した方がいいでしょう.

//usesにplPrevfrmAが必要(なければIDEが訊いてきます)
procedure TForm1.Button1Click(Sender: TObject);
begin
     plPrev1.FormName:='plPrevfrmA';
     plPrevFormA.plPrev:=plPrev1;
     plPrev1.BeginDoc;
     try
       plPrev1.TextOutRT(1000,600,'喫茶XRAY')
     finally
       plPrev1.EndDoc;
     end;
     plPrev1.ShowModal;
end;

何故かオブジェクト・インスペクタでFormNameプロパティが動作しませんね.
プロパティエディタの仕様が変更になったのかな.後で確認しておきます.
直接タイプすればOKのようです.1文字タイプする度にエラーがでますが(^_^;)

>今日はここまでにします。
お疲れ様でした.


[958] Re8:プレビューフォームをコピーして使用する方法返信 削除
2006/10/21 (土) 11:16:48 taki
▼ Mr.XRAYさん

お手数をおかけしてすみません。

> 継承フォームだとunit2.pasとなるようです.

D2005でもunit2.pasになりました。今は関係ないけど。
 
> (1)新規Win32プロジェクト作成
> (2)[ファイル][新規作成][その他]でplPrevfrmのコピー作成
> (2)そのコピーのNameプロパティをplPrevfrmAとする
> (3)IDEのまん中の[plPrevfrm]をクリックして,
>    [ファイル][名前を付けて保存]でplPrevfrmAとする


当方がD2005の為か、うまくいきません。

ファイルに名前を付けて保存しようとすると「フォームまたは
モジュールplPrevFrmAはすでにプロジェクトに登録されています」
のメッセージが出て保存できません。
ファイル名をplPrevFormA(oを追加)すると保存できますが・・・

う〜ん。やはり私が意味を理解せずに使い方だけを知ろうと
しているのが間違いなのでしょうね。(T_T)

[959] Re9:プレビューフォームをコピーして使用する方法返信 削除
2006/10/21 (土) 11:41:02 Mr.XRAY
▼ takiさん

> >    [ファイル][名前を付けて保存]でplPrevfrmAとする
>
> 当方がD2005の為か、うまくいきません。
>
> ファイルに名前を付けて保存しようとすると「フォームまたは
> モジュールplPrevFrmAはすでにプロジェクトに登録されています」
> のメッセージが出て保存できません。


D2006で新規に作成してplPrevFrmAとしたらたまたまうまくいったのでそう
書いたのですが,D5,D6,D7も同じメッセージがでます.

私の場合,添付のサンプルのをみるとわかりまが,ユニットにはほとんど
最後にUnitとつけています.
今回の場合ですと,plPrevFrmAというフォームのユニットをplPrevFrmAUnit.pas
としたらどうでしょう.

このフォーム名と同じユニット名をつけて保存できないのはDelphiの仕様です.
多分D2006から変更されたのでしょう.
またD2006以前でも,フォームの名前変更前にユニット名をつけて保存すると
同じにはできます.
おそらく多くの方がフォームに名前を付けてから保存するのではないかと思い,
添付のサンプルではそのようにしています.
takiさんのようなことにならないように.(^_^;)

# D2005は既にPCから削除してしまいましたので,確認できません.
# あしからず.

[960] Re9:プレビューフォームをコピーして使用する方法返信 削除
2006/10/21 (土) 13:49:08 Mr.XRAY
▼ takiさん

> う〜ん。やはり私が意味を理解せずに使い方だけを知ろうと

プレビューフォームだからと言って特別なことはありません.
普通のFormをコピーして使用するのと同じです.
名前をつけて保存も,そのFormに別の名前をつけて,もちろんユニット名も
変更して保存するのと同じです.
(FormのNameプロパティだけの変更ではユニットのコピーにはなりません)


[961] Re10:プレビューフォームをコピーして使用する方法返信 削除
2006/10/21 (土) 14:32:57 taki
▼ Mr.XRAYさん

できました。

コピーで作成したフォームにボタンを付けて既存のボタンのイベントの
コードを貼り付けたら、ページの変更もできました。

ありがとうございます。

今、気が付いたのですが、PLPREVFRMとplPrevとは違うものだったの
ですよね。(当たり前!)

何かその辺が混乱してしまっていたようです。(^_^;)

最後に(・・・になったら良いのですが)、実際はプレビューフォームを
Createして利用した方がいい の理由を教えてください。

よろしくおねがいします。

[962] Re11:プレビューフォームをコピーして使用する方法返信 削除
2006/10/21 (土) 14:50:40 Mr.XRAY
▼ takiさん

>今、気が付いたのですが、PLPREVFRMとplPrevとは違うものだったの
>ですよね。(当たり前!)


印刷プレビュー制御そのものはTplPrevです.TplPrevは基本的には,印刷コ
ードを0.1mm単位で書くためのCanvasを提供しています.
でもそれだけでは,プレビュー画面を利用者が作成しなければなりません.

そこでプレビューフォームのTplPrevfrmも提供しているわけです.
そうすれば,DLした方が簡単な印刷コードを書くことにより,実際のその
印刷プレビューをすぐに見ることができます.
いやなら,プレビューフォームの提供をやめますけど... (^_^)

今回のTakiさんの場合,プレビューフォームを自分で別に用意したことに
なります.いまのところ私が作成したもののコピーですが.

> 最後に(・・・になったら良いのですが)、実際はプレビューフォームを
> Createして利用した方がいい の理由を教えてください。


オブジェクトは必要になったら生成して,必要なくなったら解放する,という
使い方がいいのではないかということです.
そうすればリソースの節約にもなります.
使用しないオブジェクトがあれば,その分メモリを使用しますからね.

ex.
  AForm:=TForm.Create(Sefl);
  try
    if AForm.ShowModal then begin
      //
    end;
  finally
    FreeAndNil(AForm); //ここでAFormが使用していた分のメモリが使える
  end;

[963] Re12:プレビューフォームをコピーして使用する方法返信 削除
2006/10/21 (土) 16:21:55 taki
▼ Mr.XRAYさん

> いやなら,プレビューフォームの提供をやめますけど... (^_^)

いえいえ 末永くご提供を・・・。

> オブジェクトは必要になったら生成して,必要なくなったら解放する,という
> 使い方がいいのではないかということです.
> そうすればリソースの節約にもなります.


うん!? なにやら、以前にも同じような質問をしたような気がします。

以前の内容をもう一度読み直します。
ありがとうございました。


INCM/CMT
Cyclamen v3.82