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

已RegisterClass, 但用Findclass 仍找不到Available 裡的Form!(找到有問題的Form了... 不過不解為什麼?)

答題得分者是:RootKit
yching
一般會員


發表:6
回覆:22
積分:10
註冊:2007-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-18 10:13:42 IP:220.130.xxx.xxx 訂閱
前天我好不容易找到在每個要被開啟的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.
是否有哪位大大可以指引我方向除錯?

我想我是遇到傳說中的....."鬼打牆"........ >"<
編輯記錄
yching 重新編輯於 2008-07-18 10:15:46, 註解 無‧
yching 重新編輯於 2008-07-18 10:16:24, 註解 無‧
yching 重新編輯於 2008-07-18 16:49:00, 註解 無‧
yching 重新編輯於 2008-07-21 16:52:13, 註解 無‧
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-18 10:37:18 IP:203.67.xxx.xxx 訂閱
沒錯!!
就是那個鬼把你的 TChildForm 改了名字
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
yching
一般會員


發表:6
回覆:22
積分:10
註冊:2007-03-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-18 10:45:21 IP:220.130.xxx.xxx 訂閱
好冷...... 你是認真的在回答我嗎!? @@|||

是不是我該找出 RegGroups 來對看看我的 TChildForm 是否有Register 成功?
那要怎麼列出RegGroups 呀?
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-18 15:14:33 IP:59.125.xxx.xxx 訂閱

確認你呼叫的 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-18 15:57:03 IP:220.130.xxx.xxx 訂閱
我已經把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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-18 16:40:43 IP:203.67.xxx.xxx 訂閱
你在要被開啟的 Form 裡
也就是

[code delphi]
initialization Classes.RegisterClass(TChildForm);
[/code]

這個 Form 的 Name 一樣是叫 ChildForm 嗎

------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2008-07-18 16:54:25, 註解 無‧
AndrewK 重新編輯於 2008-07-18 16:55:06, 註解 無‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-07-18 16:45:05 IP:61.222.xxx.xxx 訂閱
DeBug 一下 Classes.RegisterClass(TChildForm); 這一行有沒有被執行。
yching
一般會員


發表:6
回覆:22
積分:10
註冊:2007-03-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-07-18 16:56:49 IP:220.130.xxx.xxx 訂閱
歹勢.... 我沒寫清楚....
被開啟的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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-07-18 17:00:29 IP:220.130.xxx.xxx 訂閱
有的!
我把停駐點放在 initialization 上...
程式在執行時,有過Classes.RegisterClass(TChildForm); 這一行.....

但後面FindClass 就是找不到!?



===================引 用 RootKit 文 章===================
DeBug 一下 Classes.RegisterClass(TChildForm); 這一行有沒有被執行。
yching
一般會員


發表:6
回覆:22
積分:10
註冊:2007-03-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-07-18 18:02:59 IP:220.130.xxx.xxx 訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-07-18 23:17:49 IP:203.67.xxx.xxx 訂閱
我想~~
把程式上傳,也許可以解決你的問題









------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2008-07-18 23:23:16, 註解 無‧
AndrewK 重新編輯於 2008-07-18 23:30:56, 註解 無‧
AndrewK 重新編輯於 2008-07-18 23:35:58, 註解 無‧
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-07-19 14:18:26 IP:61.223.xxx.xxx 訂閱
錯啦!要移到後面才對喔
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-07-19 17:23:39 IP:219.68.xxx.xxx 訂閱
您所說的我都有試著去修改... 不過一樣不行!
我另外在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"移到最前面...


編輯記錄
yching 重新編輯於 2008-07-19 17:31:54, 註解 無‧
yching 重新編輯於 2008-07-19 17:33:09, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-07-19 22:33:41 IP:59.126.xxx.xxx 未訂閱
看來以上幾位的描述,版主我請問幾個問題,你試試
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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-07-21 13:30:55 IP:220.130.xxx.xxx 訂閱
試過了...
看起來都不是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 重新編輯於 2008-07-21 13:32:24, 註解 無‧
yching 重新編輯於 2008-07-21 13:48:00, 註解 無‧
yching
一般會員


發表:6
回覆:22
積分:10
註冊:2007-03-23

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-07-21 17:02:37 IP:220.130.xxx.xxx 訂閱
我找到有問題的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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2008-07-21 21:13:56 IP:61.222.xxx.xxx 訂閱
我以為你呼嚨我。

我試了一下,居然如此,又發現原因出在 QDialogs。不要 Uses 即可。

繼續瞭解中....
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#18 引用回覆 回覆 發表時間:2008-07-21 21:43:56 IP:61.222.xxx.xxx 訂閱
進一步瞭解原因出在 QDialogs 中 initialization 段使用了ActivateClassGroup
詳細看 Delphi Help

解決方式:
1. 不要Uses QDialogs
2. RegisterClass(TForm2);
ActivateClassGroup(TForm2);


careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#19 引用回覆 回覆 發表時間:2008-07-21 21:53:56 IP:218.210.xxx.xxx 未訂閱
RootKit 版大您真神呀~~~,這麼短的時間就給他研究出來了~~
------
價值的展現,來自於你用哪一個角度來看待它!!
yching
一般會員


發表:6
回覆:22
積分:10
註冊:2007-03-23

發送簡訊給我
#20 引用回覆 回覆 發表時間:2008-07-22 08:49:48 IP:220.130.xxx.xxx 訂閱
行了!行了!

真是太太太感激大大您了! ~ya
系統時間:2024-03-29 17:52:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!