吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 472|回复: 11
收起左侧

[求助] 当选中ListBox1选中索引项时,同步滚动到ListBox2并也选中实现了,但是走几变形啦

[复制链接]
冥界3大法王 发表于 2024-2-28 12:12
本帖最后由 冥界3大法王 于 2024-2-28 12:15 编辑

当选中ListBox1选中索引项时,同步滚动到ListBox2并也选中实现了,但是走几变形啦


无费话,上图,上代码:
image.png
您看,实现是实现了,但内容走几变形,堆叠了,这叫什么玩意。


procedure TForm7.Button1Click(Sender: TObject);
begin
  ListBoxX.Items.LoadFromFile('X:\ListX.txt');
  ListBoxY.Items.LoadFromFile('X:\ListY.txt');
  ListBoxZ.Items.LoadFromFile('X:\ListZ.txt');
end;

procedure TForm7.ListBoxXClick(Sender: TObject);
begin
  if ListBoxX.Selected[ListBoxX.ItemIndex] = True then
  begin
    ListBoxY.Selected[ListBoxX.ItemIndex] := True;
    ListBoxZ.Selected[ListBoxX.ItemIndex] := True;
    ListBoxY.ScrollBy(ListBoxX.ItemIndex, ListBoxX.ItemIndex);   ====》害虫!
    ListBoxZ.ScrollBy(ListBoxX.ItemIndex, ListBoxX.ItemIndex); ====》害虫!
  end;
end;

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 冥界3大法王 发表于 2024-2-28 12:17
本帖最后由 冥界3大法王 于 2024-2-28 12:25 编辑

    ListBoxY.ItemIndex := ListBoxX.ItemIndex;
    ListBoxZ.ItemIndex := ListBoxX.ItemIndex;
最后两行,改成这个就解决了,
但是选中行没有对齐,不能完全满意给好评啊。
image.png
 楼主| 冥界3大法王 发表于 2024-2-28 13:25
找到一个,但是有行代码过不去。说第58行有问题:
[dcc32 Error] Unit7.pas(58): E2003 Undeclared identifier: 'SyncBoxes'

https://www.coder.work/article/7598186
[Delphi] 纯文本查看 复制代码
unit Unit7;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm7 = class(TForm)
    编码转换与快搜: TPanel;
    BZS: TPanel;
    PBZS_db: TPanel;
    ListBoxX: TListBox;
    ListBoxY: TListBox;
    ListBoxZ: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ListBoxXClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private


    { Private declarations }
  public
    SyncBoxes: TArray<TListBox>;
  end;

type
  TListBox = class(Vcl.StdCtrls.TListBox)
  strict private
    procedure Sync;
  protected
    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
    procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
    procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TListBox.CNCommand(var Message: TWMCommand);
begin
  inherited;
  if Message.NotifyCode = LBN_SELCHANGE then
    Sync;
end;

procedure TListBox.Sync;
var
  LB: TListBox;
begin
  for LB in SyncBoxes do
    if LB <> Self then
      LB.TopIndex := Self.TopIndex;
end;

procedure TListBox.WMMouseWheel(var Message: TWMMouseWheel);
begin
  inherited;
  Sync;
end;

procedure TListBox.WMVScroll(var Message: TWMVScroll);
begin
  inherited;
  Sync;
end;

procedure TForm7.FormCreate(Sender: TObject);
begin
  SyncBoxes := [ListBoxX, ListBoxY, ListBoxZ];
end;

procedure TForm7.Button1Click(Sender: TObject);
begin
  ListBoxX.Items.LoadFromFile('X:\0.自创工具for delphi10.4.1\61.Delphi版音速启动\Win32\Release\ListX.txt');
  ListBoxY.Items.LoadFromFile('X:\0.自创工具for delphi10.4.1\61.Delphi版音速启动\Win32\Release\ListY.txt');
  ListBoxZ.Items.LoadFromFile('X:\0.自创工具for delphi10.4.1\61.Delphi版音速启动\Win32\Release\ListZ.txt');
end;

procedure TForm7.ListBoxXClick(Sender: TObject);
begin
//ShowMessage(ListBoxX.Items[ListBoxX.ItemIndex]);
  if ListBoxX.Selected[ListBoxX.ItemIndex] = True then
  begin
