![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TDrawGrid проблема [D6, Win2k]
Begin © (2002-08-31 21:57:00)Прошу помощи, мастера !
Заполнить сетку картинками можно только обработчиком 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 такую то картинку" ????
Song (2002-09-02 08:47:00) [1]2Begin © (02.09.02 03:11)
DrawGrid1.RePaint надо вставить послеизменения Tag. Я тут понадеялся, что мой пример в самом деле не работает, однако нет, всё ok, так что hands.sys
Begin (2002-09-02 03:11:00) [2]Сеньк всем ! :)
Валерыч (2002-09-02 02:43:00) [3]Перед выводом текста установи цвет шрифта
dim- (2002-09-02 02:07:00) [4]А почему если вставляю:
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 00:40:00) [5]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;
Begin (2002-09-01 22:34:00) [6]Добавлял - не помогает. DrawGrid1 остается пустой, как был ....
Продолжаю пытаться, но оно продолжает неработать...
Song (2002-09-01 22:16:00) [7]Обратите внимание ещё раз на мессагу Song © (01.09.02 21:52)
То что тип не указал - Вы правы, но я и не пробовал этот отрывок, сразу в форме написал.
Begin (2002-09-01 22:05:00) [8]Я понимаю, что это уже смешно .... :) Но ... Song, оно не работает. Во первых, жалуется на строку BitMap:=TBitMap.Create; Если я добавляю в процедуру var BitMap : TBitmap; жаловаться перестает, но после запуска по нажатию Button1 ничего не происходит ....
Хельп !!!!
Song (2002-09-01 21:52:00) [9]Забыл в обрабочики кнопок добавить DrawGrid1.RePaint
Song (2002-09-01 21:46:00) [10]
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;
Begin (2002-09-01 21:35:00) [11]Блин, я тупой, наверное .... Или страдаю недопониманием ... Не выходит ничего... :(
на форме есть Button1, Button2, DrawGrid1, Image1
Если не сложно, можно мне небольшой пример, чтобы при клике Button1 изображение из Image1 помещалось в клетку [3,3], а при клике Button2 убиралось оттуда ????
Begin (2002-09-01 20:04:00) [12]OK, Спасибо всем, будем разбираться... :)
Юрий Зотов (2002-09-01 20:01:00) [13]> К вопросу о скорости приложений ...
Каждый раз когда окно (или его часть) требует перерисовки, вызывается Ваш обработчик. Хотите Вы этого, или нет - он все равно вызывается (если он есть, конечно).
И хоть одну картинку Вы в нем определите, хоть тысячу - неважно. Он все равно вызывается для каждой перерисовываемой ячейки. Хотим - рисуем, хотим - нет. Влияние на скорость здесь косвенное.
> это определяет пользователь во время работы.
И прекрасно.
Как только юзер нажал "ОК", вызывайте Invalidate(Rect)
> Отключить срабатывание onDrawCell при запуске приложения?
Наоборот - назначить обработчик ПОСЛЕ показа формы. В OnShow, а не в Object Inspector.
Song (2002-09-01 19:39:00) [14]Лучше наверно всё-таки InvalidateRect() - так быстрей.
TTCustomDelphiMaster (2002-09-01 19:36:00) [15]Begin ©
Вы похоже еще не допоняли что onDrawCell вызывается для прорисовки ячейки автоматически и туда ничего не надо передавать. В обработчике этого события вам нужно написать код прорисовки 1 ячейки. В параметрах функции передаются координаты ячейки. Пример реализации смотрите в Help - TDrawGrid.OnDrawCell - Example.
После замены одной картинки вызывайте DrawGrid1.Invalidate. Этот метод обновит изображение DrawGrid.
Что рисовать если картинка еще не выбрана пользователем вы должны определить в коде обработчика onDrawCell. А отключать onDrawCell не надо.
PS: Разберитесь с примером из help.
Song (2002-09-01 19:21:00) [16]Вам нужно просто получить описывающий прямоугольник этой ячейки, а можно даже не получать, а просто ввести условие
IF (ARow=ваш_ряд) and (ACol=ваш_столбец) then TStringGrid(Sender).Canvas.Draw(...
Begin (2002-09-01 18:22:00) [17]Please, мастера, помогите ответом, оч нужно ... :)
Begin (2002-09-01 02:52:00) [18]И еще вопрос в догонку.... :) onDrawCell, если он в тексте прописан, вызывается автоматически при создании сетки. Но к этому моменту еще не может быть определено какие именно ячейки заполнять, а какие нет (это определяет пользователь во время работы). Что мне тогда передавать через ARow ACol ? И откуда ? Отключить срабатывание onDrawCell при запуске приложения ?
Begin (2002-09-01 01:17:00) [19]to Юрий Зотов
OK, спасибо за совет, но тем не менее, если можно одно
уточнение
у TStringGrid есть свойство Cells и можно сделать так
Grid1 : TStringGrid
...
Grid1.Cells[1,1]:="!!!!!!!!!!"
неужели для TDrawGrid нет чего то подобного, и для замены только одной картинки я должен перерисовывать всю сетку, с помощью if"а исключая те ячейки, которые трогать не нужно ? А если у меня в сетке, образно говоря, 200 имаджей ??? К вопросу о скорости приложений ...
Заранее благодарен
Юрий Зотов (2002-08-31 23:19:00) [20]> Но этот обработчик, как я понял, при каждом вызове
> перерисовывает всю сетку
Не совсем так. Он вызывается при перерисовке окна (или его части), но для каждой перерисовываемой ячейки.
> помещая в каждую ячейку одно и то же указанное изображение
Почему обязательно "одно и то же"? Разве что-то мешает загонять в каждую ячейку ее собственную картинку? Как раз для таких вещей в обработчик и передаются Row и Col.
> Неужели никак нельзя указать
Можно. Именно так, как Вы уже и сделали.