-
Перемещаюсь по записям таблицы (SQL) в цикле по SelectedRows. Как сделать так, чтобы эти перемещения визуально не отражались в окне грида? В гриде я ручками отмечаю нужные мне записи, закладки которых попадают в список SelectedRows. Двигаясь по этому списку, я двигаюсь по закладкам, и вполне логично, что по закладке курсор становится на соответствующую строку в гриде. Проблема в том, чтобы "нарушить" эту логику - чтобы курсор не скакал по строкам грида.
Попутно возникли такие вопросы: 1. как отследить отметку каждой строки и найти соответствующую запись таблицы? 2. как понять отмечена выбранная строка, или наоборот с неё снята отметка?
Спасибо.
-
DataSet.DisableControls;
try
finally
DataSet.EnableControls;
end;
-
Да, спасибо, Ega23. Если сюда ещё добавить GetBookmark/GotoBookmark, то грид будет дёргаться только в пределах текущих строк. А хотелось бы, чтобы совсем не дёргался.
-
> [2] vlad2 (03.02.14 20:14)
Это с чего он будет дёргаться?
-
Дёргаться (не всегда, но часто) будет потому, что когда после GotoBookmark курсор встанет на нужную строку грида, то она будет посредине окна грида, это можно легко проверить. Поэтому грид не дёрнется, только если изначально текущая строка была посередине окна грида.
-
> [4] vlad2 (03.02.14 20:28)
До или после EnableControls?
-
> [5] Inovet © (03.02.14 22:13)
После GotoBookmark, независимо от EnableControls.
-
> Дёргаться (не всегда, но часто) будет потому, что когда > после GotoBookmark курсор встанет на нужную строку грида, > то она будет посредине окна грида, это можно легко проверить. > Поэтому грид не дёрнется, только если изначально текущая > строка была посередине окна грида.
Да, это так.
-
не знаю, не рушился бы такое использовать в рабочей проге, но как "разминка для мозгов" - 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;
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; возможно даже будет работать... :).
-
> возможно даже будет работать... :).
У DataSet нет отдельного сообщения на EnableConrols, там ЕМНИП стандартный OnDataChange валится. А значт, что в общем виде ни букмарки, ни всякие даталинки использовать не выйдет, бо нет никакой гарантии, что там всё не позакрывалось и не открылось заново.
-
> что там всё не позакрывалось и не открылось заново. в таком случае и для > Перемещаюсь по записям таблицы (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
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
-
> нет гарантий, т.что все нормально будет.
Нет. В смысле - гарантий нет. Ну можно суррогатный ключ и Locate по нему, например.
-
Спасибо, sniknik, вроде, работает. Самое смешное, что DataLink.ActiveRecord уже использовал (писал свой грид), но для других целей, давно и напрочь забыл об этом.
А насчёт SelectedRows.CurrentRowSelected я имел в виду другое: при навигации по гриду ручками не могу отследить селект/деселест. Но это теперь и не требуется. Спасибо.
-
Отключите грид от датасета.
-
Дмитрий (11.04.14 17:12) [13] > Отключите грид от датасета. поменяйте ник на НекроЛамер... и ник прикольный, и будет сути соответствовать. второй раз подряд после решения ерунду советуешь.
-
> после решения ерунду советуешь
ну раз уж решили, то почему бы не тряхнуть ерундой...
|