powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вредный StringGrid
16 сообщений из 16, страница 1 из 1
Вредный StringGrid
    #37829699
-ES-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вредный StringGrid
    #37829769
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-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
Вредный StringGrid
    #37829802
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>скрывать кнопку ... не есть good.
Ещё какой GOOD? самый нормальный

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

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


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

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

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

есть ссылка на мат часть ?:)
...
Рейтинг: 0 / 0
Вредный StringGrid
    #37829977
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-ES-,есть ссылка на мат часть ?:)
Можно из простых исходников VirtualButtonTree
http://www.delphi-gems.com/supplement/download.php?ID=77
Файл VirtualButtonTree.pas
...
Рейтинг: 0 / 0
Вредный StringGrid
    #37830939
-ES-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вредный StringGrid
    #37830983
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-ES-Зделал простановку размеров кнопки в TNewStringGrid.Paint
Я вам советовал вообще избавиться от кнопок, а просто нарисовать их в ячейках грида самостоятельно
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вредный StringGrid
    #40114594
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr
-ES-Зделал простановку размеров кнопки в TNewStringGrid.Paint

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

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

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

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

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


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

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

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

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


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