Memoの背景を画像にするには?


かんとく  2010-09-17 20:31:28  No: 39181

お世話になっております。

XP,2007です。

Memoの背景を画像にする方法はありますか?

JPGファイルから取り込んだ画像を、Memoの背景にしたいです。

よろしくお願いします。


はな  2010-09-17 21:51:08  No: 39182

"delphi tmemo 背景画像" でググって見たら以下のページがありました。
http://homepage1.nifty.com/cosmic/delphi/vcl.html

これは、使えませんか?


かんとく  2010-09-18 04:09:01  No: 39183

ありがとうございます。

試してみましたが、うまくいきませんでした。

説明書みたいなものを見ると、
Delphiのバージョンが5までしか使えないのかもしれません。

まだよく分かりませんので、引き続きよろしくお願いします。


助監督(仮名)  2010-09-22 16:11:45  No: 39184

私も、はなさんがご紹介してる、パンタグラフ(fumika)さんが制作されたコンポーネントを
インストールしてあったので、ちょっと試してみました。
環境は、XP+Delphi6 Personalですけど。

かんとくさんが試したのは「背景透明化可能  拡張エディット&メモ」のTCuteMemoですよね?
どういうふうにうまくいかなかったのでしょうか。
私はFormにImageを乗せPictureにJpeg画像をセットし、その上にCuteMemoを乗せTransparentをTrueに
しました。これだけでOkでした。

クラスを作れないレベルである駆け出しの私が言うのもなんですけど、ソースを見る限り最近のDelphi
でもうまく動作するのではないかと思います。

CuteMemoに感動したので、機能を透過のみの最小限にするため宣言部分をフィールド変数1、手続き3、
コンストラクタ、デストラクタだけに改変し非コンポーネント化してみましたが、これも動作しました。
(パンタグラフさん改変してごめんなさい)
元のコンポーネントの出来が良いから容易に改変できたのだと思います。

私でもここまで出来ましたので、かんとくさんならきっとうまく使えますよ。
…TCuteMemoをパクっちゃって良いなら、ですけど。


でも..  2010-09-22 21:38:56  No: 39185

>私はFormにImageを乗せPictureにJpeg画像をセットし、その上にCuteMemoを乗せTransparentをTrueに
>しました。これだけでOkでした。

それだけでは XPスタイルを有効にするとMemoの背景が透明でなくなり、背景画像が見えなくなりませんか?
また、背景の書き換えが行われない場合があるので、Memoに複数行入力した後に
途中の行で改行したり書き換えたりするとおかしくなりませんか?
Memoをスクロールした時の背景のチラツキも気になりますね。


助監督(仮名)  2010-09-23 02:39:18  No: 39186

あいやー、XPスタイルなんてあったんですね。Delphi6 Personalなので、とんと知りませんでした。
それで早速、初めてmanifestを用意し試してみましたが、おっしゃる通り透過しないですね。。。。
うーん、発想を転換してビジュアルスタイルを無効にするとか…なんてダメですよねやっぱり (^_^;

確かに書き換えが行われないこともありますね。でもこれはOnChangeでRefreshすればOkでした。
あとチラツキは…これがあったのでパンタグラフさんはTCuteMemoをベータ版に留めたのだと推測します。
用途によると思いますが、私は許容範囲内だと感じました。

事情を理解していないでしゃしゃり出て大変失礼しました。


かんとく  2010-10-01 19:27:05  No: 39187

お返事遅れてすみません。

試したのは「背景透明化可能  拡張エディット&メモ」のTCuteMemoです。
(XP,Dplphi2007)

どういうふうにうまくいかなかったのかというと、
(FormにImageを乗せPictureにJpeg画像をセットし、その上に)CuteMemoを乗せるというところができません。

今の状態は、画面右上のProjectGroup1の表示のところに、
Project1.exe
CuteEdit.pas
Unit1.pas
がある状態で、
Unit1のForm1にCuteMemoを乗せたいのですが、それができません。

もしかしたら、説明書に載せるまでもないような基本的な作業をする必要があるのかもしれませんが、どうしたらよいか分からないので、まずFormにCuteMemoを乗せる方法が知りたいです。

よろしくお願いします。


通りすがり  2010-10-03 21:30:48  No: 39188

コンポーネントパレットに登録させて、そこからFormに貼り付けたいという事ならば・・・。
Formにのせるには、そのCuteMemoコンポーネントをインストールしなければなりません。
「delphi コンポーネント  インストール  2007」などでググると、たぶん絵付で見つかります。

コンポーネントのインストールの仕方は、けっこう面倒で、そういった手順書を読むのが一番ですが、管理が面倒で煩雑になってる人も多いと思います。
インストールする事で、何がどうなるのかよく理解していないと、今回だけでなくいろいろな開発を重ねているうちに、たぶん手におえなくなる気がします。

動的に作成すればインストールしなくてもパスが通っていれば使えます。

uses に CuteEdit を加え

TFormのconstructorをoverride するか FormCreateイベントで

FMemo:= TCuteMemo.Create(Self);
FMemo.Parent:= Self;

のように書けばOK。

イベントハンドラもコードで設定しなければなりません。

FMemo.OnChange:= MemoChange; 

のように。

他にも方法があって、TCuteMemoがTMemoを継承してて、メンバーも互換なら

type
  TMemo = class( TCuteMemo)
  end;

とでもしてやると、コンパイル時に TMemo が TCuteMemo に差し換わります。
(Unit1.pas でもいいし、他のユニットを作ってもOK)

推奨される方法ではないかもしれませんが、ちょっとした仕様変更なのでコンポーネント化も面倒だし、デザイナを使って本来のTMemoとの共通部分のリソース(イベントハンドラや、テキストの内容や各種プロパティ)を編集したいという場合には、使える手です。

で、背景を透明にするだけなら、以下の方法でできます。

TMemo は、Paintをoverrideしただけでは、駄目なようで。
いろいろなメッセージがとびかい、適宜キャプチャーして
描画の更新処理で変わった部分のつじつまをあわせてやらないといけません。

http://www.delphipages.com/forum/archive/index.php/t-137858.html
この実装は、かなり透明にする事だけに特化したようなコードで、背景のちらつきもあります。
けっこう昔からあるサンプルコードで、あちこちで見かけるものです。

背景のちらつきは、メインフォームの DoubleBufferedをTrueにすれば抑えられますが、テキストそのもののちらつきは抑えられません。

また、上記のコードはホイールによるスクロール処理はカバーしていないようで、その時に画面が乱れるのでその点は直さなければならないでしょう。
TTransparentMemoに procedure WMWheel( var Msg: TWMMouseWheel ); message WM_MOUSEWHEEL;
を追加して同じように処理してやればたぶんOKです。

とりあえず、背景に TImage を置いて、このTTransparentMemoを使えば、目的のことは達成できます。


かんとく  2010-10-07 01:19:02  No: 39189

ありがとうございます。

通りすがりさんの言う通りにして、FormにCuteMemoを乗せることができました。

しかし、Memoの背景が透明になりませんでした。
でも..さんの言う通り、XPだからでしょうか。

通りすがりさんから教えて頂いた、
http://www.delphipages.com/forum/archive/index.php/t-137858.html
を見てみましたが、まだよく分かりません。 

もう少し調べてみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加