在我的应用中,我在主tc_main
上有TTabControl
个{4}个标签,vt_main
为TVirtualStringTree
。取决于所选的标签vt_main
可能内部有不同的标题和数据。对于每个选项卡,我定义了一个不同的数据处理程序。
Tvt_main = record
column: array of String;
end;
Pvt_tab_equip = ^Tvt_main;
Pvt_tab_insp = ^Tvt_main;
Pvt_tab_certif = ^Tvt_main;
Pvt_tab_doc = ^Tvt_main;
const
sz_vt_main = SizeOf(Tvt_main);
现在的问题是如何通过维护来自处理程序的数据来切换选项卡并刷新vt_main
视图,而无需从sql重新加载数据。
在我尝试更新标头配置的这一刻,我获得了访问冲突。
我会放一些代码。我希望你明白这一点。
procedure Tform_main.tc_mainChange(Sender: TObject);
begin
//draw/redraw `vt_main header` each time TabIndex is changed.
draw_vt_main_header;
//if content not loaded, then load data from sql.
if not vt_loaded[tc_main.TabIndex] then draw_vt_main;
//search for some text
search;
end;
这里是draw / redraw VT头程序
procedure Tform_main.draw_vt_main_header;
var
tab_index, i: Word;
begin
tab_index:= tc_main.TabIndex;
vt_main.Header.SortColumn:= -1;
vt_main.Header.Columns.Clear;
if Length(vt_header[tab_index].column) > 0 then
for i := 0 to High(vt_header[tab_index].column) do
if vt_header[tab_index].column[i].position >= 0 then
with vt_main.Header.Columns.Add do
begin
Text:= vt_header[tab_index].column[i].caption;
Width:= vt_header[tab_index].column[i].width;
Position:= vt_header[tab_index].column[i].position;
if vt_header[tab_index].column[i].visible then
Options:= Options + [coVisible]
else
Options:= Options - [coVisible];
CaptionAlignment:= taCenter;
Alignment:= vt_header[tab_index].column[i].alignement;
end;
end;