ダイアログボックス作成の時規定クラス以外について


マッコ  2005-02-16 01:45:32  No: 13272

DLGITEMTEMPLATEのクラス配列の第一要素$FFFF以外で作成するにはどうすればいいですか、下記にプログラムを列記いたします

まずクラス配列の第一要素$FFFFで
procedure TForm1.OkClick(Sender: TObject);
var
  MemStream1: TMemoryStream;
  DlgTmpl: TDlgTemplate;
  DlgItmTm: TDlgItemTemplate;
  Wd1: Word;
  WideStr1: WideString;
  i:integer;
  procedure AlignMemStrm32;
  var
    Mod1: Integer;
  begin
    Mod1 := (Integer(MemStream1.Memory)+MemStream1.Position) mod 4;
    if Mod1 <> 0 then
      MemStream1.Position := MemStream1.Position + (4-Mod1);
  end;

begin
  MemStream1 := TMemoryStream.Create;
  try
    DlgTmpl.style := WS_POPUP or WS_BORDER or WS_SYSMENU or DS_3DLOOK
                  or DS_MODALFRAME or WS_CAPTION or DS_CENTER or DS_SETFONT;

    DlgTmpl.dwExtendedStyle := 0;
    DlgTmpl.cdit := 2;
    DlgTmpl.x := 10;
    DlgTmpl.y := 20;
    DlgTmpl.cx := 120;
    DlgTmpl.cy := 90;
    MemStream1.WriteBuffer(DlgTmpl, SizeOf(DlgTmpl));
    Wd1 := 0;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    Wd1 := 0;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    WideStr1 := 'テストダイアログ';
    MemStream1.WriteBuffer(WideStr1[1], (Length(WideStr1)+1) shl 1);

    Wd1 := 11;

    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    WideStr1 := 'MS Pゴシック';
    MemStream1.WriteBuffer(WideStr1[1], (Length(WideStr1)+1) shl 1);

    AlignMemStrm32;

    DlgItmTm.style := WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON;
    DlgItmTm.dwExtendedStyle := 0;
    DlgItmTm.x := 14;
    DlgItmTm.y := 70;
    DlgItmTm.cx := 38;
    DlgItmTm.cy := 12;
    DlgItmTm.id := IDOK;
    MemStream1.WriteBuffer(DlgItmTm, SizeOf(DlgItmTm));

    Wd1 := $FFFF;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    Wd1 := $80;  //button Class Control
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    WideStr1 := 'OK';
    MemStream1.WriteBuffer(WideStr1[1], (Length(WideStr1)+1) shl 1);
    AlignMemStrm32;
    Wd1 := 0;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    AlignMemStrm32;

    DlgItmTm.style := WS_CHILD or WS_VISIBLE or ES_LEFT or ES_AUTOHSCROLL;
    DlgItmTm.dwExtendedStyle := 0;
    DlgItmTm.x := 8;
    DlgItmTm.y := 10;
    DlgItmTm.cx := 100;
    DlgItmTm.cy := 9;
    DlgItmTm.id := 200;
    MemStream1.WriteBuffer(DlgItmTm, SizeOf(DlgItmTm));
    Wd1 := $FFFF;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    Wd1 := $81;  //Edit Class Control
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    WideStr1 := 'A Dialog Edit';
    MemStream1.WriteBuffer(WideStr1[1], (Length(WideStr1)+1) shl 1);
    AlignMemStrm32;
    Wd1 := 0;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));

    if DialogBoxIndirect(hInstance, PDLGTEMPLATE(MemStream1.Memory)^, Handle, @DialogFunc) = -1 then
      RaiseLastOSError;

  finally
    FreeAndNil(MemStream1);
  end;
end;

それとクラス配列の第一要素$FFFF以外で
procedure TForm1.NgClick(Sender: TObject);
var
  MemStream1: TMemoryStream;
  DlgTmpl: TDlgTemplate;
  DlgItmTm: TDlgItemTemplate;
  Wd1: Word;
  WideStr1: WideString;
  i:integer;
  procedure AlignMemStrm32;
  var
    Mod1: Integer;
  begin
    Mod1 := (Integer(MemStream1.Memory)+MemStream1.Position) mod 4;
    if Mod1 <> 0 then
      MemStream1.Position := MemStream1.Position + (4-Mod1);
  end;

begin
  MemStream1 := TMemoryStream.Create;
  try
    DlgTmpl.style := WS_POPUP or WS_BORDER or WS_SYSMENU or DS_3DLOOK
                  or DS_MODALFRAME or WS_CAPTION or DS_CENTER or DS_SETFONT;

    DlgTmpl.dwExtendedStyle := 0;
    DlgTmpl.cdit := 2;
    DlgTmpl.x := 10;
    DlgTmpl.y := 20;
    DlgTmpl.cx := 120;
    DlgTmpl.cy := 90;
    MemStream1.WriteBuffer(DlgTmpl, SizeOf(DlgTmpl));
    Wd1 := 0;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    Wd1 := 0;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    WideStr1 := 'テストダイアログ';
    MemStream1.WriteBuffer(WideStr1[1], (Length(WideStr1)+1) shl 1);

    Wd1 := 11;

    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    WideStr1 := 'MS Pゴシック';
    MemStream1.WriteBuffer(WideStr1[1], (Length(WideStr1)+1) shl 1);

    AlignMemStrm32;

    DlgItmTm.style := WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON;
    DlgItmTm.dwExtendedStyle := 0;
    DlgItmTm.x := 14;
    DlgItmTm.y := 70;
    DlgItmTm.cx := 38;
    DlgItmTm.cy := 12;
    DlgItmTm.id := IDOK;
    MemStream1.WriteBuffer(DlgItmTm, SizeOf(DlgItmTm));

    Wd1 := $FFFF;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    Wd1 := $80;  //button Class Control
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));
    WideStr1 := 'OK';
    MemStream1.WriteBuffer(WideStr1[1], (Length(WideStr1)+1) shl 1);
    AlignMemStrm32;
    Wd1 := 0;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));

    AlignMemStrm32;
    DlgItmTm.style := WS_CHILD or WS_VISIBLE or ES_LEFT or ES_AUTOHSCROLL;
    DlgItmTm.dwExtendedStyle := 0;
    DlgItmTm.x := 8;
    DlgItmTm.y := 10;
    DlgItmTm.cx := 100;
    DlgItmTm.cy := 9;
    DlgItmTm.id := 200;
    MemStream1.WriteBuffer(DlgItmTm, SizeOf(DlgItmTm));

    WideStr1 := 'CustButton';
    MemStream1.Write(WideStr1[1], (Length(WideStr1)+1) shl 1);

    WideStr1 := 'User1';
    MemStream1.Write(WideStr1[1], (Length(WideStr1)+1) shl 1);

    AlignMemStrm32;
    Wd1 := 0;
    MemStream1.WriteBuffer(Wd1, SizeOf(Wd1));

    if DialogBoxIndirect(hInstance, PDLGTEMPLATE(MemStream1.Memory)^, Handle, @DialogFunc) = -1 then
      RaiseLastOSError;
   //システムエラー。コード:1407

  finally
    FreeAndNil(MemStream1);
  end;
end;


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

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






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