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

Вниз

TDrawGrid проблема   Найти похожие ветки 

 
Begin ©   (2002-08-31 21:57) [0]

Прошу помощи, мастера !

Заполнить сетку картинками можно только обработчиком OnDrawCell. Но этот обработчик, как я понял, при каждом вызове перерисовывает всю сетку, помещая в каждую ячейку одно и то же указанное изображение. А вот как мне поместить картинку только в одну клетку, не затрагивая все остальные ?????

На текущий момент я нащел только такой выход

procedure TForm1.FloorGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if (ARow=7) and (ACol=7) then
begin
with FloorGrid.Canvas, Rect do
StretchDraw(Rect,Image1.Picture.Graphic);
end;
end;

Неужели никак нельзя указать что то типа "нарисовать в такой то ячейке в таком то Rect такую то картинку" ????


 
Юрий Зотов ©   (2002-08-31 23:19) [1]

> Но этот обработчик, как я понял, при каждом вызове
> перерисовывает всю сетку

Не совсем так. Он вызывается при перерисовке окна (или его части), но для каждой перерисовываемой ячейки.

> помещая в каждую ячейку одно и то же указанное изображение

Почему обязательно "одно и то же"? Разве что-то мешает загонять в каждую ячейку ее собственную картинку? Как раз для таких вещей в обработчик и передаются Row и Col.

> Неужели никак нельзя указать
Можно. Именно так, как Вы уже и сделали.


 
Begin ©   (2002-09-01 01:17) [2]

to Юрий Зотов

OK, спасибо за совет, но тем не менее, если можно одно
уточнение
у TStringGrid есть свойство Cells и можно сделать так

Grid1 : TStringGrid
...
Grid1.Cells[1,1]:="!!!!!!!!!!"

неужели для TDrawGrid нет чего то подобного, и для замены только одной картинки я должен перерисовывать всю сетку, с помощью if"а исключая те ячейки, которые трогать не нужно ? А если у меня в сетке, образно говоря, 200 имаджей ??? К вопросу о скорости приложений ...

Заранее благодарен


 
Begin ©   (2002-09-01 02:52) [3]

И еще вопрос в догонку.... :) onDrawCell, если он в тексте прописан, вызывается автоматически при создании сетки. Но к этому моменту еще не может быть определено какие именно ячейки заполнять, а какие нет (это определяет пользователь во время работы). Что мне тогда передавать через ARow ACol ? И откуда ? Отключить срабатывание onDrawCell при запуске приложения ?


 
Begin ©   (2002-09-01 18:22) [4]

Please, мастера, помогите ответом, оч нужно ... :)


 
Song ©   (2002-09-01 19:21) [5]

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

IF (ARow=ваш_ряд) and (ACol=ваш_столбец) then TStringGrid(Sender).Canvas.Draw(...


 
TTCustomDelphiMaster ©   (2002-09-01 19:36) [6]

Begin ©
Вы похоже еще не допоняли что onDrawCell вызывается для прорисовки ячейки автоматически и туда ничего не надо передавать. В обработчике этого события вам нужно написать код прорисовки 1 ячейки. В параметрах функции передаются координаты ячейки. Пример реализации смотрите в Help - TDrawGrid.OnDrawCell - Example.
После замены одной картинки вызывайте DrawGrid1.Invalidate. Этот метод обновит изображение DrawGrid.
Что рисовать если картинка еще не выбрана пользователем вы должны определить в коде обработчика onDrawCell. А отключать onDrawCell не надо.

PS: Разберитесь с примером из help.


 
Song ©   (2002-09-01 19:39) [7]

Лучше наверно всё-таки InvalidateRect() - так быстрей.


 
Юрий Зотов ©   (2002-09-01 20:01) [8]

> К вопросу о скорости приложений ...

Каждый раз когда окно (или его часть) требует перерисовки, вызывается Ваш обработчик. Хотите Вы этого, или нет - он все равно вызывается (если он есть, конечно).

И хоть одну картинку Вы в нем определите, хоть тысячу - неважно. Он все равно вызывается для каждой перерисовываемой ячейки. Хотим - рисуем, хотим - нет. Влияние на скорость здесь косвенное.


> это определяет пользователь во время работы.
И прекрасно.
Как только юзер нажал "ОК", вызывайте Invalidate(Rect)


> Отключить срабатывание onDrawCell при запуске приложения?
Наоборот - назначить обработчик ПОСЛЕ показа формы. В OnShow, а не в Object Inspector.


 
Begin ©   (2002-09-01 20:04) [9]

OK, Спасибо всем, будем разбираться... :)


 
Begin ©   (2002-09-01 21:35) [10]

