Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2009, 23:53   #1
Velh
 
Регистрация: 21.10.2009
Сообщений: 6
Сообщение Проблема выделения ячейки в StringGrid

В общем проблема в следующем, на форме как понятно из названия есть компонент StringGrid. Св-во DefaultDrawing = false, метод OnDrawCell прописан ручками так, что границы между ячейками отрисовываются красным цветом. Все бы хорошо, НО! при выборе ячейки для редактирования, гммм... на время редактирования какой-то метод компонента, стандартная виндовая процедура, (я не знаю что это!) перерисовывает данную ячейку с линиями стандартного цвета. Если кто не понял привожу скриншот. Собственно взываю к вам, коллеги, с просьбой о помощи, уже замучал гугл своими поисковыми запросами, результат нулевой.
Изображения
Тип файла: png scrin_21_10_2009_23_49.PNG (16.1 Кб, 174 просмотров)
Velh вне форума Ответить с цитированием
Старый 22.10.2009, 09:16   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

А на реализацию метода OnDrawCell можно взглянуть?
Скандербег вне форума Ответить с цитированием
Старый 22.10.2009, 10:20   #3
Velh
 
Регистрация: 21.10.2009
Сообщений: 6
По умолчанию

Да, конечно:

Код:
TCellType = (ctHeader, ctDefault, ctFooter, ctBasis);

procedure PaintCell(Canvas: TCanvas; CRect: TRect;
  CType: TCellType; Text: String);
begin
  with Canvas do begin
    case CType of
      ctDefault: begin
        Brush.Color := clWindow;
        Pen.Color := clred;
        MoveTo(CRect.Right, CRect.Top);
        LineTo(CRect.Right, CRect.Bottom);
        LineTo(CRect.Left - 1, CRect.Bottom);
        FillRect(CRect);
        TextRect(CRect, CRect.Left, CRect.Top, Text);
      end;
      ctHeader: begin
        Brush.Color := clBtnFace;
        Pen.Color := clBlack;
        MoveTo(CRect.Left, CRect.Top);
        LineTo(CRect.Right, CRect.Top);
        LineTo(CRect.Right, CRect.Bottom);
        LineTo(CRect.Left, CRect.Bottom);
        FillRect(CRect);
        TextRect(CRect, CRect.Left, CRect.Top, Text);
      end;
    end;
  end;
end;

procedure TFm_Main.SG_MainDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid) do begin
    with Canvas do begin
      if (ARow = 0) then
        PaintCell(Canvas, Rect, ctHeader, Cells[ACol, ARow]);
      if (ACol > 0) and (ACol < ColCount - 2) and
        (ARow > 0) and (ARow < RowCount - 2) then
          PaintCell(Canvas, Rect, ctDefault, Cells[ACol, ARow]);
      if (State = [gdSelected, gdFocused]) or (State = [gdSelected]) or
        (State = [gdFocused]) then begin
        Brush.Color := clGreen;
        FillRect(rect);
      end;
    end;
  end;
end;
Velh вне форума Ответить с цитированием
Старый 22.10.2009, 13:36   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Как показалось, после исследования проблемы, самый простой способ - это заменить штатный Inplace editor StringGrid'а своим (TCustomMaskEdit). Как это делается примеров в инете достаточно. Тогда при вставке "своего" Editor'а в ячейку его размеры можно подкорректировать, чтобы он не "заслонял" ограничивающие ячейку линии. А т.к. он создается без бордюра, то и линий его обрамляющих не будет.
Скандербег вне форума Ответить с цитированием
Старый 22.10.2009, 17:24   #5
Velh
 
Регистрация: 21.10.2009
Сообщений: 6
По умолчанию

Скандербег, огромное спасибо, я и не знал что эта ерунда называется inplace editor =[. В принципе я сегодня уже так сделал, за тем лишь исключением, что не стал переопределять етот самый эдитор, а поставил св-во GoEditing = false и на событие onClick прописал чтоб в ячейку вставлялся edit, далее понятно.
Velh вне форума Ответить с цитированием
Старый 23.10.2009, 00:20   #6
Velh
 
Регистрация: 21.10.2009
Сообщений: 6
По умолчанию

Появился еще один вопрос. Понадобилось в TEdit вывести текст с вертикальным выравниванием по центру. Сделал. Но как сделать чтобы курсор мигал тоже по центру?
Velh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Координаты ячейки в StringGrid??? aslanbek Общие вопросы Delphi 13 01.08.2014 16:53
Проблема выделения динамической памяти в С++ oxygen90 Помощь студентам 3 14.09.2009 21:47
Смещение рамки выделения ячейки (курсора), относительно текущей вниз. hugoboss Microsoft Office Excel 2 19.01.2008 11:31
скрыть ячейки в таблице StringGrid РИЯ Компоненты Delphi 4 22.10.2007 08:15