Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.24;
Скачать: CL | DM;

Вниз

Движение по StringGrid   Найти похожие ветки 

 
Андрей (начинающий)   (2009-04-05 15:59) [0]

Подскажите, пожалуйста, как осуществлять движение по ячейкам StringGrid с помощью MouseWheelDown/MouseWheelUp? При фокус должен устанавливаться на следующую строку/ячейку.

Пример:
в SG заполенено 10 строк, выделена ячейка 2,2
при событии MouseWheelDown должна выделиться ячейка 2,3


 
AIK ©   (2009-04-05 16:13) [1]

Двигайся удерживая шрифт


 
Андрей (начинающий)   (2009-04-05 19:27) [2]


> AIK ©   (05.04.09 16:13) [1]

не понял, если можно - поподробнее


 
{RASkov} ©   (2009-04-05 21:57) [3]

А Делфи какая?
Я в D7 на пустую форму бросил SG указал ему RowCount = 29 затем F9 и кручу колесо мышки.... фокус смещается на одну строку по вертикали... т.е. как я понял так и нужно...
Я что-то не так сделал?

> с помощью MouseWheelDown/MouseWheelUp

у тебя там что-то есть? ....в плане своего кода..


 
MsGuns ©   (2009-04-05 23:24) [4]

Вероятно, у автора мышь двухкнопочная, а надо чтобы грид скруллинговался мышью


 
Андрей (начинающий)   (2009-04-05 23:27) [5]


> {RASkov} ©   (05.04.09 21:57) [3]

D7

> у тебя там что-то есть? ....в плане своего кода..

SG заполняется програмно, убирается выделение ячеек и в DrawCell
выделяется нужная ячейка

with StringGrid1 do begin
       Canvas.Brush.Color := clScrollBar;
       Canvas.FillRect(CellRect(ACol, ARow));
       Canvas.Font.Style := [fsBold];
       DrawText(Canvas.Handle,PChar(Cells[ACol, ARow]), -1, Rect,       DT_SINGLELINE or DT_VCENTER);
     end;

После этого мне надо обработать скролл мыши для движения от этой выделенной ячейки и выделять тем же способом следующую.

в MouseWheelDown/MouseWheelUp еще ничего нет.


 
Андрей (начинающий)   (2009-04-05 23:28) [6]


> MsGuns ©   (05.04.09 23:24) [4]

мышь обычная :) 2 кнопки +скролл


 
{RASkov} ©   (2009-04-05 23:46) [7]

> [5] Андрей (начинающий)   (05.04.09 23:27)

Ну и все нормально у тебя....т.е. почти нормально...
тыж сам не рисуешь выделенную ячейку...
попробуй эту:

> Canvas.Brush.Color := clScrollBar;

строку заменить на эту:
if gdSelected in State then Canvas.Brush.Color := clBlue else Canvas.Brush.Color := clScrollBar;


 
{RASkov} ©   (2009-04-05 23:48) [8]

> [5] Андрей (начинающий)   (05.04.09 23:27)
> Canvas.FillRect(CellRect(ACol, ARow));

Лишнее. Зачем еще раз вычислять то, что уже вычеслено и передается в обработчик параметром: Rect: TRect;


 
{RASkov} ©   (2009-04-05 23:51) [9]

> [5] Андрей (начинающий)   (05.04.09 23:27)
> with StringGrid1 do begin

ну и тут не есть совсем гуд... Лучше Sender используй, причем желательно с проверкой на соотвествие типа... может данный обработчик(DrawCell) и не будет вызываться отдельно, но всеж... а для других это как пить дать...


 
{RASkov} ©   (2009-04-05 23:53) [10]

> может данный обработчик(DrawCell) и не будет вызываться отдельно,

т.е. имется в виду вызов данного обработчика путем вызова имени метода с указанием параметров, где Sender"у может соответствовать совсем не совместимый тип или вообще nil...


 
Германн ©   (2009-04-06 01:12) [11]

Бред какой-то.

> SG заполняется програмно, убирается выделение ячеек и в
> DrawCell
> выделяется нужная ячейка
>

Она выделяется только цветом в обработчике OnDrawCell?


 
Андрей (начинающий)   (2009-04-06 09:52) [12]


> Германн ©   (06.04.09 01:12) [11]
> Она выделяется
> только цветом в обработчике OnDrawCell?

Мне не понравилось стандартное выделение ячейки SG и я попробовал этот код. Теперь все устраивает по цвету.


> {RASkov} ©   (05.04.09 23:53) [10]

Обработчик отдельно у меня больше нигде не вызывается.
Вообще, спасибо за советы. Пойду читать и проверять :)


> {RASkov} ©   (05.04.09 23:46) [7]

После этого предполагается, что MouseWheelDown/MouseWheelUp заработают автоматом? Просто я извратился уже и решил для себя проблему, но хочется сделать нормально...


 
MsGuns ©   (2009-04-06 11:32) [13]

А слабо сделать прокрутку сетки глазами ?


 
Андрей (начинающий)   (2009-04-06 22:28) [14]


> MsGuns ©   (06.04.09 11:32) [13]

Огромное спасибо за содержательный ответ и неоценимую помощь.
Ветка, кажется, называется "Начинающим". Поэтому если считаете, что вопрос глупый, так так и скажите, а затем ткните носом - где в хелпе смотреть. Это будет лучше, чем показывать свою божественность какому-то там новичку ...


 
Германн ©   (2009-04-07 00:56) [15]


