全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1971
推到 Plurk!
推到 Facebook!

兩則畫面處理問題

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


發表:6
回覆:13
積分:3
註冊:2011-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-03-14 17:47:54 IP:220.134.xxx.xxx 訂閱
Login Form處理
需求:Login畫面關閉後,直接進入主功能畫面。
// dpr程式段 Begin
program ASSET;
uses
Forms,
AstDM in '..\global\AstDM.pas' {DMAst: TDataModule},
uLogin in 'uLogin.pas' {frmLogin},
uMain in 'uMain.pas' {frmMain},
Aglobal in '..\global\Aglobal.pas';
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TDMAst, DMAst);
Application.CreateForm(TfrmLogin, frmLogin);
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
// dpr程式段 End
//Login form 片段Start
if qryTemp.Fieldbyname('PWD').AsString <> edtPWD.Text then
begin
logintimes:=logintimes 1;
if logintimes >= 3 then
begin
showmessage('連續輸入三次錯誤密碼,即將退出!');
Close;
end
else
begin
showmessage('密碼錯誤!->' inttostr(logintimes) ' (請確認大小寫的差異)');
edtPWD.SetFocus;
end;
end
else
begin
frmLogin.FormStyle:= fsNormal; 會全部關掉,所以暫把推到底層
Application.CreateForm(TfrmMain, frmMain); // 進入Asset主畫面
當執行到這裡時全部都會關掉!
end;
//Login form 片段End
2.選單與畫面 (圖片請參考附檔)
功能主選單(frmMain)
整個藍色框內都屬於frmMain
功能訴求是希望點選功能項後,能把指定的功能畫面show在功能畫面區,且能緊貼著;當關閉功能時,又回復到如上圖畫面!也就是功能畫面能隨著主畫面移動座標。希望能像Word介面一樣:選單與編輯整合在一起。
請問在frmMain和各功能畫面的Position, FormStyle, WindowState分別要怎麼給值,才能達到需求?
------
- 嵐 -
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-03-14 18:33:46 IP:59.120.xxx.xxx 未訂閱
1. 請搜尋: MDI
2. 請翻書~這類技術大多數的Delphi 書都有寫~
P.D.
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-03-14 23:27:22 IP:220.136.xxx.xxx 未訂閱
你最大的問題在於
誤把frmLogin Form 當成 Main Form, 所以當然 frmLogin 被Free, 所有child form 都跟著被Free掉
到你的 Project 選項中的 Options 查看一下 Main Form 是指定給誰
我相信絕對是 Application.CreateForm(TfrmLogin, frmLogin);
===================引 用 cilan 文 章===================
Login Form處理
需求:Login畫面關閉後,直接進入主功能畫面。
// dpr程式段 Begin
program ASSET;
uses
Forms,
AstDM in '..\global\AstDM.pas' {DMAst: TDataModule},
uLogin in 'uLogin.pas' {frmLogin},
uMain in 'uMain.pas' {frmMain},
Aglobal in '..\global\Aglobal.pas';
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TDMAst, DMAst);
Application.CreateForm(TfrmLogin, frmLogin);
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
// dpr程式段 End
//Login form 片段Start
if qryTemp.Fieldbyname('PWD').AsString <> edtPWD.Text then
begin
logintimes:=logintimes 1;
if logintimes >= 3 then
begin
showmessage('連續輸入三次錯誤密碼,即將退出!');
Close;
end
else
begin
showmessage('密碼錯誤!->' inttostr(logintimes) ' (請確認大小寫的差異)');
edtPWD.SetFocus;
end;
end
else
begin
frmLogin.FormStyle:= fsNormal; 會全部關掉,所以暫把推到底層
Application.CreateForm(TfrmMain, frmMain); // 進入Asset主畫面
當執行到這裡時全部都會關掉!
end;
//Login form 片段End
2.選單與畫面 (圖片請參考附檔)
功能主選單(frmMain)
整個藍色框內都屬於frmMain
功能訴求是希望點選功能項後,能把指定的功能畫面show在功能畫面區,且能緊貼著;當關閉功能時,又回復到如上圖畫面!也就是功能畫面能隨著主畫面移動座標。希望能像Word介面一樣:選單與編輯整合在一起。
請問在frmMain和各功能畫面的Position, FormStyle, WindowState分別要怎麼給值,才能達到需求?
cilan
一般會員


