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

MainForm 呼叫 Form2 Function 問題!!

答題得分者是:darnell
goolddag0821
一般會員


發表:10
回覆:10
積分:3
註冊:2007-07-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-21 09:25:38 IP:67.15.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-21 10:15:44 IP:220.128.xxx.xxx 訂閱
在你的TMapForm.DrawMapChart();  中最後面加入
Chart1.AutoRepaint:=True;
Chart1.Refresh;
試看看
編輯記錄
darnell 重新編輯於 2008-11-21 10:16:30, 註解 無‧
goolddag0821
一般會員


發表:10
回覆:10
積分:3
註冊:2007-07-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-21 10:38:30 IP:67.15.xxx.xxx 訂閱
Dear darnell,

還是Chart1一樣繪製不出來,很妙的事TLabel 跟 TImage 都可以顯示出來
但是TChart & TAdvStringGrid 的元件就都無法顯示出來,除非連續呼叫兩
次 MAP.CreateSet('SN'SAVEPath'); 才會顯示!!!!!!
感謝您的回覆!!
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-21 10:45:49 IP:125.89.xxx.xxx 未訂閱
您好:

Series1.Active :=true;
试试
goolddag0821
一般會員


發表:10
回覆:10
積分:3
註冊:2007-07-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-21 10:59:49 IP:67.15.xxx.xxx 訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-21 11:23:28 IP:125.89.xxx.xxx 未訂閱
将这部分程式单独拿出来调试一下。

或方便打包上传上来,我试试。
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-21 11:26:00 IP:60.250.xxx.xxx 訂閱
我不清楚你在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時有作用的
編輯記錄
darnell 重新編輯於 2008-11-21 11:27:11, 註解 無‧
darnell 重新編輯於 2008-11-21 11:48:24, 註解 無‧
goolddag0821
一般會員


發表:10
回覆:10
積分:3
註冊:2007-07-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-21 14:13:27 IP:67.15.xxx.xxx 訂閱
編輯記錄
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-21 14:26:42 IP:67.15.xxx.xxx 訂閱
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]
編輯記錄
goolddag0821 重新編輯於 2008-11-21 14:28:49, 註解 無‧
goolddag0821 重新編輯於 2008-11-21 14:29:22, 註解 無‧
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-11-21 15:32:23 IP:60.250.xxx.xxx 訂閱
請將panel1.PaintTo(bmp.Canvas.Handle,0,0);
改成p
anel1.PaintTo(bmp.Canvas,0,0);
編輯記錄
darnell 重新編輯於 2008-11-21 15:33:03, 註解 無‧
goolddag0821
一般會員


發表:10
回覆:10
積分:3
註冊:2007-07-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-11-21 16:08:19 IP:67.15.xxx.xxx 訂閱
Dear darnell,

太感謝您了~~ 修改後就可以了!!
但還是要請教一下!!
Panel1.PaintTo(bmp.Canvas.Hande,0,0)
Panel1.PaintTo(bmp.Canvas,0,0)
是差別在哪!!!! 真不意思在向您請教~
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-11-21 16:46:57 IP:60.250.xxx.xxx 訂閱
主要差異在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抓到空白
第二次因為前次繪圖已完成因此則可正確輸出
系統時間:2024-05-11 11:44:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!