JVCLについて


SO  2004-10-08 00:21:43  No: 11304

JVCLの中のJvPageListの背景色を透明にするにはどのようにしたらよろしいのでしょうか。

理由は、グラデーションをかけたコンポの上におくと統一感がなくなるからです。


SO  2004-10-10 00:37:10  No: 11305

えと、質問が分かりにくいので書き直します。

フォーム上にパネルが2つ重なっており、そのパネル1にボタンがあり、パネル2にメモがあります。
フォームの見た目は青のグラデーションです。
何かしらのイベント時にパネルの表示を1,2と変えているのですが、
フォームの色が青のグラデーションなので、できればパネルを透過したいと思います。
どのような方法が考えられますか。


ふぐちゃん  2004-10-10 01:01:22  No: 11306

こういうことでしょうか?
http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=16#0139.txt


SO  2004-10-12 22:24:22  No: 11307

返信ありがとうございます。
パネルではできそうですね。
しかしながら、JvPageListがパネルなのかも分からないので苦戦しています。

情報ありがとうございました。


bob  2004-10-15 03:36:03  No: 11308

JVCLとかJvPageListってなんでしょう?

ネットに公開されているコンポーネント?
リンクを張ると回答しやすいです。
たぶんhttp://cvs.jvcl.sourceforge.net/viewcvs.py/jvcl/dev/JVCL3/run/JvPageList.pas?view=markup
これだと思うけど...

本当にこのリンクのソースが元のコンポーネントなら、ふぐちゃんさんが
リンクされてるところに書いてあるのを参考にすればすぐ出来ると
思いますけど?


SO  2004-10-15 07:57:41  No: 11309

返信ありがとうございます。
まさにそのコンポです。
http://sourceforge.net/project/showfiles.php?group_id=45786
てっきりJVCL3って書いていたので正式名称かと勘違いしました。
すみません。

本題ですが、ふぐちゃんさんが示したリンクを参照してコンポを派生しました。
結果は見事透明になりました。
ただ、ページを作ると(TJvStandardPage)、そこは透明になりません。
どのように書けばよいのでしょうか。


bob  2004-10-16 01:58:48  No: 11310

JVCLとかJCLって結構有名なのね。知らなかった--;

TJvPageControlの透明化を行いましたので、ふぐちゃんさんのリンクと
見比べてください。

---
unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, JvComCtrls;

type
  // 透明で 背景消去を行わない コンテナウィンドウコントロール
  TJvPageControlEx = class(TJvPageControl)
  private
    procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd);
              message WM_ERASEBKGND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyTestCtrls', [TJvPageControlEx]);
end;

{ TJvPageControlEx }

constructor TJvPageControlEx.Create(AOwner: TComponent);
begin
  inherited;
  Width := 100; Height := 100;
  // 上にコントロールが貼りつけられるようにする
  ControlStyle := ControlStyle + [csAcceptsControls];
end;

procedure TJvPageControlEx.CreateParams(var Params: TCreateParams);
begin
  inherited;
  // 実行時は「透明」なウィンドウ
  if not (csDesigning in ComponentState) then
    Params.ExStyle := Params.Exstyle + WS_EX_TRANSPARENT;
end;

procedure TJvPageControlEx.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
  // 実行時は背景消去をしない
  if csDesigning in ComponentState then inherited;
end;

end.


SO  2004-10-16 23:47:35  No: 11311

bobさん、返信ありがとうございます。

JvPageListも同じようにしてコード書きました。
結果は、JvPageList事態は透明になったのですが、TJvStandardPageを作ると
(ページを作成すると)、そのページだけが表示されてしまいます。

ちなみに、当方の環境WinXP SP2+D6PだとTJvPageControlの透明化はなぜかできませんでした。


bob  2004-10-19 18:17:44  No: 11312

