JVCLについて


SO  2004-10-08 00:21:43  No: 11304  IP: [192.*.*.*]

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

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

編集    削除
SO  2004-10-10 00:37:10  No: 11305  IP: [192.*.*.*]

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

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

編集    削除
ふぐちゃん  2004-10-10 01:01:22  No: 11306  IP: [192.*.*.*]

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

編集    削除
SO  2004-10-12 22:24:22  No: 11307  IP: [192.*.*.*]

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

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

編集    削除
bob  2004-10-15 03:36:03  No: 11308  IP: [192.*.*.*]

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  IP: [192.*.*.*]

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

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

編集    削除
bob  2004-10-16 01:58:48  No: 11310  IP: [192.*.*.*]

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  IP: [192.*.*.*]

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

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

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

編集    削除
bob  2004-10-19 18:17:44  No: 11312  IP: [192.*.*.*]

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

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

編集    削除
SO  2004-10-19 20:10:28  No: 11313  IP: [192.*.*.*]

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

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

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

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

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

編集    削除
bob  2004-10-19 20:33:57  No: 11314  IP: [192.*.*.*]

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

編集    削除
SO  2004-10-23 08:40:22  No: 11315  IP: [192.*.*.*]

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

編集    削除
bob  2004-10-23 10:42:19  No: 11316  IP: [192.*.*.*]

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

編集    削除
SO  2004-10-26 17:34:29  No: 11317  IP: [192.*.*.*]

亀レスですみません。

省略。。。
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  IP: [192.*.*.*]

遅くなりました。

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

編集    削除