Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c