> Андрей (начинающий)   (06.04.09 09:52) [12]
>
>
> > Германн ©   (06.04.09 01:12) [11]
> > Она выделяется
> > только цветом в обработчике OnDrawCell?
>
> Мне не понравилось стандартное выделение ячейки SG и я попробовал
> этот код. Теперь все устраивает по цвету.
>
>

Так всё устраивает или не всё?


 
MsGuns ©   (2009-04-07 14:57) [16]

>Андрей (начинающий)   (06.04.09 22:28) [14]
>Огромное спасибо за содержательный ответ и неоценимую помощь.
>Ветка, кажется, называется "Начинающим". Поэтому если считаете, что вопрос глупый, так так и >скажите, а затем ткните носом - где в хелпе смотреть. Это будет лучше, чем показывать свою >божественность какому-то там новичку ...

Если "начинающий" соблаговолит четко и внятно объяснить что собственно ему нужно сотворить со стрингридом, то ответ будет таким же четким и внятным. Из сабжа при всей "божественности" добиться ясности не получается :)

В частности непонятно нужно ли выделение текущей ячейки (строчки) нестандартным цветом либо перемещение курсора указателем мыши (с кликом или нет также неясно) - это ведь несколько не одно и то же :)


 
Андрей (начинающий)   (2009-04-07 23:13) [17]


> Германн ©   (07.04.09 00:56) [15]


> MsGuns ©   (07.04.09 14:57) [16]

Выделение ячейки нужным цветом, а не стандартным я добился. Мне нужно было после того, как я ее выделил, обработать события MouseWheelDown/MouseWheelUp. При этом перемещать фокус на след. ячейку по горизонтали и выделять ее. снимая выделение с предыдущей. По достижении ColCount перейти соответственно на строку ниже/выше в первую колонку. Не мог сообразить как это сделать.


 
Германн ©   (2009-04-08 01:05) [18]


> Андрей (начинающий)   (07.04.09 23:13) [17]
>
>
> > Германн ©   (07.04.09 00:56) [15]
>
>
> > MsGuns ©   (07.04.09 14:57) [16]
>
> Выделение ячейки нужным цветом, а не стандартным я добился.
>  Мне нужно было после того, как я ее выделил, обработать
> события MouseWheelDown/MouseWheelUp. При этом перемещать
> фокус на след. ячейку по горизонтали и выделять ее. снимая
> выделение с предыдущей. По достижении ColCount перейти соответственно
> на строку ниже/выше в первую колонку. Не мог сообразить
> как это сделать.
>

"Выделение ячейки нужным цветом", обработка "события MouseWheelDown/MouseWheelUp." и "перемещение фокуса" никак не могут быть причинно-следственно связаны. Кроме как перанальным способом.
Ну ладно. Перемещение фокуса можно сделать.


 
MsGuns ©   (2009-04-08 09:07) [19]

Любое открашивание, выделение, а также рисование в ячейках выполняется в событии грида OnDrawCell, мышь тут не при чем, если конечно не требуется различать каким образом фокус попал в ячейку - перемещением клавишами (ползунком) или мышиным кликом (последнее в частности необходимо если нужно "поймать" клик на пиктограммке нарисованной в ячейке, а не в любом месте ячейки)


 
{RASkov} ©   (2009-04-08 10:23) [20]

> [17] Андрей (начинающий)   (07.04.09 23:13)

примерно так:
procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject;
 Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
 if not (Sender is TStringGrid) then Exit;
 Handled:=True;
 with TStringGrid(Sender) do begin
  if Col < ColCount-1 then Col:=Col+1
  else begin
   Col:=FixedCols;
   if Row < RowCount-1 then Row:=Row+1 else Row:=FixedRows;
  end;
 end;
end;

procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject;
 Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
 if not (Sender is TStringGrid) then Exit;
 Handled:=True;
 with TStringGrid(Sender) do begin
  if Col > FixedCols then Col:=Col-1
  else begin
   Col:=ColCount-1;
   if Row > FixedRows then Row:=Row-1 else Row:=RowCount-1;
  end;
 end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
 if not (Sender is TStringGrid) then Exit;
 with TStringGrid(Sender) do begin
  if gdSelected in State then Canvas.Brush.Color := clBlue else Canvas.Brush.Color := clScrollBar;
  Canvas.FillRect(Rect);
.............
 end;
end;


 
Андрей (начинающий)   (2009-04-08 11:31) [21]

Всем спасибо за отклики.

> {RASkov} ©   (08.04.09 10:23) [20]

Я проделал у себя примерно то же самое, только гораздо корявее :). Пойду приводить код "к общему знаменателю"  :) Отдельное спасибо Вам за конкретные подсказки.



Страницы: 1 вся ветка

Текущий архив: 2009.05.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
4-1209468741
bon
2008-04-29 15:32
2009.05.24
Terminal Service


11-1200936173
Ash-911
2008-01-21 20:22
2009.05.24
Добавление пути в дерево


2-1238133229
Alexandra
2009-03-27 08:53
2009.05.24
Как создать LargeButton в dxBarManager?


15-1237411802
Юрий
2009-03-19 00:30
2009.05.24
С днем рождения ! 19 марта 2009 четверг


2-1239263669
deras
2009-04-09 11:54
2009.05.24
Вопрос по дочерним формам