MainForm 呼叫 Form2 Function 問題!! |
答題得分者是:darnell
|
goolddag0821
一般會員 ![]() ![]() 發表:10 回覆:10 積分:3 註冊:2007-07-16 發送簡訊給我 |
Dear 各位前輩
小弟最近遇到一個問題就是要透過MainForm 去呼叫 Form2 的function 結構本身都無問題但是卡在一點就是啟動Form2時要隱藏Form2的Modal 所以在MainForm中不用Form2.Show 的功能,但是現在Run的時候發現 一個問題就是直接用MAP.CreateSet('SN','SAVEPath'); 來呼叫的話要連續 呼叫兩次Form2 的chart 才會繪製出來,不然繪出的chart是空的!!!!!! 本以為是Form2 chart的元件沒有啟動,但是測試過好像也不是這個問題.......... 請各位前輩指點一下~~ Thanks~ [code delphi] // MainForm Code...... procedure TForm1.Button1Click(Sender: TObject); var MAP : TMapForm; begin MAP := TMapForm.Create( Self ); MAP.CreateSet('SN','SAVEPath'); MAP.Free; end; // Form2 Code ....... procedure TMapForm.CreateSet(GetWIP : String;GetFPath : String); begin Application.ShowMainForm:= false; Label1.Caption := GetWIP; Self.DrawMapChart(); end; procedure TMapForm.DrawMapChart(); begin Chart1.Series ........ //繪製Chart end; [/code] |
darnell
版主 ![]() ![]() ![]() ![]() 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
|
goolddag0821
一般會員 ![]() ![]() 發表:10 回覆:10 積分:3 註冊:2007-07-16 發送簡訊給我 |
|
deity
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
|
goolddag0821
一般會員 ![]() ![]() 發表:10 回覆:10 積分:3 註冊:2007-07-16 發送簡訊給我 |
Dear deity
結果還是無法繪出,在MainForm 中加入MAP.Show 就都解決 但是就無法符合需求,我是覺得奇怪的事為何呼叫一次 MAP.CreateSet('SN','SAVEPath'); 無法顯示出TChart & TAdvStringGrid 的元件 但是連續呼叫兩次 MAP.CreateSet('SN','SAVEPath'); MAP.CreateSet('SN','SAVEPath'); 第二次就會完成繪出TChat & TAdvStringGrid 的圖形與數據..... 感謝您的回覆~ |
deity
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
|
darnell
版主 ![]() ![]() ![]() ![]() 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
我不清楚你在DrawMapChart()中做了哪些動作?
你是要將TChart繪圖的內容存成檔案嗎? 不然因為你沒有show所以應該不是要直接讓人看圖吧 依據這樣的推測基本上在Create的時候應該就可以正常繪圖了 但是據你說並無出現資料(假設輸出成圖片)那應該是有幾各可能 1.時間太短太快釋放掉來不及繪圖那請你在 [code delphi] procedure TForm1.Button1Click(Sender: TObject); var MAP : TMapForm; begin MAP := TMapForm.Create( Self ); MAP.CreateSet('SN','SAVEPath'); Application.ProcessMessages; //加入此行 MAP.Free; end; [/code] 或者在那行處多停一下再繼續及在DrawMapChart()最後加入Application.ProcessMessages; 2.繪圖元件有用到某些資料而你在Create時並沒有建立完成而要到show時 才有資料可供繪圖那麼就需要查看DrawMapChart做了什麼才知道了 所以請檢查DrawMapChart裡面的程式碼是否有何步驟要在show時有作用的 |
goolddag0821
一般會員 ![]() ![]() 發表:10 回覆:10 積分:3 註冊:2007-07-16 發送簡訊給我 |
編輯記錄
goolddag0821 重新編輯於 2008-11-21 14:17:28, 註解 無‧
goolddag0821 重新編輯於 2008-11-21 14:19:58, 註解 無‧ goolddag0821 重新編輯於 2008-11-21 14:21:04, 註解 無‧ goolddag0821 重新編輯於 2008-11-21 14:24:16, 註解 無‧ goolddag0821 重新編輯於 2008-11-21 14:24:42, 註解 無‧ goolddag0821 重新編輯於 2008-11-21 14:28:01, 註解 無‧ |
goolddag0821
一般會員 ![]() ![]() 發表:10 回覆:10 積分:3 註冊:2007-07-16 發送簡訊給我 |
Dear darnell,
source code 有connection DB 所以我修改成下面這樣 最基本的繪圖範例一樣Run不出來...... 我想應該是雖然Form2 有被Create 但是沒有去 SHOW 會有部份 Tool無法開啟,但是納悶的事未何連續呼叫兩次就會Export出Image 一樣沒有去啟動 Form2.Show 但是卻可以..... [code delphi] procedure TMapForm.DrawMapChart(); begin Chart1.Series[0].Add(2.55,''); Chart1.Series[0].Add(3.21,''); end; //我Image Export Function procedure TMapForm.ExportDraw(); var bmp : TBitmap; Jpg : TJPEGImage; begin bmp := TBitmap.Create; Jpg := TJpegImage.Create; bmp.Height := Panel1.Height; bmp.Width := Panel1.Width; Panel1.PaintTo(bmp.Canvas.Handle,0,0); Jpg.Assign(Bmp); Jpg.CompressionQuality := 80; //壓縮 Jpg.Compress; Jpg.SaveToFile( FPath WIP '.jpeg' ); bmp.Free; end; // 以下這樣就可以!! procedure TForm1.Button1Click(Sender: TObject); var MAP : TMapForm; begin MAP := TMapForm.Create( Self ); MAP.CreateSet('SN','SAVEPath'); MAP.CreateSet('SN','SAVEPath'); MAP.Free; end; [/code]
編輯記錄
|
darnell
版主 ![]() ![]() ![]() ![]() 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
|
goolddag0821
一般會員 ![]() ![]() 發表:10 回覆:10 積分:3 註冊:2007-07-16 發送簡訊給我 |
|
darnell
版主 ![]() ![]() ![]() ![]() 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
主要差異在Panel1.PaintTo(bmp.Canvas,0,0) 會比Panel1.PaintTo(bmp.Canvas.Hande,0,0)
多呼叫Canvas.Lock的動作執行完繪圖再做Canvas.UnLock的動作 Canvas.Lock的作用可以參照Help的說明 Call Lock in a multithreaded application to prevent other threads from drawing on the canvas. Lock prevents other cooperating threads in the application from executing until the Unlock method is called. Nested calls to Lock increment the LockCount property so that the canvas is not unlocked until the last lock is released. In multi-threaded applications that use Lock to protect a canvas, all calls that use the canvas must be protected by a call to Lock. Any thread that does not lock the canvas before using it will introduce potential bugs. Because Lock prevents other threads from executing, it can adversely affect performance. Do not call Lock unless there is a danger that another thread might interfere with drawing on the canvas. 我"推測"因為你沒做FormShow的動作顯示所以繪圖動作可能會受到其他的影響而使bmp.Canvas抓到空白 第二次因為前次繪圖已完成因此則可正確輸出 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |