お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"初期幅で開くTOpenDialog"



こんにちは、佐藤 充男です。



Windows98でTOpenPictureDialogやTSavePictureDialogを表示したのちに、
TOpenDialogかTSaveDialogを開くと幅が横長になるのを防ぐコンポです。

8番会議室 nifty:FDELPHI/MES/08/11271 Satobeさんの発言を元に作成
しました。Satobeさんに感謝します。

動作確認はDelphi4CSS、Delphi5Entで行いました。
使い方はTOpenDialogと同じです。TSaveDialogは継承元を替えるだけで
出来ると思いますが…(^^;

//=== ここから ========================================================
unit OpenDialogTest;

interface

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

type
  TOpenDialogTest = class(TOpenDialog)
  private
    Fod1HWND: HWND;
    Fod1NewWProc, Fod1OldWProc: TFarProc;
    Fod1Flag: Boolean;
    Fod1Rect: TRect;
  protected
    procedure DoClose; override;
    procedure DoShow; override;
    procedure WndProc2(var Message: TMessage);
  public
  published
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TOpenDialogTest]);
end;

procedure TOpenDialogTest.DoClose;
begin
  //サブクラス化解除
  SetWindowLong(Fod1HWND, GWL_WNDPROC, Longint(Fod1OldWProc));
  FreeObjectInstance(Fod1NewWProc);
  inherited DoClose;
end;

procedure TOpenDialogTest.DoShow;
begin
  inherited DoShow;
  if ofOldStyleDialog in Self.Options
    then Fod1HWND := Self.Handle
    else Fod1HWND := GetParent(Self.Handle);
  //元のサイズを取得しておく
  GetWindowRect(Fod1HWND, Fod1Rect);
  //サブクラス化
  Fod1Flag := True;
  Fod1NewWProc := MakeObjectInstance(WndProc2);
  Fod1OldWProc := Pointer(GetWindowLong(Fod1HWND, GWL_WNDPROC));
  SetWindowLong(Fod1HWND, GWL_WNDPROC, Longint(Fod1NewWProc));
end;

procedure TOpenDialogTest.WndProc2(var Message: TMessage);
var
  pWinPos: PWindowPos;
  Monitor: TMonitor;
begin
  if Fod1Flag and
    (Message.Msg = WM_WINDOWPOSCHANGING) then begin
    pWinPos := PWindowPos(Message.LParam);
    if (pWinPos^.flags and SWP_NOSIZE) = 0 then begin
      Fod1Flag := False;
      // 画面中央に移動
      if Application.MainForm <> nil then
        Monitor := Application.MainForm.Monitor
      else
        Monitor := Screen.Monitors[0];
      pWinPos^.x  := Monitor.Left +
           ((Monitor.Width  - Fod1Rect.Right  + Fod1Rect.Left) div 2);
      pWinPos^.y  := Monitor.Top  +
           ((Monitor.Height - Fod1Rect.Bottom + Fod1Rect.Top ) div 3);
      //強制的に元のサイズに
      pWinPos^.cx := Fod1Rect.Right - Fod1Rect.Left;
      pWinPos^.cy := Fod1Rect.Bottom - Fod1Rect.Top;
    end;
  end;
  Message.Result := CallWindowProc(Fod1OldWProc,
                                   Fod1HWND,
                                   Message.Msg,
                                   Message.WParam,
                                   Message.LParam);
end;

end.
//=== ここまで ========================================================

                              2000/3/9(木) 03:20pm  LDM03756 佐藤 充男

Original document by 佐藤 充男   氏 ID:(LDM03756)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum