如何修改ShellCtrls.pas使ListView默认仅创建1列?
修改ShellCtrls.pas让ListView默认仅显示名称列
不要用事后删除列的方式,应该从列创建的源头控制,直接只添加名称列,具体步骤如下:
核心修改思路
TCustomSystemListView的列是通过EnumColumns方法调用Shell API枚举系统默认文件夹列后逐个创建的。我们只需要在枚举过程中,仅保留名称列(对应Shell列标识符PID_NAME,常量值为$00000000),跳过其他列的创建。
具体代码修改
找到TCustomSystmListView.EnumColumns方法中循环添加列的代码段,替换为以下逻辑:
var ColumnInfo: SHCOLUMNINFO; i: Integer; Column: TListColumn; begin // 清空现有列(原方法已有此步骤) Columns.Clear; i := 0; // 枚举Shell列信息 while SHGetColumnInfo(Folder, i, SHCIF_ALL, ColumnInfo) do begin // 仅保留名称列 if ColumnInfo.scid.pid = PID_NAME then begin Column := Columns.Add; Column.Caption := ColumnInfo.szTitle; Column.Width := ColumnInfo.cxDefault; // 可根据需求设置其他列属性,比如Alignment等 end; Inc(i); end; // 原方法的其他逻辑(如设置默认视图等)保留 end;
说明
- 该修改适用于Delphi 7和Delphi 10.4,二者
ShellCtrls.pas中EnumColumns的核心枚举逻辑一致,仅细节略有差异。 - 相比你现在在
finally段删除列的方式,这种从源头控制的方法不会出现列创建后再删除的闪烁问题,也更符合组件的设计逻辑。 - 如果需要默认视图为大图标/列表模式而非详细信息,可以额外修改组件的
ViewStyle属性默认值(比如在TCustomSystemListView的构造方法中设置ViewStyle := vsList或vsIcon)。
内容的提问来源于stack exchange,提问作者NettixCode
相关产品推荐
相关产品推荐