發表:6
回覆:13
積分:3
註冊:2011-06-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-03-16 09:45:02 IP:61.221.xxx.xxx 訂閱
謝謝PD大大
調整程式碼後,帶來了另一個問題......如下
////////////////////////////////////////////////
procedure TfrmMain.FormCreate(Sender: TObject);
var
QryTemp:TADOQuery;
lflag:boolean;
begin
frmLogin:= TfrmLogin.Create(Application);
frmLogin.showmodal;
lflag:=loginflag;
frmLogin.free; // <-- 關閉登錄畫面
if not lflag then // <-- 當驗證失敗時
begin
// 這一段要怎麼下指令,才能結束掉整支程式?
end;
ASTpath:='';
CNTpath:='';
QryTemp:=TADOQuery.Create(nil);
QryTemp.ConnectionString := AstDM.conAsset;
QryTemp.SQL.Add('select * from ASBSYSM');
try
QryTemp.Open;
:
:
/////////////////////////////////////////////////////////////
------
- 嵐 -
P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-03-16 17:36:28 IP:220.136.xxx.xxx 未訂閱
程式終結最常用 Application.Terminate
不過我個人並不很喜歡用這個方式
Form1 (mainform) call Form2 (loginform)
Form2不符, Form1.Close 這是最好的做法

如果如你是把 Form2 Show 寫在 o n c r e a t e 事件上,
那基本上下 Form1.Close並不會把 MainForm給Close
因為它正在Creating 中
有很多方法調整
另外把 form2 create 放在 o n s h o w 或 o n a c t i v e 上應該都可行
或者我常的有一個 StartRun 的方式 放在 o n i d a l 上
搜尋一下本站 StartRun 用法, 我之前的案例應該還在站上
===================引 用 cilan 文 章===================
謝謝PD大大
調整程式碼後,帶來了另一個問題......如下
////////////////////////////////////////////////
procedure TfrmMain.FormCreate(Sender: TObject);
var
QryTemp:TADOQuery;
lflag:boolean;
begin
frmLogin:= TfrmLogin.Create(Application);
frmLogin.showmodal;
lflag:=loginflag;
frmLogin.free; // <-- 關閉登錄畫面
if not lflag then // <-- 當驗證失敗時
begin
// 這一段要怎麼下指令,才能結束掉整支程式?
end;
ASTpath:='';
CNTpath:='';
QryTemp:=TADOQuery.Create(nil);
QryTemp.ConnectionString := AstDM.conAsset;
QryTemp.SQL.Add('select * from ASBSYSM');
try
QryTemp.Open;
:
:
/////////////////////////////////////////////////////////////
cilan
一般會員


發表:6
回覆:13
積分:3
註冊:2011-06-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-03-19 08:29:42 IP:220.134.xxx.xxx 訂閱
首先,謝謝「老大仔」指點的方向;
MDI 方法不知道是不是不熟悉用法,怎麼用都怪!
目前還是用原來的笨方法......因為讓form on top,所以缺陷是其它視窗都會被蓋住!

再者,謝謝PD大大詳細指導。
問題解決了,不過幾種用法我都會嚐試看看!

===================引 用 P.D. 文 章===================
程式終結最常用 Application.Terminate
不過我個人並不很喜歡用這個方式
Form1 (mainform) call Form2 (loginform)
Form2不符, Form1.Close 這是最好的做法

如果如你是把 Form2 Show 寫在 o n c r e a t e 事件上,
那基本上下 Form1.Close並不會把 MainForm給Close
因為它正在Creating 中
有很多方法調整
另外把 form2 create 放在 o n s h o w 或 o n a c t i v e 上應該都可行
或者我常的有一個 StartRun 的方式 放在 o n i d a l 上
搜尋一下本站 StartRun 用法, 我之前的案例應該還在站上
------
- 嵐 -
系統時間:2024-04-17 7:19:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!