|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Подсчитать закрашенные строки в DBGrid-e
Подскажите пожалуйста, как подсчитать количество закрашенных строк в DBGrid-e?
|
#2
|
|||
|
|||
Что ты имеешь в виду под "закрашеных"?
Это что-ли грид с мультиселектом? |
#3
|
|||
|
|||
Наверное эта тема - есть продолжение другой : http://www.delphisources.ru/forum/showthread.php?t=8841
Если так, то почему бы не считать строки одновременно в цикле где они анализируются Например : Код:
private FLightedRowsCounter : integer; ..... TForm1.FormCreate(sender:Tobject); begin FLightedRowsCounter := 0; end; ... procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); var i:integer; begin if Length(aa)>0 then begin i:=DBGrid1.DataSource.DataSet.RecNo; if DBGrid1.DataSource.DataSet.RecNo = aa[i-1].zap3 then begin dbgrid1.Canvas.Brush.Color := cllime; DBGrid1.Canvas.Font.Color := clRed; dbGrid1.DefaultDrawDataCell(Rect,Field,State); // Увеличиваем счетчик inc(FLightedRowsCounter); end; end; end; ... А дальше используеш значение FLightedRowsCounter как тебе нужно. |
#4
|
||||
|
||||
Сразу скажу, что не проверял... Но не уверен, что дельфя отрисовывает весь датасет сразу, а не только его видимую область...
Если у топикстартера был вопрос именно по "пользовательской" отрисовки записей, то стоит смотреть в сторону запроса. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#5
|
|||
|
|||
Ну и где впихивать сюда Label1, чтоб увидеть количество строк закрашенных?
Вот кусочек кода по которому строки в гриде красятца: Код:
procedure Tfrm_Main.DBGrid15DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); var i:integer; begin if Length(aa)>0 then begin i:=DBGrid15.DataSource.DataSet.RecNo; if DBGrid15.DataSource.DataSet.RecNo = aa[i-1].zap3 then begin dbgrid15.Canvas.Brush.Color := cllime; DBGrid15.Canvas.Font.Color := clRed; dbGrid15.DefaultDrawDataCell(Rect,Field,State); end; end; end; procedure Tfrm_Main.SpeedButton21Click(Sender: TObject); var i1, i2, p1, p2 : integer; begin SetLength(aa, 0); DBGrid16.DataSource.DataSet.Last; DBGrid16.DataSource.DataSet.First; SetLength(bb, 0); DBGrid15.DataSource.DataSet.Last; DBGrid15.DataSource.DataSet.First; DBGrid15.DataSource.DataSet.First; DBGrid16.DataSource.DataSet.First; p1 := DBGrid15.DataSource.DataSet.RecordCount-1 ; p2 := DBGrid16.DataSource.DataSet.RecordCount-1 ; //****************** DBGrid15.DataSource.DataSet.DisableControls; try for i1:=0 to p1 do begin SetLength(aa, Length(aa) + 1); aa[i1].zap1:= DBGrid15.DataSource.DataSet.RecNo; aa[i1].zap2:= DBGrid15.DataSource.DataSet.FieldValues['ACTION_CODE']; DBGrid15.DataSource.DataSet.Next; end; finally DBGrid15.DataSource.DataSet.EnableControls; end; DBGrid16.DataSource.DataSet.DisableControls; try for i2:=0 to p2 do begin SetLength(bb, Length(bb) + 1); bb[i2].zap1:= DBGrid16.DataSource.DataSet.RecNo; bb[i2].zap2:= DBGrid16.DataSource.DataSet.FieldValues['ACTION_CODE']; DBGrid16.DataSource.DataSet.Next; end; finally DBGrid16.DataSource.DataSet.EnableControls; end; for i1:=0 to Length(aa)-1 do begin aa[i1].zap3 := findAA(i1); end; for i2:=0 to Length(bb)-1 do begin bb[i2].zap3 := findBB(i2); end; DBGrid15.DataSource.DataSet.First; DBGrid16.DataSource.DataSet.First; end; Первое предупреждение, читай правила. Ну так и вопрос: узнать сколько строк в гриде закрашено? Чего не понятно?! Grid не мульти. |
#6
|
||||
|
||||
А непонятно кто закрасил строки грида. Я думаю маркером поверх монитора? Угадал?
ЗЫЖ А по существу, смотри мой предыдущий пост. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#7
|
|||
|
|||
Строки красятся по событию Tfrm_Main.DBGrid15DrawDataCell,
В этом же событии нужно увеличивать счетчик закрашиваемых строк. Вот немного поправил предыдущий код: Код:
var Form1: TForm1; aa: array of MyType1; bb: array of MyType2; // счетчик строк FLightedRowsCounter : integer; // указатель строки FCurrentRowNum : integer; implementation ... procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); var i:integer; begin if Length(aa)>0 then begin i:=DBGrid1.DataSource.DataSet.RecNo; if DBGrid1.DataSource.DataSet.RecNo = aa[i-1].zap3 then begin dbgrid1.Canvas.Brush.Color := cllime; DBGrid1.Canvas.Font.Color := clRed; dbGrid1.DefaultDrawDataCell(Rect,Field,State); // Увеличиваем счетчик если нашли новую совпавшую запись if (FCurrentRowNum <> DBGrid1.DataSource.DataSet.RecNo) then inc(FLightedRowsCounter); // устанавливаем указатель на новую запись FCurrentRowNum := DBGrid1.DataSource.DataSet.RecNo; end; end; end; ... procedure Tfrm_Main.SpeedButton21Click(Sender: TObject); var i1, i2, p1, p2 : integer; begin // обнуляем счетчик и указатель строки устанавливаем в -1 FLightedRowsCounter := 0; FCurrentRowNum :=-1; SetLength(aa, 0); DBGrid16.DataSource.DataSet.Last; DBGrid16.DataSource.DataSet.First; SetLength(bb, 0); DBGrid15.DataSource.DataSet.Last; DBGrid15.DataSource.DataSet.First; DBGrid15.DataSource.DataSet.First; DBGrid16.DataSource.DataSet.First; p1 := DBGrid15.DataSource.DataSet.RecordCount-1 ; p2 := DBGrid16.DataSource.DataSet.RecordCount-1 ; //****************** DBGrid15.DataSource.DataSet.DisableControls; try for i1:=0 to p1 do begin SetLength(aa, Length(aa) + 1); aa[i1].zap1:= DBGrid15.DataSource.DataSet.RecNo; aa[i1].zap2:= DBGrid15.DataSource.DataSet.FieldValues['ACTION_CODE']; DBGrid15.DataSource.DataSet.Next; end; finally DBGrid15.DataSource.DataSet.EnableControls; end; DBGrid16.DataSource.DataSet.DisableControls; try for i2:=0 to p2 do begin SetLength(bb, Length(bb) + 1); bb[i2].zap1:= DBGrid16.DataSource.DataSet.RecNo; bb[i2].zap2:= DBGrid16.DataSource.DataSet.FieldValues['ACTION_CODE']; DBGrid16.DataSource.DataSet.Next; end; finally DBGrid16.DataSource.DataSet.EnableControls; end; for i1:=0 to Length(aa)-1 do begin aa[i1].zap3 := findAA(i1); end; for i2:=0 to Length(bb)-1 do begin bb[i2].zap3 := findBB(i2); end; DBGrid15.DataSource.DataSet.First; DBGrid16.DataSource.DataSet.First; // отображаем количество закрашеных строк Label1.caption := inttostr( FLightedRowsCounter); end; |