//    ListBoxY.ScrollBy(ListBoxX.ItemIndex, ListBoxX.ItemIndex);
//    ListBoxZ.ScrollBy(ListBoxX.ItemIndex, ListBoxX.ItemIndex);

    ListBoxY.Selected[ListBoxX.ItemIndex] := True;
    ListBoxZ.Selected[ListBoxX.ItemIndex] := True;

    ListBoxY.ItemIndex := ListBoxX.ItemIndex;
    ListBoxZ.ItemIndex := ListBoxX.ItemIndex;

    ListBoxX.TopIndex
  end;
end;

end.
DEATHTOUCH 发表于 2024-2-28 13:48
哥们,你这个需求我建议用ListView控件,类似于资源管理器的那个选项。
ViewStyle改成vsreport,Columns设置列,Items.Add添加行,SubItems添加子项目,具体可以上网搜一下。
 楼主| 冥界3大法王 发表于 2024-2-28 14:03
DEATHTOUCH 发表于 2024-2-28 13:48
哥们,你这个需求我建议用ListView控件,类似于资源管理器的那个选项。
ViewStyle改成vsreport,Columns设 ...

@DEATHTOUCH https://www.coder.work/article/7598186
他这个的完整源码长啥样?为啥我的有一行代码报错?
type这种不太会玩,基础还是不到家。
 楼主| 冥界3大法王 发表于 2024-2-28 14:19
本帖最后由 冥界3大法王 于 2024-2-28 14:26 编辑

得了,都他娘的整一个表格的一列算了,反正,只有第一列需要,一个正则就匹配了。
//ShowMessage(ListBoxX.Items[ListBoxX.ItemIndex]);
简单把这个修改下,正则匹配就到手了。
DEATHTOUCH 发表于 2024-2-28 14:25
冥界3大法王 发表于 2024-2-28 14:03
@DEATHTOUCH https://www.coder.work/article/7598186
他这个的完整源码长啥样?为啥我的有一行代码报错 ...

报错是因为人家的代码是Form1.SyncBoxes,你直接用了SyncBoxes,当然没有了,不过那种写法也不好,依赖了全局变量。
 楼主| 冥界3大法王 发表于 2024-2-28 14:27
DEATHTOUCH 发表于 2024-2-28 14:25
报错是因为人家的代码是Form1.SyncBoxes,你直接用了SyncBoxes,当然没有了,不过那种写法也不好,依赖了 ...

改成Form7还是错啊。
能不把表演下他这个完整的代码该长啥样?
哥们!
DEATHTOUCH 发表于 2024-2-28 14:36
冥界3大法王 发表于 2024-2-28 14:27
改成Form7还是错啊。
能不把表演下他这个完整的代码该长啥样?
哥们!

我觉得还是用ListView好,给你一个示例吧:
记得拖一个ListView进去啊。

[Delphi] 纯文本查看 复制代码
procedure TForm1.FormCreate(Sender:TObject);
var
  i:Integer;
begin
  ListView1.ViewStyle:=vsReport;
  ListView1.RowSelect:=True;
  with ListView1.Columns.Add do
  begin
    Caption:='文件名';
    Width:=100;
  end;
  with ListView1.Columns.Add do
  begin
    Caption:='时间';
    Width:=200;
  end;
  with ListView1.Columns.Add do
  begin
    Caption:='大小';
    Width:=80;
  end;
  for i:=0 to 99 do
  begin
    with ListView1.Items.Add do
    begin
      Caption:='文件'+IntToStr(i);
      SubItems.Add(TimeToStr(Now));
      SubItems.Add(IntToStr(i+100)+'K');
    end;
  end;
end;     

免费评分

参与人数 1吾爱币 +3 收起 理由
冥界3大法王 + 3 谢谢@Thanks!

查看全部评分

lies2014 发表于 2024-2-28 17:57
对齐很简单啊,发个消息就可以了,先声明一个整数 inx
最后加上下面语句就对齐了:
[Delphi] 纯文本查看 复制代码
inx := SendMessage(ListBoxX.Handle, LB_GETTOPINDEX, 0,0);
SendMessage(ListBoxY.Handle, LB_SETTOPINDEX, inx, 0);
SendMessage(ListBoxZ.Handle, LB_SETTOPINDEX, inx, 0);

免费评分

参与人数 1吾爱币 +3 收起 理由
冥界3大法王 + 3 版本1号完美了!再弄个哥们你的方案二号全当学习了。

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表