Блин, я тупой, наверное .... Или страдаю недопониманием ... Не выходит ничего... :(

на форме есть Button1, Button2, DrawGrid1, Image1

Если не сложно, можно мне небольшой пример, чтобы при клике Button1 изображение из Image1 помещалось в клетку [3,3], а при клике Button2 убиралось оттуда ????


 
Song ©   (2002-09-01 21:46) [11]


Procedure TForm1.Button1Click(Sender:TObject);
Begin
DrawGrid1.Tag:=1;
End;

Procedure TForm1.Button2Click(Sender:TObject);
Begin
DrawGrid1.Tag:=0;
End;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
With TDrawGrid(Sender) Do
IF (ARow=3) and (ACol=3) then
Begin
BitMap:=TBitMap.Create;
try
IF Bool(Tag) then BitMap.Assign(Image1.Picture.BitMap);
Canvas.FillRect(Rect);
Canvas.Draw(Rect.Left+2,Rect.Top+2,BitMap);
finally
BitMap.Free;
end;
End;
end;





 
Song ©   (2002-09-01 21:52) [12]

Забыл в обрабочики кнопок добавить DrawGrid1.RePaint


 
Begin ©   (2002-09-01 22:05) [13]

Я понимаю, что это уже смешно .... :) Но ... Song, оно не работает. Во первых, жалуется на строку BitMap:=TBitMap.Create; Если я добавляю в процедуру var BitMap : TBitmap; жаловаться перестает, но после запуска по нажатию Button1 ничего не происходит ....

Хельп !!!!


 
Song ©   (2002-09-01 22:16) [14]

Обратите внимание ещё раз на мессагу Song © (01.09.02 21:52)
То что тип не указал - Вы правы, но я и не пробовал этот отрывок, сразу в форме написал.


 
Begin ©   (2002-09-01 22:34) [15]

Добавлял - не помогает. DrawGrid1 остается пустой, как был ....
Продолжаю пытаться, но оно продолжает неработать...


 
Юрий Зотов ©   (2002-09-02 00:40) [16]

procedure TForm1.DrawGrid1DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if // если
Boolean(DrawGrid1.Tag) // картинка нужна
and (ACol = 3) and (ARow = 3) // и это ячейка [3,3]
then // то рисуем (иначе ничего не делаем)
DrawGrid1.Canvas.StretchDraw(Rect, Image1.Picture.Graphic)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DrawGrid1.Tag := 1; // Признак - картинка нужна
DrawGrid1.Invalidate // Перерисовать грид
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
DrawGrid1.Tag := 0; // Признак - картинка НЕ нужна
DrawGrid1.Invalidate // Перерисовать грид
end;


 
dim- ©   (2002-09-02 02:07) [17]

А почему если вставляю:
if (acol=0) and (arow=1) then begin
DrawGrid1.Canvas.FillRect(Rect);
DrawGrid1.Canvas.TextOut(Rect.Left+5,rect.Right+5,"1");
end;
if (acol=0) and (arow=2) then begin
DrawGrid1.Canvas.FillRect(Rect);
DrawGrid1.Canvas.TextOut(Rect.Left+5,rect.Right+5,"2");
end;
не выводятся цифры, а если делаю StretchDraw то рисунок выводится


 
Валерыч   (2002-09-02 02:43) [18]

Перед выводом текста установи цвет шрифта


 
Begin ©   (2002-09-02 03:11) [19]

Сеньк всем ! :)


 
Song ©   (2002-09-02 08:47) [20]

2Begin © (02.09.02 03:11)
DrawGrid1.RePaint надо вставить после изменения Tag. Я тут понадеялся, что мой пример в самом деле не работает, однако нет, всё ok, так что hands.sys



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

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

Наверх




Память: 0.52 MB
Время: 0.019 c
1-35691
Serguar
2002-09-02 11:23
2002.09.12
динамические переменные


1-35696
France
2002-09-02 12:43
2002.09.12
Переименовать Пуск Программы <Группа> <ярлык>


14-35856
AL2002
2002-08-16 18:00
2002.09.12
Чем переконвертить Ogg в Mp3?


1-35701
lovres
2002-09-02 13:28
2002.09.12
Как сделать отчёт в Word?


4-35967
v2k
2002-07-19 19:11
2002.09.12
кто знает