Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-35890
RangerBetta
2002-08-19 10:18
2002.09.12
В чем проекторовать БД InterBase


1-35649
Mazenrat
2002-08-31 15:40
2002.09.12
Как зарегистрировать гарячие клавиши в приложении???


3-35545
KSergey
2002-08-19 14:59
2002.09.12
ADO и


14-35851
AL2002
2002-08-16 11:08
2002.09.12
Это много?..


14-35879
alex_ch
2002-08-18 16:47
2002.09.12
rxlib for 5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский