高分请教简单问题!TList,TStrings,TStringList,TDBGrid的使用问题(300分)

  • 主题发起人 主题发起人 wzsaibo
  • 开始时间 开始时间
W

wzsaibo

Unregistered / Unconfirmed
GUEST, unregistred user!
①TList,TStrings,TStringList有何区别,有什么联系?
②TStringList用到了一个记录
TStringItem = Record
FString: string;
FObject:TObject;
end;
FObject:TObjec是什么意思,有何作用?
如我用TStringList处理的不仅是string,还有Integer,Char,Boolean 该怎么办?
如:TMyStringList.Add(S:String;I:ingeger;C:Char);
或 TMySTringItem = Record
FString:string;
I:integer;
C:Char;
end;
TMyStringLIst.Add(MyItem:TMyStringItem)如何实现?
③TDBGrid显示的结果用户可以调节列的次序和列宽,我怎么保存用户的设置
让用户下次看到的是他调整后的样子?

我是一个初学者,您回答越详细越深刻,我当然多学点知识,呵呵...
 
1.tlist是可以包含任何对象指针的数组,tstrings是包含string类型的对象数组,
tstringlist是tstrings的子类,可以对存储其中的对象排序等
2.fobject说明tstringlist可以存储对象
 
一句两局说不清楚,都是分别是一种数据结构.
你都当作ListBox用就行了,都差不多的.
第三个问题我拿手,你用TIniFile把信息保存起来就行了,
下次启动读出来.具体操作看帮助,很详细.
 
第1格问题说起来麻烦些。看DELPHI的源码吧. 在classes.pas里
第2格问题可以用 TStrings.Addobject
具体实现看 delphi的帮助 Addobject 有两个例子, 其中一个是在 TCombobox中添加
对象
第3格问题 DBGrid实现起来比较难。 因为DBGRID无法保存当前排序和列宽
代码实现的话要保存到注册表或INI都需要代码量支出。
建议你用 DEV Express 的 Quantam dxDbGrid
这个DXDBGRID 是支持你这么作的。 可以将当前显示列序和列宽保存起来
 
to:weekboy
你能不能在说详细点,TList好理解,Tstrings和Tstringlist我就有些搞不懂了,什么时侯
用Tstrings什么时侯用Tstringlist?
to:bubble
用TIniFile实现一种的结果较容易,有多个不同的查询结果呢?你用过《绍林文档》吗,它把
每个表的显示属性放到一个文件中,可我实现起来总不满意,把你代码贴出来,我学习学习。
to:王大侠
代码我都打印出来了,不懂的地方太多了,所以才问呢。

顺便问一下,能把你们编程的经验让我们后生学学,我也少走一些弯路?:)
 
var mystrs:tstrings;
mystrlist:tstringlist;
mystr:string;
index:integer;
begin
//下面2者无区别
mystrlist:=tstringlist.Create;
mystrs:=tstringlist.Create;
mystrs.clear;
mystr:='mystr';
mystrs.Add(mystr);
mystrlist.add(mystr);
mystrlist.AddStrings(mystrs); //可以
mystrs.AddStrings(mystrlist); //可以
//下面就不同了
//在mystrlist寻找'mystr',返回匹配的索引值 ,tstrings没有
mystrlist.Find('mystr',index);
mystrlist.Sort;//tstringlist 有 ,tstrings没有
showmessage(inttostr(index));
mystrs.free;
mystrlist.Free;
end;
 
TO:王寒松
TStrings.Addobject 我试了,好象不行,不能是变量、Record。请指教。


 
var
sl:Tstrings;
AJpegs: TJpegImage;
begin
sl:=tstringlist.Create;
result:=sl;
with Aqdtid do
begin
close;
sql.Clear;
sql.Add('select id,dt from Pic where Brid=:brid and order by dyh');
Parameters.ParamByName('brid').value:=brid;
prepared;
open;
first;
while not EOF do
begin
AJpegs:=TJpegImage.Create;
AJpegs.LoadFromStream (TADOBlobStream.Create(TBlobField(Aqdtid.FieldByName('Dt')), bmRead));
sl.AddObject(fieldbyname('id').asstring,AJpegs);
next;
end;
看看我做的测试, sl.AddObject是可以的啊
 
3.建议你使用QuantumGrid中的DXDBGrid来显示数据,就行了。
这个控件功能极强。
202.117.210.31注册就可以下了。
 
PMyStringItem = ^TMyStringItem;
TMySTringItem = Record
FString:string;
I:integer;
C:Char;
end;

var AStrings : TStrings;
procedure AddAObjectToStrings;
var PItem : PMyStringItem;
begin
New(PItem);
PItem^.FString := 'aaa';
PItem^.i := 100;
PItem^.C := 'A';
AStrings.AddObject('bbb', TObject(PItem));
end;

 
第三个问题:
DBGrid.columns.SavetoFiel(.......);
DBGrid.columns.LoadFromFile(........);
 
①TList,TStrings,TStringList有何区别,有什么联系?
1、TList直接继承自TObject,帮助上说得很清楚:
TList, which stores an array of pointers, is often used to maintain lists of objects.
TList introduces properties and methods to

Add or delete the objects in the list.
Rearrange the objects in the list.
Locate and access objects in the list.
Sort the objects in the list.
比如说,你可以用TList实现控件数组,相当灵活。
2、TStrings
Derive a class from TStrings to store and manipulate a list of strings. TStrings contains
abstract methods and should not be directly instantiated.
继承自TStrings的类是用来保存和维护一组字符串列表的,TStrings包含抽象的方法,所以不不能直接实例化。
就是说在程序里这样做是没有意义的。var ssHandle:TStrings
ssHandle = TStrings.Create;
3、TStringList继承自TStrings,
TStringList implements the abstract properties and methods introduced by TStrings, and introduces new properties, events, and methods
TStringList实现了TStrings引入的抽象的属性和方法,并且引入了新的属性事件和方法。
②TStringList用到了一个记录……
王大侠已经回答的很清楚了,只是用New(PItem)时注意要Dispose,否则会出现内存泄漏。

③TDBGrid显示的结果用户可以调节列的次序和列宽,我怎么保存用户的设置
没用过,不知道,不过wk_knife的方法应该可行,下面是VCL中DBGrid.columns.SavetoFiel(.......)方法的实
现细节:
procedure TDBGridColumns.SaveToStream(S: TStream);
var
Wrapper: TColumnsWrapper;
begin
Wrapper := TColumnsWrapper.Create(nil);
try
Wrapper.Columns := Self;
S.WriteComponent(Wrapper);
finally
Wrapper.Free;
end;
end;
 
灌水的没分
 
to Sindbad
怎么用TList实现控件数组呢?
望指教!谢谢
 
多人接受答案了。
 
后退
顶部