Topic: Два раза срабатывает onChange

Я сделал в скрипте раскрашивание ячеек в гриде. Так как у меня грид обновляется автоматически, а не по кнопке, то я использую его событие onChange. Случайно заметил, что когда я нажимаю кнопку сохранения записи в форме редактирования записи, то onChange срабатывает один раз, а потом еще один раз, очевидно при рефреше грида, который находится на родительской форме. ТО есть при большом количестве записей, будет выполнятся процессы раскрашивания записей в цикле два раза, что плохо. Как этого избежать?

Re: Два раза срабатывает onChange

Попробовал сделать тоже самое, у меня только один раз вызывается OnChange, возможно какие то другие скрипты принудительно его обновляют. (TableGrid1.dbUpdate;)



можете приложить файл скрипта, посмотрю в чем дело.

Dmitry.

Re: Два раза срабатывает onChange

Может быть - посмотрю поподробней. Есть еще вопрос по гриду - хочу сделать в скриптах типовую процедуру, которая будет раскрашивать ячейки для любого заданного грида, для этого грид ей нужно передать как параметр. Это можно сделать? И если можно, то какого типа должен быть параметр?

Re: Два раза срабатывает onChange

atempbox

procedure ColoredGrid (TableGrid: string);
var
   i,c: integer;
   Grid: TdbStringGridEx;
begin
     Grid := nil;

     // ищем грид  на всех формах
     if Grid = nil then Grid := TdbStringGridEx( Form1.FindComponent(TableGrid) );
     if Grid = nil then Grid := TdbStringGridEx( Form2.FindComponent(TableGrid) );
     if Grid = nil then Grid := TdbStringGridEx( Form3.FindComponent(TableGrid) );

     if Grid=nil then exit; // если не нашли, выходим

     // раскрашиваем
     c := Grid.RowCount - 1;
     for i := 0 to c do
     begin
         if Grid.Cells[3,i] = 'Yes' then Grid.Cell[3,i].Color := clRed;
         if Grid.Cells[3,i] = 'No' then Grid.Cell[3,i].Color := clGreen;
     end;
end;


procedure Form1_GridEmployees_OnChange (Sender: string);
begin
    ColoredGrid(Sender);
end;

в принципе это можно сделать чуть проще, одно созданное событие может использоваться сразу многими компонентами, вам просто необходимо зайти на вкладку События и вставить напротив события OnChange название уже существующего события, например: Form1_GridEmployees_OnChange

Dmitry.

Re: Два раза срабатывает onChange

Да, я так и делаю, использую один обработчик в четырех местах по onChange, получая из Sender имя грида. Попутно такой вопрос возник - у меня на форме 4 грида в закладках находятся, в каждом делается запрос к одной и той-же таблице, только фильтр стоит по полю тип. Возможно с 4 гридами не самое рациональное решение, но так получилось из-за удобства интерфейса. Заметил следующее - когда открываю в каком-либо из этих гридов запись на редактирование, и потом при сохранении по OnChange грида раскрашиваю его ячейки, onChange срабатывает во всех 4-х гридах и происходит соответственно и их раскрашивание, хотя в самих гридах ничего не менялось. Это как-то решается? Сейчас там десятки записей, а будут сотни и тысячи, лишнее время на это будет тратиться.

Re: Два раза срабатывает onChange

atempbox
К сожалению простого способа как это решить не знаю.


Протестировал у себя, раскрашивание (не перебор, а именно раскрашивание) 3000 ячеек занимает всего 1 секунду, думаю этой скорости хватит.

Dmitry.