Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Изменение размера ячеек StrinGrid


Автор: 6urunduk 3.7.2010, 21:23
На форме есть StringGrid, в него загружаются картинки из Image в процедуре OnDrawCell 
Код
with (Sender as TStringGrid) do
with Canvas do
begin
   {...}
   Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);
   {...}
end;
.
Вопрос: как подогнать размер ячеек под размер изображения ?

Автор: DarkProg 5.7.2010, 22:29
Я бы скорее подогнал изображения под размер ячеек, потому как все изображения разных рамеров, а StringGrid как-то не очень оперирует размером каждой отдельной ячейки(я обычно в таких случаях создаю чего-нить своё в виде кучки динамических компонентов)

Вот посему выставьте размер каждой ячейке скажем 300х300 и подгоняйте изображение.

Также попробуйте поискать для интереса решение в DRKB, но я такого не видел как-то.

Автор: ~FoX~ 6.7.2010, 18:43
Цитата(6urunduk @  3.7.2010,  22:23 Найти цитируемый пост)
Вопрос: как подогнать размер ячеек под размер изображения ? 

Ячеек - ни как, ну то есть можно конечно взять всю перерисовку на себя, но имхо проще использовать что то другое...
Стриггрид позволяет рулить только размерами столбца/строки... Придется сначала померить все картинки находящиеся в столбце/строке, соответственно увеличить ширину/высоту, до самой большой картнки, и только после этого отрисовать все вместе... Что бы было ровно, можно разместить по центру имиджи меньшего размера... Тока ИМХО, будет весьма криво выглядеть...

Автор: 6urunduk 7.7.2010, 22:14
~FoX~, вот через размер столбца\строки и подогнал 
Код
//Вставка картинок в ячейки StringGrid
procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
with (Sender as TStringGrid) do
with Canvas do
begin
   Draw(Rect.Left, Rect.Top, Form1.Image1.Picture.Graphic);
StringGrid1.Width:=Screen.DesktopWidth;
StringGrid1.Height:=Screen.DesktopHeight;
StringGrid1.DefaultColWidth:=Form1.Image1.Picture.Width;
StringGrid1.DefaultRowHeight:=Form1.Image1.Picture.Height;
end;

DarkProg, вставить нужно одно изображение во все ячейки smile

Но вот проблема: мерцание слишком заметно!!!Просто убивает! как от него избавиться?(от мерцания)

Автор: ~FoX~ 7.7.2010, 22:28
6urunduk, Во первых, менять размер в момент прорисовки это конечно здорово, но по моему это вызовет либо бесконечный цикл, либо переполнения стека...
Во вторых DefaultColWidth/DefaultRowHeight меняет все и сразу, я бы все таки менял по отдельности - RowHeights[0] := x/ColWidths[0]:=x;    
Ну и в третьих, соблюдай последовательность.......
Цитата(~FoX~ @  6.7.2010,  19:43 Найти цитируемый пост)
Придется сначала померить все картинки находящиеся в столбце/строке, соответственно увеличить ширину/высоту, до самой большой картнки, и только после этого отрисовать все вместе.


Автор: graffi 8.7.2010, 11:37
А мерцания немножко меньше будет, если поставить DoubleBuffered в true (это свойство формы). Можно в обработчик создания формы сунуть.

Автор: 6urunduk 14.7.2010, 20:52

~FoX~, 
Цитата

RowHeights[0] := x/ColWidths[0]:=x;    
 , но мы же заранее не знаем коилчества картинок , которые вместятся на экране

graffi, 
Цитата
DoubleBuffered в true
это в какой версии Делфи ? я пользую 7 , вроде не видел такого)

Автор: ~FoX~ 15.7.2010, 09:49
Цитата(6urunduk @  14.7.2010,  21:52 Найти цитируемый пост)
это в какой версии Делфи ? я пользую 7 , вроде не видел такого) 

Цитата(graffi @  8.7.2010,  12:37 Найти цитируемый пост)
(это свойство формы)

Цитата(6urunduk @  14.7.2010,  21:52 Найти цитируемый пост)
но мы же заранее не знаем коилчества картинок , которые вместятся на экране

Ох-ох-ох...... Так посчитай!!!  smile 

Автор: 6urunduk 15.7.2010, 12:10
~FoX~, а не легче мерцание убрать, нежели просчитывать кол-во каритнок, которые умещаются на форме ?

Автор: ~FoX~ 15.7.2010, 18:38
6urunduk, А сам подумай?
СтрингГрид не является контейнером, он не хранит изображения, он предоставляет только канвас, т.е. на каждую опирацию  (скрол, перемещение формы, изменение размеров и даже просто провести курсором над изображением)... тебе придется перерисовывать все.... На сколько бы быстро не работал твой алгоритм перерисовки, на сколько бы оптимальны не были изображения, от мерцания ты не избавишься... Проверенно, даже при использовании GDI+....
Хочишь избавица от мерцания загоняй объекты контейнеры (TImage например) в ячейки грида....

Автор: 6urunduk 15.7.2010, 20:00
[Б]~ФоХ~[/Б], легче повеситься

Добавлено через 4 минуты и 44 секунды
а если использовать ДравГрид ?

Автор: ~FoX~ 15.7.2010, 22:22
6urunduk, аналогично

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)