線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:492
推到 Plurk!
推到 Facebook!

如何讓已經show出的窗口轉換成ShowModal模式

答題得分者是:P.D.
lcc1299
一般會員


發表:39
回覆:42
積分:21
註冊:2004-09-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2019-01-04 14:14:43 IP:175.180.xxx.xxx 未訂閱
因為我在show放了資料庫查詢語法,但我想如果資料筆數大於1筆時,可以將窗口轉"ShowModal"模式,
而不需關閉再重新"showModal"該窗口,會多觸發了一次Show動作。我不要"FormStyle=stayonTop",這語法還是讓某些背景窗口可以被動作。謝謝
編輯記錄
lcc1299 重新編輯於 2019-01-04 14:27:08, 註解 無‧
lcc1299 重新編輯於 2019-01-04 14:27:57, 註解 無‧
lcc1299 重新編輯於 2019-01-04 14:30:27, 註解 為什我輸入的說明會少了許多字?‧
lcc1299 重新編輯於 2019-01-04 15:11:17, 註解 無‧
lcc1299
一般會員


發表:39
回覆:42
積分:21
註冊:2004-09-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2019-01-04 14:31:18 IP:175.180.xxx.xxx 未訂閱
編輯記錄
lcc1299 重新編輯於 2019-01-05 19:54:39, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2019-01-06 10:15:44 IP:118.169.xxx.xxx 未訂閱

unit P_GlassMask;

interface

uses
Windows, Forms;

const WS_EX_LAYERED = $80000;
LWA_ALPHA = $2;

type
TForm_GlassMask = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form_GlassMask: TForm_GlassMask;
function SetLayeredWindowAttributes(hwnd:HWND; crKey:Longint;
bAlpha:byte; dwFlags:longint ):longint; stdcall; external user32;

implementation

{$R *.DFM}

procedure TForm_GlassMask.FormCreate(Sender: TObject);
var l: LongInt;
begin
l:= getWindowLong(Handle, GWL_EXSTYLE);
l:= l or WS_EX_LAYERED;
SetWindowLong(handle, GWL_EXSTYLE, l);
SetLayeredWindowAttributes(handle, 0, 190, LWA_ALPHA);
end;

end.

把這段產出一支pas, 在 show你那個form前先create出來, 所以你必須另外將判斷 > 1 的程式寫一支 pas, 把以下這段放在這裡, 在你的form結束時要記得同步釋放 FreeAndNil(Form_GlassMask)

if xxxx > 1 then
begin_
Form_GlassMask:= TForm_GlassMask.Create(nil);
Form_GlassMask.Show;
end;

... show your form

試試看吧
編輯記錄
P.D. 重新編輯於 2019-01-06 10:16:41, 註解 無‧
lcc1299
一般會員


發表:39
回覆:42
積分:21
註冊:2004-09-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2019-01-06 13:38:56 IP:175.180.xxx.xxx 未訂閱
PD你好,我直接開兩個Form,把上面的程式碼放在Form2中,Form1直接於button中Form2.Show,Form2不會有showModal的模式產生,像是一個show的動作,是我少了什麼嗎?,謝謝。但我了解了你要傳達給我的意思了,先查詢資料筆數,再決定是否要進行showModal,然後我可以在顯示出來的窗口中去取原窗口的ADQ這樣我就不用進行第二次查詢動作。

補充:這個Form2的用意是。因為我發現我忘了於Form2.show後再呼叫我的Form3(我用show的方法呼出),但我的Form3也不會因為Form2的存在變成showModal模式。

編輯記錄
lcc1299 重新編輯於 2019-01-06 13:51:42, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2019-01-07 23:01:29 IP:118.169.xxx.xxx 未訂閱
這個的做法並不是把 FORM1改為 SHOWMODAL, 因為不可能的,
這支程式是會產生一個MASK WINDOW(遮罩, form2), 把整個SCREEN 以半透明方式蓋掉, 再讓 FORM1 SHOW出來, 就不會點到其他FORM了(除非手動釋放掉), 忘了告訴你, 要遮的大小是你自己決定form2的尺寸, 我是設定 windowstate := wsMaximized,
所以你要用一個form3來判斷, 後來我想一想, 好像脫褲放屁, 如果用一個form3來判斷, =1 則 form1.show, >1則 form1.showmodal 不就好了, 幹嘛還幫你搞一個mask form 來做.....
lcc1299
一般會員


發表:39
回覆:42
積分:21
註冊:2004-09-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2019-01-08 10:03:32 IP:175.180.xxx.xxx 未訂閱
謝謝pd版大。我又新學到一招~~當不知怎應付時,把背景遮起來也行。
系統時間:2024-05-06 23:50:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!