На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Работа с ListView , Требуется запомнить позиции скроллбаров, а после обновления вернуть им те же значения.
    Здравствуйте. Я периодически (по таймеру) заполняю ListView, но есть одна маленькая проблема: после обновления списка он автоматически пролистывается на начало, что делает работу с прогой затруднительной. Хотелось бы, чтобы после обновления список проскролливался на то положение, какое было до обновления.

    Яркий пример - диспетчер задач, taskmgr.exe. Там скроллбары ListView неподвижны. Я наконпелял код, но он не совсем корректно работает. Прошу помочь поправить.

    Есть код:

    ExpandedWrap disabled
      unit Unit1;
       
      interface
       
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls, ComCtrls, commctrl, ExtCtrls;
       
      type
        TForm1 = class(TForm)
          ListVw: TListView;
          LstRefillBtn: TButton;
          CheckBox1: TCheckBox;
          Timer1: TTimer;
          procedure LstRefillBtnClick(Sender: TObject);
          procedure FormCreate(Sender: TObject);
          procedure CheckBox1Click(Sender: TObject);
          procedure Timer1Timer(Sender: TObject);
        private
          { Private declarations }
        public
          { Public declarations }
        end;
       
      var
        Form1: TForm1;
       
      implementation
       
      {$R *.dfm}
       
      procedure TForm1.CheckBox1Click(Sender: TObject);
      begin
        Timer1.Enabled:=TCheckBox(Sender).Checked;
      end;
       
      procedure TForm1.FormCreate(Sender: TObject);
      begin
        listvw.HandleNeeded;
      end;
       
      procedure TForm1.LstRefillBtnClick(Sender: TObject);
      var
        lst:tlistitem;
        i,idx:integer;
        appn,s:string;
        fpos,hpos:integer;
        sc:tscrollinfo;
      begin
        s:='';
        idx:=-1;
        sc.cbSize:=sizeof(tscrollinfo);
        sc.fMask:=SIF_ALL;
        GetScrollInfo(Listvw.Handle, sb_horz, sc);
        hpos:=sc.nTrackPos;
        fpos:=ListVw.Perform(LVM_GETTOPINDEX, 0, 0);
       
       
        // запоминаем заголовок выделенного элемента, чтобы после обновления вернуть ему фокус
        lst:=listvw.Selected;
        if assigned(lst) then
        begin
          idx:=lst.Index;
          s:=lst.Caption;
        end;
        //
       
        listvw.Items.BeginUpdate;
        try
          listvw.Clear;
          for i:=0 to 19 do
          begin
            lst:=ListVw.Items.Add;
            appn:=format('%s (%d)',[application.ExeName, i]);   // для простоты. не обращайте внимания на этот бред.
            lst.Caption:=appn;
            lst.SubItems.Add(inttostr(i));
            lst.SubItems.Add(inttostr(GetTickCount));
       
            // если заголовок совпадает, запоминаем его индекс.
            if (s <> '') and (appn=s) then
            idx:=lst.Index;
          end;
        finally
          // возвращаем выделение, если заголовок элемента совпал.
          if idx >=0 then
          ListVw.Items[idx].Selected:=true;
       
       
          //[ прокрутка правого скроллбара, работает без нареканий.
          Listview_ensurevisible(ListVw.Handle, listVw.Items.Count - 1, True);
          Listview_ensurevisible(ListVw.Handle,fpos,true);
          ListVw.Items.EndUpdate;
          //]
       
        { прокрутка нижнего скроллбара. Необходима только в XP. На Win 7 вызывает самовольное смещение скроллбара.
         Вопрос в том, как сделать код совместимым с обоими платформами (XP и 7)
         На Win 7 нет необходимости запоминать позицию нижнего скроллбара, т.к. он не смещается при обновлении. }
       
         ListVw.Scroll(hpos,0);
       
       
        end;
      end;
       
      procedure TForm1.Timer1Timer(Sender: TObject);
      begin
        LstRefillBtn.click;
      end;
       
      end.
    Сообщение отредактировано: AllFree -
      Я давно делал так: запоминал текущую позицию и после добвления строк возвращался к ней
        можно сделать
        ExpandedWrap disabled
          if idx >=0 then
          begin
            ListVw.Items[idx].Selected:=true;
            ListVw.Items[idx].Focused:=true;
            ListVw.Items[idx].MakeVisible(false);
          end;

        не то что бы скроллы будут неподвижными, но интересующий элемент будет виден после обновления списка
          Товарищи, речь идёт именно о горизонтальной автопрокрутке, интересует нижний скроллбар. Нужно сделать механизм прокрутки совместимым с семеркой и XP.
          Сообщение отредактировано: AllFree -
            Если затык только в том, чтобы поддерживать обе версии винды, то что мешает определить ее версию и выполнять прокрутку только тогда, когда нужно?
              Решение найдено, можно закрывать тему.
                закрыть ты её сам можешь :D
                решил поделись с народом :)
                  Цитата Cfon @
                  решил поделись с народом :)


                  Народ сам догадается ;)
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0367 ]   [ 16 queries used ]   [ Generated: 3.05.24, 18:54 GMT ]