喫茶XRAYトップページ

[スレッド全体
]

[10776] 最近起きた珍現象返信 削除
2017/2/9 (木) 23:36:21 Konnoya
こんばんは!
以下の簡単なサンプルプログラムを組んでみました。
これを実行すると、不思議な事にTPanelのべベル線が透明になってしまいます。
条件としては、FormのCreate時でパネルを生成、BevelKindをフラットにする。
かつ、パネルを重ね合わせた時だけこの現象が起きます。
パネルを重ね会わなければこの現象は起きません。

[開発環境1]
OS:Windows7
Delphi:Delphi XE8
[開発環境2]
OS:Windows7
Delphi:RAD Studio 10.1 Berlin Starter

[VCL]コード
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

const
  PANEL_NUM = 5;

type
  TForm1 = class(TForm)
    procedure FormCreate ( Sender : TObject );
    procedure FormDestroy( Sender : TObject );
    procedure WMNCHITTEST( var Msg : TWMNCHITTEST ); Message WM_NCHITTEST;
  private
    { Private 宣言 }
    PanelList : Array of TPanel;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate( Sender : TObject );

var
  lc1 : Integer;

begin
  // フォームの設定(設計時)
  // Self.BorderStyle は bsNone;
  // Self.Position    は poScreenCenter;

  SetLength( PanelList, PANEL_NUM );

  for lc1 := Low( PanelList ) to High( PanelList ) do
  begin
    PanelList[ lc1 ]             := TPanel.Create( Self );
    PanelList[ lc1 ].Name        := 'Panel' + lc1.ToString;
    PanelList[ lc1 ].Parent      := Self;
    PanelList[ lc1 ].BevelInner  := bvNone;
    PanelList[ lc1 ].BevelKind   := bkFlat;
    PanelList[ lc1 ].BevelOuter  := bvNone;
    PanelList[ lc1 ].ShowCaption := FALSE;
    PanelList[ lc1 ].Width       := 51;                 // ←ワザとパネルが1ドット重なる様に+1
    PanelList[ lc1 ].Height      := 50;
    PanelList[ lc1 ].Left        := 50 + ( lc1 * 50 );
    PanelList[ lc1 ].Top         := 50;
    PanelList[ lc1 ].Visible     := TRUE;
  end;
end;

procedure TForm1.FormDestroy( Sender : TObject );

var
  lc1 : Integer;

begin
  for lc1 := Low( PanelList ) to High( PanelList ) do
  begin
    PanelList[ lc1 ].DisposeOf;
  end;
end;

procedure TForm1.WMNCHITTEST( var Msg : TWMNCHITTEST );

var
  Pos :TPoint;

begin
  GetCursorPos( Pos );
  Pos := ScreenToClient( Pos );

  if Pos.Y < 32 then
    Msg.Result := HTCAPTION
  else
    Msg.Result := HTCLIENT;
  end;

end.

フォームのBorderStyleがbsNoneなので、
WM_NCHITTESTでフォームの上32ドットでウインドウを動かせる様にしてあります。

なんで透明になっちゃうんだよ〜といいつつ悩んでしまいました。
解決できたのですが、どうして発生するのかは不明。
ご存知の方がいましたらお教え下さい(汗
[開発環境1] と [開発環境2] のどちらでも発生したので、これってWindowsの問題かな?


[10777] Re:最近起きた珍現象返信 削除
2017/2/10 (金) 10:07:13 Mr.XRAY
▼ Konnoyaさん

> これを実行すると、不思議な事にTPanelのべベル線が透明になってしまいます。
> 条件としては、FormのCreate時でパネルを生成、BevelKindをフラットにする。
> かつ、パネルを重ね合わせた時だけこの現象が起きます。
> パネルを重ね会わなければこの現象は起きません。


これは仕様だと思います.
bkNone にすれば隣接して並べて表示した時に,境界線を非表示にできる,
という解釈ではどうでしょうか ?

オンラインヘルプにも,
『多様な効果を作成できます。目的の外観を得るために,さまざまな組み合わせ
を試してください。』
と書いてありますから... (^^;

下の図は,bkNone と bkFlat の時を確認したものです.
2 番目は,確認しやすいように拡大してみました.


[10779] Re2:最近起きた珍現象返信 削除
2017/2/10 (金) 12:17:12 Mr.XRAY
> これは仕様だと思います.
> bkNone にすれば隣接して並べて表示した時に,境界線を非表示にできる,
> という解釈ではどうでしょうか ?


BevelOuter  := bvNone; にした場合です.
最初のは,TPanel の上にコントロールを載せる時によく使う手です.
TPanel の境界を見せなくする方法です.
これが今回問題とした現象ということになると思います.



[10780] Re3:最近起きた珍現象返信 削除
2017/2/10 (金) 14:38:51 Mr.XRAY
> 最初のは,TPanel の上にコントロールを載せる時によく使う手です.
> TPanel の境界を見せなくする方法です.


サンプルプログラム集で使っているのは下図のような設定が多いです.
TPanel を使用しない場合は,TMemo の Align を alBottom にして,
Anchors プロパティのメンバの値を全てチェックする方法にしています.



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