书签(Bookmark)在对数据集操作中经常会用到。在Delphi7下, 书签的类型是指针,可以通过TStrings 的AddObject方法与数据集的记录想关联。因此,TListBox或TComboBox 要与数据集的记录关联,都采用了这种方法。但在DelphiXE 下,书签的类型是数组了,就不能使用AddObject方法将TListBox或TComboBox与数据集想关联,主要是在DelphiXE下采用新的关联方式。但采用新的方法,修改原有的程序工作量还是很大的,也影响程序的稳定性。为此,采用以下方法只要适当修改原有程序,就能在DelphiXE正常运行。
假如有个窗体上有控件ListBox1和数据集Dataset1,Dataset1中有字段“Name", 要显示在ListBox1 中,并且每条记录与ListBox1的Item相关联。原来在Delphi7 下,是这样设计的:
ListBox1.Items.BeginUpdate ;
ListBox1.Items.Clear ;
With Dataset1 do
begin
First ;
while not Eof do
begin
ListBox1.Items.AddObject(FieldByName('Name').AsString, GetBookMar()) ;
Next ;
end;
end;
ListBox1.Items.EndUpdate ;
当选中ListBox1中某条项目后,需要指向Datset1的相关联记录,需要这要操作:
Dataset1.GotoBoomark(ListBox1.Items.Objects[ListBox1.ItemIndex]) ;
但在DelphiXE 下,这种方法就行不通了,关联部分需要作以下调整:
Var
p: ^TBookmark ;
begin
ListBox1.Items.BeginUpdate ;
ListBox1.Items.Clear ;
With Dataset1 do
begin
First ;
while not Eof do
begin
New(p) ;
p^ := GetBookMark() ;
ListBox1.Items.AddObject(FieldByName('Name').AsString, TObject(p)) ;
Next ;
end;
end;
ListBox1.Items.EndUpdate ;
end;
当选中ListBox1中某条项目后,需要指向Datset1的相关联记录,作以下调整:
Var
p: ^TBookmark ;
i: Integer ;
begin
p := Pointer(ListBox1.Items.Objects[ListBox1.ItemIndex]) ;
Dataset1.GotoBookmark(p^);
For i := 0 to ListBox1.Items.Count - 1 do dispose(Pointer(ListBox1.Items.Objects[i])) ;
end;