Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Закраска одинаковых ячеек в одной колонке DBGrid  [new]
SUDOMaSteR
Member

Откуда:
Сообщений: 16
Народ, помогите, как закрасить ячейки с одинаковыми значениями находящихся в одной колонке но в разных строках?
13 сен 18, 07:20    [21673014]     Ответить | Цитировать Сообщить модератору
 Re: Закраска одинаковых ячеек в одной колонке DBGrid  [new]
zinpub
Member

Откуда:
Сообщений: 218
SUDOMaSteR,

Делал так:
1. Загоняем в array[N, 1..2] - N,1 значение, N,2 номер колонки;
2. Сортируем
3. Пробегаемся по массиву и красим коли два или более значения вподряд одинаковые
13 сен 18, 08:30    [21673049]     Ответить | Цитировать Сообщить модератору
 Re: Закраска одинаковых ячеек в одной колонке DBGrid  [new]
SUDOMaSteR
Member

Откуда:
Сообщений: 16
zinpub
SUDOMaSteR,

Делал так:
1. Загоняем в array[N, 1..2] - N,1 значение, N,2 номер колонки;
2. Сортируем
3. Пробегаемся по массиву и красим коли два или более значения вподряд одинаковые


А как в массиве сортировку сделать не подскажешь?
13 сен 18, 08:49    [21673062]     Ответить | Цитировать Сообщить модератору
 Re: Закраска одинаковых ячеек в одной колонке DBGrid  [new]
zinpub
Member

Откуда:
Сообщений: 218
Ну не в такой ДЕНЬ же :-)

13 сен 18, 09:05    [21673083]     Ответить | Цитировать Сообщить модератору
 Re: Закраска одинаковых ячеек в одной колонке DBGrid  [new]
zinpub
Member

Откуда:
Сообщений: 218
http://www.delphi-manual.ru/sorting.php
13 сен 18, 09:05    [21673084]     Ответить | Цитировать Сообщить модератору
 Re: Закраска одинаковых ячеек в одной колонке DBGrid  [new]
SUDOMaSteR
Member

Откуда:
Сообщений: 16
zinpub
http://www.delphi-manual.ru/sorting.php


Спасибо, буду думать :) Хотя мысля пришла уже по другому реализовать это, используя ресурсы MSSQL но не постоянно чтоб проверка шла на дубли, а только в определенные моменты :)

P.S. С праздником :)
13 сен 18, 09:41    [21673117]     Ответить | Цитировать Сообщить модератору
 Re: Закраска одинаковых ячеек в одной колонке DBGrid  [new]
SUDOMaSteR
Member

Откуда:
Сообщений: 16
Реализовал пока так, может кому пригодится :)
var
  YN_INVEN_NO_SB:array of integer;
  YN_INVEN_NO_MON:array of integer;

procedure SearchDuble;
var
  i:integer;
begin
  BASE.Query.Connection := BASE.Connection;
  BASE.Query.Active:= False;
  BASE.Query.SQL.Clear;
  BASE.Query.SQL.Add('SELECT YN_TD0007 FROM TD0007');
  BASE.Query.SQL.Add('WHERE INVEN_NO_MON in (SELECT INVEN_NO_MON FROM TD0007');
  BASE.Query.SQL.Add('GROUP BY INVEN_NO_MON');
  BASE.Query.SQL.Add('HAVING COUNT(*)>1)');
  BASE.Query.Active:= True;
  SetLength(YN_INVEN_NO_MON, BASE.Query.RecordCount);
  BASE.Query.First;
  if BASE.Query.RecordCount > 0 then begin
    for i:=0 to BASE.Query.RecordCount do begin
      YN_INVEN_NO_MON[i]:=BASE.Query.FieldByName('YN_TD0007').AsInteger;
      BASE.Query.Next;
    end;
  end;

  BASE.Query.Connection := BASE.Connection;
  BASE.Query.Active:= False;
  BASE.Query.SQL.Clear;
  BASE.Query.SQL.Add('SELECT YN_TD0007 FROM TD0007');
  BASE.Query.SQL.Add('WHERE INVEN_NO_SB in (SELECT INVEN_NO_SB FROM TD0007');
  BASE.Query.SQL.Add('GROUP BY INVEN_NO_SB');
  BASE.Query.SQL.Add('HAVING COUNT(*)>1)');
  BASE.Query.Active:= True;
  SetLength(YN_INVEN_NO_SB, BASE.Query.RecordCount);
  BASE.Query.First;
  if BASE.Query.RecordCount > 0 then begin
    for i:=0 to BASE.Query.RecordCount do begin
      YN_INVEN_NO_SB[i]:=BASE.Query.FieldByName('YN_TD0007').AsInteger;
      BASE.Query.Next;
    end;
  end;
end;

procedure TTD0007.FormCreate(Sender: TObject);
begin
  SearchDuble;
end;

procedure TTD0007.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  i: integer;
begin
  if (gdfocused in state) then else begin
    DBGrid1.Canvas.Font.Color:= clBlack;
    DBGrid1.Canvas.Font.Style:=[];
  end;
  if Column.Index = 13 then
    for i := 0 to Length(YN_INVEN_NO_SB) do begin
      if YN_INVEN_NO_SB[i] = BASE.DS_TD0007.DataSet.FieldByName('YN_TD0007').AsInteger then
        if (gdfocused in state) then else begin
          DBGrid1.Canvas.Font.Color := clRed;
          DBGrid1.Canvas.Font.Style:=[fsBold];
        end;
    end;
  if Column.Index = 18 then
    for i := 0 to Length(YN_INVEN_NO_MON) do begin
      if YN_INVEN_NO_MON[i] = BASE.DS_TD0007.DataSet.FieldByName('YN_TD0007').AsInteger then
        if (gdfocused in state) then else begin
          DBGrid1.Canvas.Font.Color := clRed;
          DBGrid1.Canvas.Font.Style:=[fsBold];
        end;
    end;
  DBGrid1.DefaultdRawColumnCell(Rect,DataCol,Column,State);
end;
13 сен 18, 12:14    [21673344]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить