Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2011, 22:07   #1
bro
Пользователь
 
Аватар для bro
 
Регистрация: 02.12.2010
Сообщений: 29
По умолчанию ListView - не перескакивать обратно на выделенный элемент

Здравствуйте. Помогите, пожалуйста, с проблемой:
Использую ListView (вообще JvListView, но не важно) в виртуальном режиме. Итемов около 700, есть вертикальный скролл. Если выделить какую-либо строчку, а потом прокрутить ListView так, чтобы выделенную строчку не было видно, то скролл самопроизвольно возвращается обратно (о_О) при изменении количества итемов.
Как этого избежать?

Последний раз редактировалось bro; 27.04.2011 в 03:27.
bro вне форума Ответить с цитированием
Старый 27.04.2011, 03:29   #2
bro
Пользователь
 
Аватар для bro
 
Регистрация: 02.12.2010
Сообщений: 29
По умолчанию

Воспроизвёл проблему:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure ListView1Data(Sender: TObject; Item: TListItem);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
  Item.Caption := IntToStr(Item.Index);
  Item.SubItems.Add(IntToStr(Sqr(Item.Index)));
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  ListView1.Items.Count := ListView1.Items.Count + 1;
  Timer1.Enabled := true;
end;

end.
Количество элементов увеличивается по таймеру, и всякий раз скролл "убегает" к выделенному итему.
bro вне форума Ответить с цитированием
Старый 27.04.2011, 15:43   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

установи Itemindex на последний добавленый итем, а если он особо нужен, то запоминай, при отпускании мышки - возвращай
phomm вне форума Ответить с цитированием
Старый 27.04.2011, 16:28   #4
bro
Пользователь
 
Аватар для bro
 
Регистрация: 02.12.2010
Сообщений: 29
По умолчанию

phomm, не понял твою мысль.
Мне нужно избежать автоматического "MakeVisible" для выделенного элемента. То есть, скролл должен в любой ситуации остаться на своём месте. (именно там, куда прокрутил его юзер, а не в конце списка и не на выделенном итеме)
bro вне форума Ответить с цитированием
Старый 28.04.2011, 18:58   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от bro Посмотреть сообщение
скролл самопроизвольно возвращается обратно НА ТОТ ЭЛЕМЕНТ, НА КОТОРЫЙ ССЫЛАЕТСЯ ITEMINDEX (о_О) при изменении количества итемов.
Как этого избежать?
вот и установите при изменении количества итемов этот ITEMINDEX на последный добавленный, ну или , по идее, на тот , который в свойстве Topindex (не помню, есть ли такое у Листвью, но у листбокса точно есть)

УПД, нашёл - TopItem, соответственно , при изменении числа - Listview.ItemIndex := Listview.Topitem; но конечно выделнный элемент при этом терятся, можно его перед изменением запомнить, а потом восстановить, по идее, даже в той же процедуре возможно

Последний раз редактировалось phomm; 28.04.2011 в 19:40.
phomm вне форума Ответить с цитированием
Старый 29.04.2011, 09:07   #6
bro
Пользователь
 
Аватар для bro
 
Регистрация: 02.12.2010
Сообщений: 29
По умолчанию

phomm, дело в том, что обновление ListView происходит раз в секунду, и выделение не может постоянно скакать...
Попробовал сделать по-твоему - Stack Owerflow в чём причина?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure ListView1Data(Sender: TObject; Item: TListItem);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
var
  SelectedIndex: integer;
begin
  SelectedIndex := ListView1.ItemIndex; // запоминаем текущее выделение
  ListView1.ItemIndex := ListView1.Topitem.Index; // выделяем верхний видимый итем
  { заполнение }
  Item.Caption := IntToStr(Item.Index);
  Item.SubItems.Add(IntToStr(Sqr(Item.Index)));
  //
  ListView1.ItemIndex := SelectedIndex; // возвращаем выделение назад
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  ListView1.Items.Count := ListView1.Items.Count + 1;
  Timer1.Enabled := true;
end;

end.
Вложения
Тип файла: zip ListViewProblem.zip (87.9 Кб, 12 просмотров)

Последний раз редактировалось bro; 29.04.2011 в 09:29.
bro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перетащить элемент ListView в другой ListView? Paul Hindenburg Компоненты Delphi 5 26.01.2013 11:35
ListView получить выделенный Item Casper-SC Общие вопросы .NET 8 26.02.2010 21:41
Выделенный элемент у Dropdown motorway Microsoft Office Excel 2 10.07.2009 22:27
Как в ListView показать выделенный элемент? Stilet Компоненты Delphi 2 02.07.2009 12:21
как перевести из integer в real(и обратно), и из real в string(и обратно) Ga-sergey Общие вопросы Delphi 2 08.06.2007 21:13