array[0..9] of TStrings 行不?
解决方案 »
- 如何解决数据库操作的COM出现com surrogate错误C0000005,导致假死
- 欢迎加入 DELPHI游戏外挂讨论群,号码:26429926
- 寻求DELPHI交流与学习的朋友,老师。
- 100分太少了,请教一个SQL语句的问题。
- 有关treeview控件 找出上一节点的内容,请高手们给解决,本人急。
- 我是Delphi新手,以前用VB的,现在必须用Delphi,请大家帮忙。几个简单的问题。
- 为什么我的过程在运行到exit的时候出错
- 怎么样来控制声道,如左声道,右声道,立体声?
- 我的水平只够提问!!!
- 求教 ,inno安装制作,百度搜霸插件 支付宝打盒烟感谢
- 谁能帮我解释一下 com、类工厂、接口的概念,区别(分不多,别见怪)
- 为什么我看不到屏幕的变化
TStrArray:array[0..x] of string
var
strarray:Tstrarray;
i:array[0..10] of String
begin
i[0]...
i[1]...
...
end;
str:tlist;TLIST类很灵活的
我要的是TStringList的array
你可以把指向TStrings的指针保存到TList中去
//你可以把指向TStrings的指针保存到TList中去您说的应该怎么做
//你可以把指向TStrings的指针保存到TList中去您说的应该怎么做
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FList: TList;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationtype
PString = ^TStringlist;{$R *.dfm}//建立TList of TStringList,TStringList内容可自行增删
//这里我偷懒只增加了一个内容
procedure TForm1.Button1Click(Sender: TObject);
var
ApString: PString;
I: Integer;
begin
FList := TList.Create;
FList.Capacity := 3;
for I := 0 to 2 do
begin
New(ApString);
ApString^ := TStringlist.Create;
ApString^.Add(IntToStr(I)); //?1
FList.Add(ApString);
end;
end;//为验证建立TList of TStringList是否成功
//若TStringList的Item不止一项,须作相应改变
procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
Memo1.Lines.Clear;
for I := 0 to 2 do
begin
Memo1.Lines.Add(PString(FList.Items[I]).Strings[0]);
end;
end;procedure TForm1.FormDestroy(Sender: TObject);
var
I: Integer;
ApString: PString;
begin
for I := 0 to 2 do
begin
ApString := FList.Items[I];
ApString^.Free; //?2
Dispose(ApString); //?3
end;
FList.Free;
end;end.疑问:
?1:
此处若该为ApString.Add(IntToStr(I)),则程序仍正常,谁能给个解释?
?2:
同样,此处换成ApString.Free也没用任何问题。?3:
New 和Dispose在这里还是必需的吗?请指点,谢谢。
1,2:可能Delphi最终还是为指针类型,不太清楚,请高人指教
3.New 和Dispose不一定必需吧,
我想只要可以分配内在的函数就行,
其中,FList.Add(TStringList.Create)我是这样理解的:因为TStringList.Create返回的是指向类
TStringList的指针,所以正好符合TList的要求,故可直接添加,而无须类TStringList的实例了。
有何偏颇还请高人指点,谢谢。unit New;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
btnAdd: TButton;
btnShow: TButton;
procedure btnAddClick(Sender: TObject);
procedure btnShowClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FList: TList;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btnAddClick(Sender: TObject);
var
I: Integer;
begin
FList := TList.Create;
for I := 0 to 2 do
begin
FList.Add(TStringList.Create);
//用于观察每次TStringList创建的地址是否相同
Memo1.Lines.Add(IntToStr(Integer(FList.Items[I])));
(TObject(FList.Items[I]) as TStringList).Add(IntToStr(I)); //注释1
end;
end;procedure TForm1.btnShowClick(Sender: TObject);
var
I: Integer;
begin
Memo1.Clear;
for I := 0 to 2 do
Memo1.Lines.Add((TObject(FList.Items[I]) as TStringList).Strings[0]);
end;procedure TForm1.FormDestroy(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 2 do TObject(FList.Items[I]).Free;
FList.Free;
end;end.//注释1
在进行TStringList的typecast以前,必须先对pointer类型的Items[I] 进行TObject的hard-cast,也不能直接用TStringList进行hard-cast。
至于为什么,我也不知道,请不吝赐教。
var
I: Integer;
objTmp :TStringList;
begin
FList := TList.Create;
for I := 0 to 2 do
begin
objTmp := TStringList.Create;
FList.Add(objTmp);
//用于观察每次TStringList创建的地址是否相同
Memo1.Lines.Add(IntToStr(Integer(objTmp)));
//objTmp.Add(IntToStr(i)); //
TStringList(FList.Items[i]).Add(IntToStr(I)); //注释1
end;
end;procedure TForm1.btnShowClick(Sender: TObject);
var
I: Integer;
begin
Memo1.Clear;
for I := 0 to 2 do
Memo1.Lines.Add(TStringList(FList.Items[I]).{Text}Strings[0]);
end;procedure TForm1.FormDestroy(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 2 do TObject(FList.Items[I]).Free;
FList.Free;
end;end.