已RegisterClass, 但用Findclass 仍找不到Available 裡的Form!(找到有問題的Form了... 不過不解為什麼?) |
答題得分者是:RootKit
|
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
前天我好不容易找到在每個要被開啟的Form 最後加上下面這兩句就能FindClass(TChildxxxForm)
[code cpp] initialization // 這兩句一定要放在最後,MainForm才能呼叫到ChildForm! RegisterClass(TChildxxxForm); [/code] 而且也真的成功讓我動態開啟Available 裡的form [code cpp] ChildForm:=TFormClass(FindClass(TChildxxxForm)).Create(Application); ChildForm.Visible:=True; ChildForm.WindowState := wsMaximized; [/code] 但是.... 昨天不知道是不是我寫了些什麼.... 造成FindClass(TChildxxxForm) 錯誤! Error Msg: Class TChildxxxForm not found. 是否有哪位大大可以指引我方向除錯? 我想我是遇到傳說中的....."鬼打牆"........ >"< |
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
|
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
確認你呼叫的 RegisterClass 是 Delphi 的 RegisterClass 而不是 Windows 的 所以注意 unit 引用的順序,或是直接明確指明 windows.RegisterClass or Classes.RegisterClass ===================引 用 yching 文 章=================== 前天我好不容易找到在每個要被開啟的Form 最後加上下面這兩句就能FindClass(TChildForm) [code cpp] initialization // 這兩句一定要放在最後,MainForm才能呼叫到ChildForm! RegisterClass(TChildForm); [/code] 而且也真的成功讓我動態開啟Available 裡的form [code cpp] ChildForm:=TFormClass(FindClass(TChildForm)).Create(Application); ChildForm.Visible:=True; ChildForm.WindowState := wsMaximized; [/code] 但是.... 昨天不知道是不是我寫了些什麼.... 造成FindClass(TChildForm) 錯誤! Error Msg: Class TChildForm not found. 是否有哪位大大可以指引我方向除錯? 我想我是遇到傳說中的....."鬼打牆"........ >"< |
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
我已經把unit uses "Classes"移到最前面...
[code cpp] unit Main; interface uses Classes, Windows, Messages, SysUtils, Variants, Graphics, Controls, Forms..... [/code] 並且在要被開啟的Form最後修改為... [code cpp] initialization // 這兩句一定要放在最後,MainForm才能呼叫到ChildForm! Classes.RegisterClass(TChildxxxForm); [/code] But.... Findclass 還是找不到 TChildxxxForm class....... T︿T
編輯記錄
yching 重新編輯於 2008-07-18 16:50:20, 註解 無‧
|
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
你在要被開啟的 Form 裡
也就是 [code delphi] initialization Classes.RegisterClass(TChildForm); [/code] 這個 Form 的 Name 一樣是叫 ChildForm 嗎
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
歹勢.... 我沒寫清楚....
被開啟的Form 跟要宣告Create的Child Form是不同名稱的! 我120% 確定放在 initialization Register的名稱就是被開啟的Form.... (如我原始問題修改後樣式....) [code cpp] initialization Classes.RegisterClass(TChildxxxForm); [/code] ===================引 用 AndrewK 文 章=================== 你在要被開啟的 Form 裡 也就是 [code delphi] initialization Classes.RegisterClass(TChildForm); [/code] 這個 Form 的 Name 一樣是叫 ChildForm 嗎
編輯記錄
yching 重新編輯於 2008-07-18 17:02:31, 註解 無‧
|
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
|
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
0屋!
我發現新的Message了.... 我把我的Child Form從Project 移除再重新加入.... 結果在執行下面這兩句時... [code cpp] initialization // 這兩句一定要放在最後,MainForm才能呼叫到ChildForm! RegisterClass(TChildxxxForm); [/code] 產生了新的Error Msg... [Error] Childxxx.pas(13745): Incompatible types: 'tagWNDCLASSA' and 'Class reference' 我把它換成了下面這兩句.... 就又可以過.... 可是FindClass 還是失敗..... >"< [code cpp] initialization // 這兩句一定要放在最後,MainForm才能呼叫到ChildForm! RegisterClasses([TChildxxxForm]); [/code]
編輯記錄
yching 重新編輯於 2008-07-18 18:12:21, 註解 無‧
|
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
我想~~
把程式上傳,也許可以解決你的問題
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
錯啦!要移到後面才對喔
uses 的順序是後面的 (近的) 優先 還有,Project Option 的 Build with Run-time Package 有沒有勾起來 沒有勾的話,FindClass 是找不到已註冊的 class 的 ===================引 用 yching 文 章=================== 我已經把unit uses "Classes"移到最前面...
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
您所說的我都有試著去修改... 不過一樣不行!
我另外在RegisterClass 那下了停駐點Debug 看了一下.... 使用RegisterClasses([TChildxxxForm]) 時 在Evaluate 顯示"Incompatible types: 'tagWNDCLASSA' and 'Class reference'" 使用RegisterClass(TChildxxxForm) 時 在Evaluate 顯示"Expression illegal in evaluator" 看來在RegisterClass 時就有問題了... >"< >>>繼續努力找問題 @@||| <<< ===================引 用 sryang 文 章=================== 錯啦!要移到後面才對喔 uses 的順序是後面的 (近的) 優先 還有,Project Option 的 Build with Run-time Package 有沒有勾起來 沒有勾的話,FindClass 是找不到已註冊的 class 的 ===================引 用 yching 文 章=================== 我已經把unit uses "Classes"移到最前面... |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
看來以上幾位的描述,版主我請問幾個問題,你試試
1、先把所有你有寫 initialization 的地方先 Mark 掉,然後請 New 一個 New Form ,在這個 New Form 上寫 initialization 然後試試,這個 new Form 可不可以被叫起來 2-1、如果可以,那就一個一個加回去,看看是哪一個 Form 卡死的囉....... 2-2、如果不行,至少查的方向就簡單的多了 3、最後.....既然之前可以,現在不行,那表示您... 真的卡到x 了......... , 那小弟建議一個做法, 你可以將專案再複製一個資料夾,然後用建立空專案的方式把 Unit 一個一個加回來,看是卡到哪裏,下次就知道該如何避免囉........
------
價值的展現,來自於你用哪一個角度來看待它!! |
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
試過了...
看起來都不是Child Form 的問題... 我試著把Child Form 放了.... uses Childxxx; 並且將下面這段 ChildForm:=TFormClass(TChildxxxForm).Create(Application); ChildForm.Visible:=True; ChildForm.WindowState := wsMaximized; 結果能Create 出我的Child Form .... 但一樣有 ID := PChar('TChildxxxForm') ChildForm:=TFormClass(FindClass(ID)).Create(Application); |
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
我找到有問題的Form了...
剛好那個Form 也是程式鬼打牆那天寫的.... 只要我的Main Form uses 它... 就會FindClass 失敗... [code cpp] unit InfoSet; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Printers, QDialogs, FileCtrl; type TInfoSetForm = class(TForm) Panel1: TPanel; PrtPanel: TPanel; BitBtn2: TBitBtn; LoginBitBtn: TBitBtn; Label1: TLabel; PrintsCbBox: TComboBox; FolderPanel: TPanel; Label2: TLabel; FolderEdit: TEdit; OpenBitBtn: TBitBtn; procedure FormCreate(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure OpenBitBtnClick(Sender: TObject); private function GetPrtLinkInfo: String; function GetSavePathInfo: String; procedure SetSavePathInfo(tPath: String); public property LStr :String read GetPrtLinkInfo; property SavePath :String read GetSavePathInfo write SetSavePathInfo; function ShowModalName: Integer; end; var InfoSetForm: TInfoSetForm; implementation {$R *.dfm} procedure TInfoSetForm.FormCreate(Sender: TObject); var i : integer; PrtName:string; begin try Printer.PrinterIndex := -1; // 原預設印表機 PrtName:= Trim(printer.Printers[Printer.PrinterIndex]); except on xErr: Exception do PrtName := 'There is no default printer currently selected'; end; PrintsCbBox.Items.Clear; for i := 0 to Printer.Printers.Count - 1 do begin PrintsCbBox.Items.Add( printer.Printers.Strings[i] ); if Trim(printer.Printers.Strings[i])= PrtName then PrintsCbBox.ItemIndex := i; end; end; function TInfoSetForm.GetPrtLinkInfo: String; begin Result := Trim(PrintsCbBox.Items.Strings[PrintsCbBox.ItemIndex]); end; function TInfoSetForm.ShowModalName: Integer; begin Result := ShowModal; end; procedure TInfoSetForm.BitBtn2Click(Sender: TObject); begin Close; end; procedure TInfoSetForm.OpenBitBtnClick(Sender: TObject); var Dir :String; begin if Trim(FolderEdit.Text)<>'' then Dir := Trim(FolderEdit.Text) else Dir := 'C:\Doc'; if SelectDirectory('請選擇預設儲存路徑', '', Dir) then FolderEdit.Text := Dir; end; function TInfoSetForm.GetSavePathInfo: String; begin Result := Trim(FolderEdit.Text); end; procedure TInfoSetForm.SetSavePathInfo(tPath: String); begin FolderEdit.Text := tPath; end; end. [/code] ps. 回覆的功能裡好像不能上傳檔案, 我只好把code 寫上了, 這個Form 的功能主要是要讓user 設定預設的印表機、檔案儲存路徑, 再讓其他的Form引用它去做設定。這只是個小小的東西呀..... 為什麼會影響到我的Class....為什麼... 為什麼... @@??? |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
yching
一般會員 發表:6 回覆:22 積分:10 註冊:2007-03-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |