Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вредный StringGrid / 16 сообщений из 16, страница 1 из 1
07.06.2012, 15:41
    #37829699
-ES-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
Cуть такова: создал свой клас наследник от стринггрида и неявно создал грид с кнопками в нужных мне местах
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
    B := TSpeedButton.Create(Self);
    B.Parent := strngrd;
    B.Caption := 'Изменить';
    B.Left := -100;
    B.Top  := -100;
    B.OnClick := btnClick;
    B.Enabled := False;
    strngrdr.objects[ACol1, ARow] := B;


естественно зарание переопределив Paint
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TNewStringGrid.Paint;
var i:integer;
    B,B2:TSpeedButton;
begin
   if FLastTopRow <> TopRow then
   begin
      FLastTopRow := TopRow;
      InvalidateCol(3);
      for i:=0 to RowCount-1 do
      begin
         B := TSpeedButton(objects[3, i]); //для примера заполним колонку
         if Assigned(B) then
           B.Left := -100;
      end;
     end;
   inherited
end;


Ну и в DrawCell разруливаю с кнопками :

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
procedure strngrdDrawCell(Sender: TObject; Col,
  Row: Integer; Rect: TRect; State: TGridDrawState);
var B:TSpeedButton;
begin
   if Row <> 0 then
   begin
     if (Col = 3) and ((Row - 1) < knopokCol) then  //количество подряд идущих кнопок
     begin // В этой колонке кнопки
        B := TSpeedButton(strngrd.objects[3, Row]);
        if Assigned(B) then
        begin
          B.BoundsRect := Rect;
          B.Visible := True;
        end
     end
     else
       if (Col = 3) and not((Row - 1) < knopokCol) then
       begin
         B := TSpeedButton(strngrd.objects[3, Row]);
         if Assigned(B) then
         begin
           B.Visible := False;
         end;
       end;
.....................


Все было хорошо до того как начал менять размер 1 -2 колонки, если поставит размер очень большой то колонка 3 скроиться (тоесть для нее не будет вызываться strngrdDrawCell) но кнопки то остануться на гриде :(. Проблему с вертикальным скролом решил переписыванием TopLeftChanged а вот как тут быть ?
...
Рейтинг: 0 / 0
07.06.2012, 16:14
    #37829769
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
-ES-,

ИМХО скрывать кнопку через
Код: pascal
1.
B.Left := -100;

не есть good.

попробуйте сделать ее заранее невидимой, как-то так:
Код: pascal
1.
2.
3.
4.
5.
Cуть такова: создал свой клас наследник от стринггрида и неявно создал грид с кнопками в нужных мне местах 
    B := TSpeedButton.Create(Self);
    B.Parent := strngrd;
    B.Caption := 'Изменить';
    B.Visible := false;


или так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure strngrdDrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState);
var
  B:TSpeedButton;
begin
  B := TSpeedButton(strngrd.objects[3, Row]);
  if Assigned(B) then B.Visible := False;

   if Row <> 0 then
   begin
     if (Col = 3) and ((Row - 1) < knopokCol) then  //количество подряд идущих кнопок
     begin // В этой колонке кнопки
        B := TSpeedButton(strngrd.objects[3, Row]);
        if Assigned(B) then
        begin
          B.BoundsRect := Rect;
          B.Visible := True;
        end
     end
...
Рейтинг: 0 / 0
07.06.2012, 16:25
    #37829802
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
>скрывать кнопку ... не есть good.
Ещё какой GOOD? самый нормальный

Скорее всего вам не нужно 1000 кнопок, проще нарисовать кнопку в ячейке, и обработать нажатие мыши
...
Рейтинг: 0 / 0
07.06.2012, 16:46
    #37829844
-ES-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
ну на данном этапе ... дето 300 -400 кнопок рисую строчек много ....

Код: pascal
1.
2.
  B := TSpeedButton(strngrd.objects[3, Row]);
  if Assigned(B) then B.Visible := False;


