关于接口--我百想不得其解    100分相送(100分)

  • 主题发起人 主题发起人 njchj
  • 开始时间 开始时间
N

njchj

Unregistered / Unconfirmed
GUEST, unregistred user!
关于接口--我百想不得其解    100分相送
unit Unit2;

interface

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

type
ITank = interface
['{819F3D2D-4B86-4333-8BAE-CA538947EF6F}']
procedure Init;
end;

TFrame2 = class(TFrame,ITank)
LabeledEdit1: TLabeledEdit;
private
{ Private declarations }
public
{ Public declarations }
procedure Init;
end;

implementation

{$R *.dfm}
procedure TFrame2.Init;
begin
LabeledEdit1.Text :='test';
end;

end.


//=============================================

unit Unit1;

interface

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

type
TForm1 = class(TForm)
TFrame21: TFrame2;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses ITankData;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var list : TList;
begin
list := TList.create;
list.Add(TFrame21);
Itank(List.Items[0]).init;

end;

end.


在Unit1中Itank(List.Items[0]).init这句无法通过,而用数组却正常。
不知道为何。我用的是delphi7
 
//Itank(List.Items[0]).init;
你这是什么用法呀
 
将Itank(List.Items[0]).init改为
var i:Itank;
begin
i:=TFrame2(List.Items[0]) as Itank;
i.init;
end;
试试看.用数组可以是因为那根本就没有使用接口,而是直接使用对象方法调用,当然不会错!
 
[blue]首先[/blue],这一句能过吗? list.Add(TFrame21);
[blue]其次[/blue],TList没有引用计数,有可能你创建一个接口,放进去,离开创建过程时,那个刚刚放进去的接口就已经被destroy了,[red]对list[0]的访问等同于对nil的访问[/red]。
要把接口放到List里面,请使用TInterfaceList维护引用计数。
 
对于crystal的回答:list.Add(TFrame21);当然能过。Tframe21不是类而是实例。直接从Palette拖下来的。
上面的程序不是原程序,而是为了说明问题,做的简化。
当前窗口没有destroy,TFrame21自然也不会释放。直接放在数组中就可以。

晶晶的方法我也试过。但我的frame不只以个--很多。大家公用一些过程,才用到接口。TFrame2(List.Items[0]) as Itank 这样写太麻烦了。
我改用继承解决了问题。但,我想搞清楚为什么会这样。

谢谢大家
 
奇怪,我怎么可以编译通过?
var list : TList;
begin
list := TList.create;
list.Add(Frame21); //这里添加实例,不是类名
ITank(List.Items[0]).init;//最好改成TFrame21(List.Items[0]).init
List.Free;
end;
 
想用接口来实现多继承?
 
编译可过,执行出错。如果把FList改成array[0..3] of ITankData.那么FList[0]:=Frame21; FList.Init;就完全正确。
 
应改为:
var
list : TinterfaceList;
begin
list := Tinterfacelist.create;
list.Add(ITank(Frame21));
ITank(list.Items[0]).init;
end;
 
接受答案了.
 

Similar threads

I
回复
0
查看
732
import
I
S
回复
0
查看
848
SUNSTONE的Delphi笔记
S
I
回复
0
查看
798
import
I
I
回复
0
查看
475
import
I
后退
顶部