findclass的用法(100分)

  • 主题发起人 主题发起人 pangzhenguang
  • 开始时间 开始时间
P

pangzhenguang

Unregistered / Unconfirmed
GUEST, unregistred user!
用findclass時總是返回沒有找到參數指定的類﹐請教原因﹐并給一個例﹐請請各位高手
 
先要RegisterClass():

procedure TForm1.FormCreate(Sender: TObject)

begin
RegisterClass(Tform2);
RegisterClass(Tform3)

RegisterClass(Tform4)

RegisterClass(Tform5)

end




procedure TForm1.Button1Click(Sender: TObject);
var
f : Tformclass

begin
f := tformclass(findClass(edit1.text));
with f.create(self) do show;
end

 
如上例,你在edit1中输了什么值,是‘Tform2’吗?如果是,就应该能找得到,如果你输‘form2’,
就找不到,至于为什么,不用我说了吧,好好看看自己输错了没?马大哈, :)
如果没有输错,请回贴!
 
zw84611兄你好﹕
我的問題還沒有解決﹐我要FindClass的類是在一個bpl文件中﹐我要創建這個類時才用
LoadPackage把這個bpl文件調入再用FindClass返回一個類再創建該類具體代嗎如下﹕
type
TMYForm= class of TForm;
TForm1 = class(TForm)
........................

procedure TForm1.Button1Click(Sender: TObject);
var FBasemodClass :TMYForm;
begin
FCurrentModuleHandle:=LoadPackage('Package1.bpl');
FBasemodClass:=TMYForm(FindClass('TForm2'));
Fform:=FBasemodClass.Create(self);
Fform.Show;
end;


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}
initialization
RegisterClass(TForm2);
finalization
UnregisterClass(TForm2);
end.
 
[:)]又学了点东西,我真没这样做过。所以也不知道怎么办。
你这样试试:
procedure TForm1.FormCreate(Sender: TObject)

begin
RegisterClass(Tform2);
end;
 
但總是提示找不到TForm2
 
uses unit2;
 
zw84611兄你好﹕
你說的方法是可以﹐但是TForm2對我來說是不我變量﹐不是固定的
 
zw84611兄你好﹕
可不可以告訴我哪里可以找到FindClass的詳細例子﹐謝謝﹗
 
TForm2不是变量呀,它是一个类,而Form2是它的一个instance。
 
function FindClass(const ClassName: string): TPersistentClass


Call FindClass to locate a class type by name. FindClass searches
the classes that the streaming system knows about. Form classes and
component classes that are referenced in a form declaration (instance
variables) are automatically registered with the streaming system.
Other classes can be registered (with a call to RegisterClasses) so
that the streaming system will recognize that class in a stream and
know how to construct it.

If the requested class name cannot be found, FindClass raises an
exception

详细的例子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=0105450
 
我知道﹐但是FindClass(vClassname)中的vClassname是人個變量﹐我并不想把vClassname
固定為TForm2,它是在被調用時才確定是TForm1或TForm2或TForm3或TForm4或TForm5或....
 
那你可以在FormCreate中把所有的TFormx注册呀,象我最开始的例子那样。
FindClass(str)中的str是变量和这并不矛盾,但前提是str必须是'TFormx'
 
zw84611兄:
想再問多你一個問題﹐
procedure TForm1.FormCreate(Sender: TObject)

begin
RegisterClass(Tform2);
end;
是不是要在
procedure TForm1.FormClose(Sender: TObject
var Action: TCloseAction);
begin
UnRegisterClass(TForm2);
end;
 
我想如果你在程序结束时UnRegisterClass(TForm2);可能就没有必要了。
我是业余的,这方面一知半解,你还是问问专业人士吧[:)]
 
問題還是沒有解決﹐我的TForm1,TForm2,TForm3...是在一個BPL中﹐并不在當前文件中
uses 沒辦法把TForm1,TForm2,TForm3...包括進來﹐何來RegisterClass(TForm1,TForm2,
.....)呢﹖
 
抱歉,我没接触过bpl,所以不好回答。希望下面几个能有所帮助:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=0692666
http://www.delphibbs.com/delphibbs/dispq.asp?lid=0535451
http://www.delphibbs.com/delphibbs/dispq.asp?lid=0642584
 
謝謝zw84611兄
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部