> JvPageListも同じようにしてコード書きました。
> 結果は、JvPageList事態は透明になったのですが、TJvStandardPageを作ると
> (ページを作成すると)、そのページだけが表示されてしまいます。
  それはそうでしょう。
 TJvStandardPageも透明化させる必要があるからです。

> WinXP SP2+D6PだとTJvPageControlの透明化はなぜかできませんでした
  WinXP SP1+D7Eですが、透明化できましたよ。


SO  2004-10-19 20:10:28  No: 11313

bobさん、返信有り難うございます。

>TJvStandardPageも透明化させる必要があるからです。

TJvStandardPageを透明化させるには、TJvPageListを派生したユニット内に
書けばいいのでしょうか。
TJvStandardPageを派生させようとしても、一覧に表示されないため現在出来ない状態です。

>WinXP SP1+D7Eですが、透明化できましたよ。

私の書き方がおかしかったのでしょうか。
もう一度試してみます。


bob  2004-10-19 20:33:57  No: 11314

> TJvStandardPageを派生させようとしても、一覧に表示されないため現在出来ない状態です。
一覧ってパレットのことですよね?
別にパレットに無くても、ちゃんとusesで定義されているユニットを宣言しておけば、
出来ます。(TJvStandardPageはJvPageList.pas内で定義されています。タブン)


SO  2004-10-23 08:40:22  No: 11315

JvPageListを継承したJvPageListClearのコードの中にTJvStandardPageを透明化するコード(ふぐちゃんさんが示したコードそのまま)を書いたのですが、どうしてもうまくいきません。


bob  2004-10-23 10:42:19  No: 11316

> JvPageListを継承したJvPageListClearのコードの中にTJvStandardPageを透明化するコード
どの様に試したのか、書いてみてくださいな。


SO  2004-10-26 17:34:29  No: 11317

亀レスですみません。

省略。。。
TJvPageListClear = class(TJvPageList)
private
    procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd);
              message WM_ERASEBKGND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

TJvStandardPageClear = class(TJvStandardPage)
private
    procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd);
              message WM_ERASEBKGND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(User, [JvPageListClear]);
end;

{ JvPageListClear}

constructor TJvPageListClear.Create(AOwner: TComponent);
begin
  inherited;
  // 上にコントロールが貼りつけられるようにする
  ControlStyle := ControlStyle + [csAcceptsControls];
end;

procedure TJvPageListClear.CreateParams(var Params: TCreateParams);
begin
  inherited;
  // 実行時は「透明」なウィンドウ
  if not (csDesigning in ComponentState) then
    Params.ExStyle := Params.Exstyle + WS_EX_TRANSPARENT;
end;

procedure TJvPageListClear.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
  // 実行時は背景消去をしない
  if csDesigning in ComponentState then
    inherited;
end;

//--------------------------------------------------

constructor TJvStandardPageClear.Create(AOwner: TComponent);
begin
  inherited;
  // 上にコントロールが貼りつけられるようにする
  ControlStyle := ControlStyle + [csAcceptsControls];
end;

procedure TJvStandardPageClear.CreateParams(var Params: TCreateParams);
begin
  inherited;
  // 実行時は「透明」なウィンドウ
  if not (csDesigning in ComponentState) then
    Params.ExStyle := Params.Exstyle + WS_EX_TRANSPARENT;
end;

procedure TJvStandardPageClear.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
  // 実行時は背景消去をしない
  if csDesigning in ComponentState then
    inherited;
end;

end.

っと、書きました。
そして、TJvPageListClearを貼り付けてNewPageを行っても、
TJvStandardPageが作成されてしまいます。
エディタで直接TJvStandardPageClearにしても、ありませんという警告がなされます。


bob  2004-11-03 02:19:17  No: 11318

遅くなりました。

時間がまだあまり取れないので、概要だけ。
JvPageListClear(TJvCustomPageList)のPagesプロパティとかをoverrideして、
TJvStandardPageを生成するようにすればいいと思います。


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

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






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