приводит к адцкому меганию кнопок :(
создавать невидимой тоже не вариант (так как после того как мы ее показали и поменяли размер колонки опять таже малина ибо она стала видимой...)
...
Рейтинг: 0 / 0
07.06.2012, 16:55
    #37829861
-ES-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
user89,

вот еслиб определить какие колонки щас невидны .. тогд адля этих колонак можно зделать кнопки B.Visible := false;
...
Рейтинг: 0 / 0
07.06.2012, 17:09
    #37829894
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
-ES-,

По мотивам http://www.delphi-manual.ru/stringgrid.php
Код: pascal
1.
2.
3.
4.
5.
Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании
StringGrid1.LeftCol	Номер столбца, видимого самым левым
StringGrid1.TopRow	Номер строки, видимой самой верхней
StringGrid1.VisibleColCount	Количество столбцов, видимых в рамках таблицы
StringGrid1.VisibleRowCount	Количество строк, видимых в рамках таблицы
...
Рейтинг: 0 / 0
07.06.2012, 17:21
    #37829925
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
-ES-
Вы их рисуйте. Не нужно 400 кнопок создавать и прятать/показывать
...
Рейтинг: 0 / 0
07.06.2012, 17:30
    #37829945
-ES-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
DimaBr,

есть ссылка на мат часть ?:)
...
Рейтинг: 0 / 0
07.06.2012, 17:42
    #37829977
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
-ES-,есть ссылка на мат часть ?:)
Можно из простых исходников VirtualButtonTree
http://www.delphi-gems.com/supplement/download.php?ID=77
Файл VirtualButtonTree.pas
...
Рейтинг: 0 / 0
08.06.2012, 12:49
    #37830939
-ES-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
DimaBr,

Зделал простановку размеров кнопки в TNewStringGrid.Paint :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 if FLastTopRow <> TopRow then
   begin
      FLastTopRow := TopRow;
      InvalidateCol(3);
      for i:=0 to RowCount-1 do
      begin
         B := TSpeedButton(objects[3, i]);
         if Assigned(B) then
         begin
           B.Left := -100;
           B.Visible := False;
         end;
      end;
   if Row <> 0 then  
   begin
     //if (Col = 3) and ((Row - 1) <Colknopok)then
     //отрисовываем кнопочки по ячейкам
     for i:=0 to Colknopokdo
     begin // В этой колонке кнопки
        B := TSpeedButton(objects[3, i]);
        if Assigned(B) then
        begin
          B.BoundsRect := CellRect(3, i);
          B.Visible := True;
        end
     end;


прошли все артефакты (при удалении кнопки я ее прячу.) спасибо за совет.
...
Рейтинг: 0 / 0
08.06.2012, 13:07
    #37830983
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
-ES-Зделал простановку размеров кнопки в TNewStringGrid.Paint
Я вам советовал вообще избавиться от кнопок, а просто нарисовать их в ячейках грида самостоятельно
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
24.11.2021, 16:41
    #40114594
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
DimaBr
-ES-Зделал простановку размеров кнопки в TNewStringGrid.Paint

Я вам советовал вообще избавиться от кнопок, а просто нарисовать их в ячейках грида самостоятельно
поднимаю тему из шкафа :)

тоже озадачился, но есть проблема: нарисовать кнопку с использованием текущего стиля :( и хорошо, если текущий стиль - классик. А то надо выдергивать из схемы стиля цвета, градиенты там всякие.

Понимаю, что тогда стилей может не было, но сейчас то они есть.

А если менять положение в OnDrawCell заранее созданной кнопки для ячейки, то нужно отслеживать изменения TopRow, VisibleRowCount и VisibleColCount.
И сделать это нужно до отрисовки ячеек OnDrawCell.

Думаю, что проще всего сделать это при отрисовке первой видимой ячейки.
...
Рейтинг: 0 / 0
24.11.2021, 16:54
    #40114602
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
...
Рейтинг: 0 / 0
24.11.2021, 17:05
    #40114606
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
С темами: https://devblogs.microsoft.com/oldnewthing/20050801-11/?p=34763
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.11.2021, 17:08
    #40114609
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid


вы мышкой над кнопками проводите, она подсвечивается, верно? Значит нужно еще обрабатывать OnMouseMove, рисовать даже тогда, когда сам грид не обновляется.
ну нафиг, не люблю лишнюю работу :)

PS: хотя спасибо за подсказку, интересная тема.
...
Рейтинг: 0 / 0
24.11.2021, 22:17
    #40114706
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вредный StringGrid
Belotsky Serge

вы мышкой над кнопками проводите, она подсвечивается, верно? Значит нужно еще обрабатывать OnMouseMove, рисовать даже тогда, когда сам грид не обновляется.
ну нафиг, не люблю лишнюю работу :)

главная проблема кнопкокидателей, это что-то должно происходить САМО.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вредный StringGrid / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]