procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
Подскажите пожалуйста как можно эту процедуру вызвать из какого-либо участка кода?
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Вызов события, OnDrawCell |
Cheburashka |
Сообщение
#1
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
В общем я хочу чтобы у меня после какого-то действия вызывалась процедура OnDrawCell для StringGrid'a.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Подскажите пожалуйста как можно эту процедуру вызвать из какого-либо участка кода? -------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
Unconnected |
Сообщение
#2
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Ну так и вызываешь, form1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
Cheburashka |
Сообщение
#3
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
Так ему Sender не нравится...
Пишет следующее Цитата(Delphi) [Error] Unit1.pas(79): Undeclared identifier: 'Sender' -------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
volvo |
Сообщение
#4
|
Гость |
Цитата я хочу чтобы у меня после какого-то действия вызывалась процедура OnDrawCell для StringGrid'a. Налицо ошибка проектирования. Событие не должно вызываться, оно должно происходить. Как только событие произойдет - будет вызван и обработчик события.Можно посмотреть код, зачем тебе понадобилось вызывать OnDrawCell вручную? А если в это время ячейка, для которой будет вызван OnDrawCell, невидима (не находится на экране, а прокручена, например, вверх)? |
Cheburashka |
Сообщение
#5
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
Что касается видимости ячеек, то этого у меня не произойдет. Поле небольшое и всё размещено на форме под нужные размеры.
Я просто хочу сделать так, чтобы у меня сначала нарисовались в каких-либо ячейках изображения. А потом также продолжать их рисовать при определенных действиях. Как я понял OnDrawCell для этого лучше не использовать? И можно ли каким-либо другим способом рисовать в ячейках StringGrid? For i := 1 to 5 do begin -------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
volvo |
Сообщение
#6
|
Гость |
Цитата Как я понял OnDrawCell для этого лучше не использовать? И можно ли каким-либо другим способом рисовать в ячейках StringGrid? Похоже, ты не понимаешь основ событийного программирования.Смотри: для того, чтобы рисовать в ячейке Грида, нужно определить обработчик события OnDrawCell. Но вот когда это событие произойдет - не от тебя зависит. Оно произойдет тогда, когда система должна будет перерисовать ячейку. То есть, провел ты над своей программой окно блокнота, когда твое окно снова стало видимым - ячейки должны перерисоваться. Тогда происходит событие, которое вызывает обработчик, написанный тобой. Понимаешь? Не ты вызываешь что-то, а операционная система, зная, что участок окна был невидимым, а потом опять стал видимым, решает: "чтобы не потерять содержимое окна, надо его перерисовать", и делает то, что нужно для этого. Среди прочих действий системы вызывается и определенное тобой в OnDrawCell действие. То есть, для того, чтобы инициировать перерисовку ячеек, тебе надо действовать другими методами, а не прямым вызовом обработчика OnDrawCell... Еще раз: Что именно ты хочешь рисовать, и при каких именно (слово "определенных" меня не устраивает, чтобы дать тебе ответ, я просто не смогу ничего посоветовать) условиях ячейки должны перерисовываться, и как именно перерисовываться? |
Cheburashka |
Сообщение
#7
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
Хорошо объясню ситуацию по конкретнее. Спасибо что рассказали про OnDrawCell, просто в интернете мало информации про это и у меня сложилось не правильное мнение о событие.
Когда-то я писал, что делаю небольшую игру. В общем для начала мне нужно вывести несколько изображений в СтрингГрид - это при начальных условиях. А потом после выделения ячейки с изображением передвинуть его в свободное место. После этого действия может произойти две вещи: 1) Добавятся новые изображения на поле (рандом). 2) Часть изображений исчезнут. Как мне лучше это осуществить? -------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
volvo |
Сообщение
#8
|
Гость |
Цитата Как мне лучше это осуществить? Не использовать StringGrid для работы с изображениями - это во-первых.Я бы сделал проще: сгенерировал бы (автоматически, разумеется, тебе же известны размеры изображений, раз у тебя "всё размещено на форме под нужные размеры") нужное количество панелей (TPanel), на каждую из которых опять же автоматически положил бы TImage. Вот и все, собственно. TImage приспособлен для работы с изображениями, вот и пусть работает. В любую секунду можно обратиться к любому изображению напрямую, и перенести его с одного места в другое. И не надо извращаться с событиями... |
Cheburashka |
Сообщение
#9
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
Вы везде употребляете слово "автоматически". А как это сделать? Просто опыта пока, что маловато
-------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
Unconnected |
Сообщение
#10
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Ну наверное имелось в виду при запуске программы создать нужное количество панелей и на них закинуть картинки. Если количество картинок заранее известно, можешь создать панели при проектировании вручную, если неизвестно - динамически.
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
Сообщение
#11
|
Гость |
Когда я говорю "автоматически" - подразумевается, конечно, "во время работы программы". То есть, я не стал бы бросать все эти панели и изображения в режиме редактирования формы, потом с ними замучаешься разбираться, что где. А сделал бы вот так:
Тут код (Показать/Скрыть)
Вот чего получается на форме после того, как я сначала нажал кнопку "Создать", а потом - "Изменить": К тому же, как ты заметил я показал еще и как обрабатывать клик по панельке (или по изображению), если понадобится... По-моему, этот способ гораздо проще, чем кидать компоненты на форму, выравнивать их, да еще и запоминать, какой компонент как называется, или пользоваться неподходящими компонентами типа StringGrid-а. Добавлено через 3 мин. Цитата Если количество картинок заранее известно, можешь создать панели при проектировании вручную И ты туда же... Ну, брошу я эти 100 картинок вручную. А как потом к ним обращаться? Мне вот надо перенести первую картинку во втором ряду на 4 ряда ниже. Я что, должен помнить, как пронумерованы картинки? А оно мне надо, если можно обращаться к любому изображению, как к обычному элементу массива? |
Cheburashka |
Сообщение
#12
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
Действительно, оказывается всё настолько просто Спасибо за код, но у меня есть ещё пара вопросов по данному коду.
Во-первых, что такое SetLength? И для чего он нужен? img := (ArrPanels[2, 2].Components[0] as TImage); Зачем мы пишем Components[0]? И что мы делаем во второй строке? И ещё, вот в процедурах myPanelClick и myImageClick, что мы в них делаем? В myPanelClick, как я понял, мы меняем рамку панели, или я не прав? Сообщение отредактировано: Сергей Меркурьев - -------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
Client |
Сообщение
#13
|
Профи Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
Цитата И ещё, вот в процедурах myPanelClick и myImageClick, что мы в них делаем? Думаю, что этот обработчик надо установить для всех форм и имеджей на щелчок |
volvo |
Сообщение
#14
|
Гость |
Цитата Зачем мы пишем Components[0]? Комментарии к коду читал? Там все написано.А во второй строке - если у нас уже есть изображение в TImage, то перед тем, как заносить новую картинку, надо прежнюю-то удалить (для этого в img.Picture присваивается nil.) Цитата И ещё, вот в процедурах myPanelClick и myImageClick, что мы в них делаем? Это пример того, как обрабатывать события. Если ты положил на форму панель, то там все просто, заходишь в список обработчиков, щелкаешь на нужный тебе, и вписываешь нужное действие. А если делаешь все во время выполнения? Как назначить обработчик? Выбрать-то не из чего, форма - пустая в дизайнере... Вот я и показал, как назначить обработку событий. Попробуй, запусти мой код и щелкни мышью на какой-нибудь картинке. Увидишь, что событие обработается...Цитата этот обработчик надо установить для всех форм и имеджей на щелчок Не форм, а панелей. |
Cheburashka |
Сообщение
#15
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
Спасибо!
-------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
Cheburashka |
Сообщение
#16
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
А вот еще один вопрос по поводу первых процедур - Допустим, я нажал на определенный компонент TImage, и как в этих процедурах узнать какие координаты имеет TImage (в массиве ArrPanels)?
-------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
volvo |
Сообщение
#17
|
Гость |
Ну, например, написать вот такую вот функцию:
Читай комментарии внимательно. Там есть два вопроса для тебя Я очень хотел бы, чтобы ты на них ответил. Это важно. |
Cheburashka |
Сообщение
#18
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
А как сделать обмен таких изображений, зная координаты обоих TImage?
И как Sender может быть другого типа в данном случае? Мы же ведь обращаемся конкретно по клику на изображение. И мне кажется, что он не может быть другим Сообщение отредактировано: Сергей Меркурьев - -------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
Client |
Сообщение
#19
|
Профи Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
Цитата А как сделать обмен таких изображений, зная координаты обоих TImage? А что ты делаешь если надо поменять 2 переменные целого типа? добавляешь 3 переменную того же типа и с ее помощью меняешь первые две. В данном случае - TImage |
Cheburashka |
Сообщение
#20
|
Бывалый Группа: Пользователи Сообщений: 195 Пол: Мужской Реальное имя: Сергей Репутация: 2 |
b1 := arrPanels[x,y].Components[0] as TImage; пытался сделать что-то типа этого... не вышло в итоге -------------------- ♣♣♣
"Себя великим не считай, гордясь величьем предков, Величья не добудешь ты и золота ценою! Хоть светит на небе луна, но отраженным светом - Чужою славой не живи, не будь второй луною!!!" ♣♣♣ |
Текстовая версия | 11.01.2025 19:40 |