variant類型能不能轉換成TFont類型﹖ (50分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
我見control里面已定義了Font屬性﹐為什么我想這樣調用卻不行﹖出undeclared identifier:'Font'
這個錯﹐哪位大蝦幫我解釋一下﹐并告訴我怎樣才能用﹖
我想實現這樣﹐TControl(Components).font.color:=clRed;
另外﹐TFont與Variant這種類型能夠互換嗎﹖謝謝﹗
 
好像应该用 AS 吧。(Components as TControl).Font.Color:=clRed;
 
TControl类是不能实例化的,用它的子类TWinControl或TGraphicControl
 
TControl.font是protected属性,所以不能通过TControl获得其font。
 
你没看到TControl的font属性旁边有个黄色的方格吗?:)
不能互换。
 
这说明TControl没有这个属性呀,你试试其他继承的类,比如TLabel。
 
吳兄﹐我看到黃格了﹐但你能給我解釋一下嗎﹖我不是很清楚呀。為什么不能互換﹐原因﹖
to YNTW,用TWinControl也不行。但我從TControl,TWinControl,TButtonControl,一直看到
TButton﹐在TButton中就直接property Font;引用了﹐也沒有寫什么﹐這是怎么回事﹖能說
說其中的道理嗎﹖謝啦各位﹗
 
因为有可能Components并不是从TControl继承来的。
不能。
; for i := 0 to ComponentCount-1 do
; ; begin
; ; if Components is TControl then
; ; ; begin
; ; ; with (Components as TControl) do
; ; ; ; font.color:=clRed;
; ; ; end;
; ; end;
 
tseug,你的方法也不行呢。你有沒有試過喲﹖在表單里的可視控件哪一個不經過TControl呢﹖
我就是想在這一級將他截住。
 
tseug的方法是行的。编译的时候Delphi不会检查with这种语句中的属性合法性问题。
另有一法:
type
tcon =class(tcontrol)
; public
; ; property font;
; end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
; for i := 0 to ComponentCount-1 do
; ; if Components is TControl then
; ; ; tcon(Components).font.color:=clRed;
end;
也行,同样这样避免了编译时属性合法性检查问题
 
通过下面的方法可以获得和修改Protected的属性。
type
;TCrackControl = class(TControl);
...
;TCrackControl(Components).font.color:=clRed;
; // 不能用(Components as TCrackControl),

使用时,要确认Components is TControl。
这种绕过Protected的方法,最早读自marco cantu《Delphi 3开发指南》,挺管用。
试试看!

Delphi.TObject
 
to tobject@sina.com,謝謝你﹗我能用了。你能幫我回答第二個問題嗎﹖
TFont與Variant這種類型能夠互換嗎﹖Variant是動態類型﹐那么我怎么才能將他轉換為
TFont呢﹖
 
我的方法怎么不能用?我试过的。delphi 6.0
 
tseug,對不起﹐我剛才沒試﹐只是想想不可能。那么你能告訴我為什么
// ; ; ; ;TControl(Components).Font.Color:=clRed; //這一句不行
; ; ; with (Components as TControl) do
; ; ; ; font.color:=clRed; ;// 而這樣卻行。
能告訴我原因嗎﹖我要知道這其中的道理。我另開一個貼子給你50分﹐如何﹖
 
因为Font属性在TControl中是Protected型的,所以你不能够直接访问。因为TForm是从
TControl继承的,所以我们可以访问Font属性。利用With语句这是因为我们欺骗了
delphi的语法检查,当语法检查没有发现TControl的Font属性就会找单元文件中同名的
标识符,结果可以从TForm中找到,所以通过了语法检查,但在运行时却是引用的我们需
要的TControl的Font属性。
 
Variant是变体型啊。和tfont好象不能互换:)
 
to tseug,你的意思是說With只是欺騙了語法檢查﹐就如同上面tobject@sina.com的一樣﹐
是嗎﹖只是你的更加方便﹐而且此法也適用于其它被Protected的屬性。
我再詳細一點﹕是因為With欺騙了語法檢查﹐因為在TControl下沒有找到Font這個屬性﹐但
是在Form下找到了﹐因為在表單中要改變表單的Font﹐也可以直接寫。即在表單中現在相當
于有了兩個With﹐是吧。所以﹐Delphi以為是Form的﹐所以就過了。在運行中﹐卻是用的
TControl的。KAO﹐這一招好高﹐這也可以說是Delphi的BUG﹐只不過是個好虫子。那么﹐
tseug﹐你還知不知道其他哪些技巧呢﹖能否多告訴我一些。我另開一貼﹐100分給你﹗
請到此貼領分﹕http://www.delphibbs.com/delphibbs/dispq.asp?lid=739882
現在還有一個問題了。
看來這個貼分數給少了﹐不太對得起樓上的各位兄弟。
算了﹐等問題結束了﹐我再開一個貼分分。
 
tseug兄別處拿了100分﹐這兒就不加分了。謝謝各位﹗
 
后退
顶部