怎么改变opendialog的高度?(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
在opendialog的OnShow里面,我尝试改变该对话框的高度,我先后使用了<br>setwindowpos,movewindow,sendmessage(wm_size,...)等方法均不成功,<br>最多只能做到只改变了高度,但是里面的各种控件都没有相应重新排列,<br>还是以前的大小,结果对话框下面空出一大片空白区域.<br><br>为什么当对话框打开之后,手动可以调整它的高度,并且里面的控件可以<br>重新排列,而用程序就不行呢?<br>
 
unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls;<br><br>const &nbsp;WM_MYSHOWOPENDIALOG=WM_USER+1000;<br><br>type<br><br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; OpenDialog1: TOpenDialog;<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure OpenDialog1Show(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; &nbsp; procedure MyShowOpenDialog(var Message:TMessage);message WM_MYSHOWOPENDIALOG;<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; OpenDialog1.Execute;<br>end;<br><br>procedure TForm1.MyShowOpenDialog(var Message: TMessage);<br>begin<br>&nbsp; SetWindowPos(GetParent(OpenDialog1.Handle),HWND_TOP,100,100,400,300, SWP_SHOWWINDOW)<br>end;<br><br>procedure TForm1.OpenDialog1Show(Sender: TObject);<br>begin<br>&nbsp; &nbsp;PostMessage(Handle,WM_MYSHOWOPENDIALOG,0,0);<br>end;<br><br>end.<br>
 
NT下行不通,NT下OpenDialog不允许改变Size.<br><br>
 
多谢!试验成功.<br><br>但是为什么不能在对话框的OnShow事件里面直接setwindowpos呢?
 
呵呵,不太清楚。<br><br>可能是Windows在计算好了位置再调用OnShow,你再在OnShow中改变大小,Windows可能<br>不知道。<br><br>我还发现。在OnShow中设置窗体大小是OpenDialog的最小值,也就是说,但你设置大小<br>后,你手工设置OpenDialog的大小不能小于是你在OnShow中设置的窗体大小。<br>
 
如把options中ofEnablesizing设为false时,就不能正常显示了,为何?
 
Fudei;<br>&nbsp; 你是说我的那程序"将options中ofEnablesizing设为false时,就不能正常显示",<br>如果是,我想是这样,ofEnablesizing设为false,表示窗体不允许改变,但我门<br>使用SetWindowPos强行改变,当然不能正常显示了.
 
沈前卫: 有无办法使它正常显示呢? 我试过总是不行(水平有限).
 
请说清楚一些,什么情况下,什么结果。
 
把options中ofEnablesizing设为false时,各控件就不能正常排列了.<br>想在ofEnablesizing设为false时,按你的程序使对话框中的控件重新<br>排列.<br><br><br>
 
你先使用我的程序,注意ofEnablesizing要为True,再改<br><br>procedure TForm1.MyShowOpenDialog(var Message: TMessage);<br>begin<br>&nbsp; SetWindowPos(GetParent(OpenDialog1.Handle),HWND_TOP,100,100,400,300, SWP_SHOWWINDOW)<br>&nbsp; opendialog1.Options:=OpenDialog1.Options-[ofEnablesizing];<br>end;<br><br><br>//我现在在nt下,没法测试。自己测试测试吧。
 
外面一个变量,firstcall:boolean<br>opendialog.execute前 firstcall=true<br><br>写 OnSelectionChange 事件:<br>if(firstcall)then<br>&nbsp; begin<br>&nbsp; firstcall:=false;<br>&nbsp; SetWindowPos......<br>&nbsp; end;
 
to 沈前卫:<br>&nbsp; 我试了一下您的代码(在Win98下)<br>1.屏幕明显看到一闪<br>2.有几次Delphi死掉。<br>Why?<br>&nbsp; &nbsp;<br>
 
不会吧,<br><br>》屏幕明显看到一闪<br>&nbsp; 这是肯定的,因为我们是在他显示后使用SetWindowPos改变<br><br>》有几次Delphi死掉<br>&nbsp; 我没遇到过,是不是PostMessage与MyShowOpenDialog循环掉用了,你用个全局<br>变量来标识一下看看。
 
pipi: 你是在回答我的问题还是后面的问题?
 
&gt;PostMessage与MyShowOpenDialog循环掉用了<br>&nbsp; 我试了一下,没有循环调用。 &nbsp; //NT下
 
cAkk,我在说你的问题,如果不postmessage,就写OnSelectionChange 事件
 
cAkk,我在说你的问题,如果不postmessage,就写OnSelectionChange 事件<br>只是OnSelectionChange事件会执行多次,所以用一变量指示第一次才有所行动<br><br>
 
多人接受答案了。
 
后退
顶部