Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переопределение DrawCell в StringGrid... Запутался совсем...


Cosinus ©   (2004-09-30 20:11:00) 

Мне необходимо изменить тот способ выделения, который присутствует в CustomGridна свой собственный.
То есть, все знают, что
1)На событие OnClickпроисходит выделение контура ячейки цветом текущего шрифта
2)При выделении закрашивается область
Rect(XMouseDown,YMouseDown,XMouseNow,YMouseNow)//естественно, что это утрированно
Что мне необходимо изменить...
1)Выделение контура происходит по событию OnMouseDown и по OnMouseUp выделение соответственно снимается
2)Область выделения нескольких ячеек НЕ ПРЯМОУГОЛЬНАЯ, а выполнена, как допустим в любом текстовом редакторе, что то типа
Rect(XMouseDown,YMouseDown,XMax,YMouseDown,XMax,YMouseNow-1,XMouseNow,YMouseNow-1,XMouseNow,YMouseNow,XMin,YMouseN ow,XMin,YMouseDown+1,XMouseDown,YMouseDown+1)//привел все точки, надеюсь не запутал:)))
Если с первым пунктом я разобрался, то со вторым у меня проблеммы. Я совсем запутался в этом коде(Grids.pas). Натолкните на мысль, где что изменить (наверно я тупой, или может устал просто, но не найду никак, где формируется Rect).


GanibalLector   (2004-10-02 02:14:00) [1]


procedure TFrame3.StringGrid1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var X2, Y2: integer;
begin
if Button = mbLeft then
  with Sender as TStringGrid do begin
    MouseToCell(X, Y, X2, Y2);
    if (X2 LastX) or (Y2 LastY) then
      Options := Options - [goEditing]
    else
      begin
        Options := Options + [goEditing];
        OnMouseDown := nil;
        //Perform(WM_LBUTTONDOWN, MK_LBUTTON, Y * 65536 + X);
        OnMouseDown := StringGrid1MouseDown;
      end;
    LastX := X2;
    LastY := Y2;
  end;
end;

procedure TFrame3.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
with stringgrid1.Canvas do begin
if (Acol0) and (Arow0)  then begin
FillRect(Rect);
Font.Color := clblack;
Brush.Color := clwhite;
if textwidth(Stringgrid1.cells[Acol,Arow])>=Rect.Right-Rect.Left then
textout(rect.left+2,Rect.top+4,stringgrid1.Cells[Acol,Arow]) else
textout(rect.left+(rect.right-rect.left -
textwidth(stringgrid1.cells[Acol,Arow])) div 2 ,
Rect.top+4,stringgrid1.Cells[Acol,Arow]);
                          end else
begin
Brush.Color := clbtnface;
//Font.Style:=[fsBold]; //ïîæèðíåå!
FillRect(Rect);
Font.Color := clblack;
// íó òóò ïðàâäà áåç ïðîâåðêè çà âûõîä ãðàíèöû!!!
// ò.ê. ó ìåíÿ òàì òîëüêî öèôðû! Åñëè êîìó íàäî,òî ñì.ïðèìåð íèæå èëè âûøå!
textout(rect.left+(rect.right-rect.left -textwidth(stringgrid1.cells[Acol,Arow])) div 2  , Rect.top+4,stringgrid1.Cells[Acol,Arow]);
                          end;
if  gdselected in state then begin
Brush.Color := $cbe08b;
FillRect(Rect);
Font.Color := clblack;
if textwidth(Stringgrid1.cells[Acol,Arow])>=Rect.Right-Rect.Left
then textout(rect.left+2 ,Rect.top+4,stringgrid1.Cells[Acol,Arow]) else
textout(rect.left+(rect.right-rect.left -
textwidth(stringgrid1.cells[Acol,Arow])) div 2 ,
Rect.top+4,stringgrid1.Cells[Acol,Arow]);
                               end;
                           end;end;


Cosinus   (2004-10-01 15:11:00) [2]


>>gid ©

С первым пунктом разобрался (хоть я честно говоря и не совсем понял, что вы имели ввиду:)

> TUser ©   (01.10.04 15:05) [3]

Ок, попробую. Выделяется не прямоугольная область, а с начала выделения и до конца строки, пару(допустим) последующих строк, и от начала строки до конца выделения
Понятнее? Если нет, могу еще раз попробовать :)))


gid   (2004-10-01 15:05:00) [3]

Ну и кто тебе мешает поставить на событие OnClick свой обработчик с темеже параметрами что и в OnClick


TUser   (2004-10-01 15:05:00) [4]


> 1)Выделение контура происходит по событию OnMouseDown и
> по OnMouseUp выделение соответственно снимается

Это не совсем так. Там сообщения ловятся, а события - это понятие Delphi.

> привел все точки, надеюсь не запутал:)))

Не неайдейся. Лучше на пальцах объясни, как это выглядит в любом текстовом редакторе.


Cosinus   (2004-10-01 15:02:00) [5]

Собственно видимо тупой, потому что и с утра не могу найти :)))


Наверх

Титульная страница Поиск, карта сайта Написать письмо