Конференция "Базы" » Как "заморозить" окно TDBGrid?
 
  • vlad2 (03.02.14 18:59) [0]
    Перемещаюсь по записям таблицы (SQL) в цикле по SelectedRows.
    Как сделать так, чтобы эти перемещения визуально не отражались в окне грида?
    В гриде я ручками отмечаю нужные мне записи, закладки которых попадают в список SelectedRows. Двигаясь по этому списку, я двигаюсь по закладкам, и вполне логично, что по закладке курсор становится на соответствующую строку в гриде. Проблема в том, чтобы "нарушить" эту логику - чтобы курсор не скакал по строкам грида.

    Попутно возникли такие вопросы:
    1. как отследить отметку каждой строки и найти соответствующую запись таблицы?
    2. как понять отмечена выбранная строка, или наоборот с неё снята отметка?

    Спасибо.
  • Ega23 © (03.02.14 19:08) [1]
    DataSet.DisableControls;
    try
     // Перемещаюсь по записям таблицы (SQL) в цикле по SelectedRows.
    finally
     DataSet.EnableControls;
    end;

  • vlad2 (03.02.14 20:14) [2]
    Да, спасибо, Ega23.
    Если сюда ещё добавить GetBookmark/GotoBookmark, то грид будет дёргаться только в пределах текущих строк. А хотелось бы, чтобы совсем не дёргался.
  • Inovet © (03.02.14 20:17) [3]
    > [2] vlad2   (03.02.14 20:14)

    Это с чего он будет дёргаться?
  • vlad2 (03.02.14 20:28) [4]
    Дёргаться (не всегда, но часто) будет потому, что когда после GotoBookmark курсор встанет на нужную строку грида, то она будет посредине окна грида, это можно легко проверить. Поэтому грид не дёрнется, только если изначально текущая строка была посередине окна грида.
  • Inovet © (03.02.14 22:13) [5]
    > [4] vlad2   (03.02.14 20:28)

    До или после EnableControls?
  • vlad2 (04.02.14 10:15) [6]
    > [5] Inovet © (03.02.14 22:13)

    После GotoBookmark, независимо от EnableControls.
  • Ega23 © (04.02.14 10:26) [7]

    > Дёргаться (не всегда, но часто) будет потому, что когда
    > после GotoBookmark курсор встанет на нужную строку грида,
    >  то она будет посредине окна грида, это можно легко проверить.
    >  Поэтому грид не дёрнется, только если изначально текущая
    > строка была посередине окна грида.


    Да, это так.
  • sniknik © (04.02.14 12:45) [8]
    не знаю, не рушился бы такое использовать в рабочей проге, но как "разминка для мозгов" -
    type
     TMyDBGrid = class(TDBGrid);

    procedure TForm1.Button1Click(Sender: TObject);
    var
     n, ActiveRecord: integer;
     BkMark: TBookmark;
    begin
     Screen.Cursor:= crHourGlass;
     try
       with ADODataSet1 do begin
         DisableControls;
         try
           BkMark:= GetBookmark;
           ActiveRecord:= TMyDBGrid(DBGrid1).DataLink.ActiveRecord;
           try
             First;
             //Last;

             GotoBookmark(BkMark);
             n:= TMyDBGrid(DBGrid1).DataLink.ActiveRecord - ActiveRecord;

             if n < 0 then begin
               TMyDBGrid(DBGrid1).DataLink.ActiveRecord:= 0;
               MoveBy(n);
               TMyDBGrid(DBGrid1).DataLink.ActiveRecord:= ActiveRecord;
             end else
               if n > 0 then begin
                 TMyDBGrid(DBGrid1).DataLink.ActiveRecord:= TMyDBGrid(DBGrid1).DataLink.BufferCount;
                 MoveBy(n);
                 TMyDBGrid(DBGrid1).DataLink.ActiveRecord:= ActiveRecord;
               end;
           finally
             FreeBookmark(BkMark);
           end;
         finally
           EnableControls;
         end;
       end;
     finally
       Screen.Cursor:= crDefault;
     end;
    end;


    возможно даже будет работать... :).
  • Ega23 © (04.02.14 13:32) [9]

    > возможно даже будет работать... :).


    У DataSet нет отдельного сообщения на EnableConrols, там ЕМНИП стандартный OnDataChange валится.
    А значт, что в общем виде ни букмарки, ни всякие даталинки использовать не выйдет, бо нет никакой гарантии, что там всё не позакрывалось и не открылось заново.
  • sniknik © (04.02.14 14:06) [10]
    > что там всё не позакрывалось и не открылось заново.
    в таком случае и для
    > Перемещаюсь по записям таблицы (SQL) в цикле по SelectedRows.
    нет гарантий, т.что все нормально будет.
    с букмарками работает, проверил -
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i, n, ActiveRecord, sum: integer;
     BkMark: TBookmark;
    begin
     Screen.Cursor:= crHourGlass;
     try
       with ADODataSet1 do begin
         DisableControls;
         try
           BkMark:= GetBookmark;
           ActiveRecord:= TMyDBGrid(DBGrid1).DataLink.ActiveRecord;
           try
             //First;
             //Last;
             sum:= 0;
             for i:= 0 to DBGrid1.SelectedRows.Count - 1 do begin
               GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i]));
               sum:= sum + FieldByName('ID').AsInteger;
             end;
             Edit1.Text:= IntToStr(sum);

             GotoBookmark(BkMark);
             n:= TMyDBGrid(DBGrid1).DataLink.ActiveRecord - ActiveRecord;

             if n <> 0 then begin
               if n < 0
                 then TMyDBGrid(DBGrid1).DataLink.ActiveRecord:= 0
                 else TMyDBGrid(DBGrid1).DataLink.ActiveRecord:= TMyDBGrid(DBGrid1).DataLink.BufferCount;
               MoveBy(n);
               TMyDBGrid(DBGrid1).DataLink.ActiveRecord:= ActiveRecord;
             end;
           finally
             FreeBookmark(BkMark);
           end;
         finally
           EnableControls;
         end;
       end;
     finally
       Screen.Cursor:= crDefault;
     end;
    end;



    и кстати оставшийся вопрос
    > 2. как понять отмечена выбранная строка, или наоборот с неё снята отметка?
    SelectedRows.CurrentRowSelected
  • Ega23 © (04.02.14 14:35) [11]

    > нет гарантий, т.что все нормально будет.


    Нет. В смысле - гарантий нет.
    Ну можно суррогатный ключ и Locate по нему, например.
  • vlad2 (04.02.14 14:39) [12]
    Спасибо, sniknik, вроде, работает.
    Самое смешное, что DataLink.ActiveRecord уже использовал (писал свой грид), но для других целей, давно и напрочь забыл об этом.

    А насчёт SelectedRows.CurrentRowSelected я имел в виду другое: при навигации по гриду ручками не могу отследить селект/деселест. Но это теперь и не требуется.
    Спасибо.
  • Дмитрий (11.04.14 17:12) [13]
    Отключите грид от датасета.
  • sniknik © (11.04.14 17:29) [14]
    Дмитрий   (11.04.14 17:12) [13]
    > Отключите грид от датасета.
    поменяйте ник на НекроЛамер... и ник прикольный, и будет сути соответствовать. второй раз подряд после решения ерунду советуешь.
  • junglecat (11.04.14 17:54) [15]
    > после решения ерунду советуешь

    ну раз уж решили, то почему бы не тряхнуть ерундой...
 
Конференция "Базы" » Как "заморозить" окно TDBGrid?
Есть новые Нет новых   [118580   +29][b:0][p:0.003]