Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить координаты внутри ячейки StringGrid 
V
    Опции темы
ACMilian
Дата 9.1.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Привет всем!
Есть такой вопрос. Как определить координаты внтури ячейки StringGrida именно Cells[0,0]
Т.е. к примеру, ячейка визуально разделена на верхнюю и нижнюю половину. И если кликаешь на верхнюю половину, то одно действие, а если на нижнюю, то другое.
Элементарно, наверное, но не могу понять как. Хэлп, кто может.
PM MAIL ICQ   Вверх
MetalFan
Дата 9.1.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



CellRect ?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
ACMilian
Дата 9.1.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Вроде нет. Необходимы координаты внутри самой ячейки. В ней находятся два рисунка "Плюс" и "Минус". Один в верхней части ячейки, а второй в нижней. И вот по клику на какой-то из этих рисунков надо, определить на какой именно был произведён клик. 
А CellRect вернёт только координаты прямоугольника ячейки.
PM MAIL ICQ   Вверх
MetalFan
Дата 9.1.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



и что? так раздели прямоугольник ячейки на два... + PtInRect


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
remax
Дата 9.1.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Так обрабатывай событие с рисунка...


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
ACMilian
Дата 9.1.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(remax @ 9.1.2008,  18:23)


MetalFan, сейчас поищу в документации..

remax, Можно пример?
PM MAIL ICQ   Вверх
remax
Дата 9.1.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Пример чего? Ты сам сказал, 
Цитата(ACMilian @  9.1.2008,  17:22 Найти цитируемый пост)
В ней находятся два рисунка "Плюс" и "Минус". Один в верхней части ячейки, а второй в нижней. И вот по клику на какой-то из этих рисунков надо, определить на какой именно был произведён клик. 


Рисунки ты добавляешь динамически, так? Компонент TImage?
Создай процедуру для обработки события OnClick.
Когда создаешь рисунки, добавляй ссылку на эту процедуру. И, скажем, заполняй еще свойство Tag для этих компонент разнными значениями. Например, 1 и 2. 
В самой процедуре ты узнаешь на какой рисунок кликнули через параметр Sender.

Годится?  smile 


Это сообщение отредактировал(а) remax - 9.1.2008, 18:46


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
MetalFan
Дата 9.1.2008, 19:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(remax @  9.1.2008,  18:45 Найти цитируемый пост)
Рисунки ты добавляешь динамически, так? Компонент TImage?

о ужас, если так...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Yanis
Дата 9.1.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Цитата(MetalFan @  9.1.2008,  20:20 Найти цитируемый пост)
о ужас, если так... 

smile
Окстись, в каком ты разделе.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
remax
Дата 9.1.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Цитата(MetalFan @  9.1.2008,  19:20 Найти цитируемый пост)

о ужас, если так... 

А что именно ужас, если не секрет?  smile 


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Yanis
Дата 9.1.2008, 19:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



ЧЕРНОВОЙ код:
Код
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
var
  r: TRect;
begin
  r := StringGrid1.CellRect(ACol, ARow);

  if StringGrid1.ScreenToClient(Mouse.CursorPos).Y > r.Top + ((r.Bottom - r.Top) div 2) then
    ShowMessage('minus')
  else
    ShowMessage('plus');
end;


r.Top -- Y координата верхней границы клетки.
(r.Bottom - r.Top) -- высота клетки
StringGrid1.ScreenToClient(Mouse.CursorPos).Y -- позиция мышиного курсора в координатых StringGrid-а. Т.е. относительно его левого верхнего края


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 9.1.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(remax @  9.1.2008,  19:46 Найти цитируемый пост)
А что именно ужас, если не секрет? 


Цитата(remax @  9.1.2008,  18:45 Найти цитируемый пост)
Рисунки ты добавляешь динамически, так? Компонент TImage?


т.о. если допустим 100 ячеек, то будет создано 200 компонентов TImage? жэсть


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
remax
Дата 9.1.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Цитата(MetalFan @  9.1.2008,  20:59 Найти цитируемый пост)
т.о. если допустим 100 ячеек, то будет создано 200 компонентов TImage?

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

Когда потребовалось обеспечить контроль ввода данных в ячейку, то использовался дополнительный TJvCalcEdit. При обращении к данным текущей ячейки, он автоматически подстраивал свой размер под ячейку и принимал данные из нее. При завершении редактирования данные копировались обратно в ячейку, а JvCalcEdit прятался.

Здесь, возможно, (а точнее можно узнать только у автора темы) предполагается изменение значения в соседней ячейке. Принцип тот же. По мере необходимости создаем (делаем видимыми) доп.элементы управления (картинки). После использования (перевод фокуса на другую ячейку) передвигаем эти элементы. Выходим за границу грида - убиваем (или прячем) эти две картинки. т.е. в любой момент времени у нас этих картинок не больше двух.


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
ACMilian
Дата 10.1.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Вот этот код подошёл. Только деление поменял.
Код

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
var
  r: TRect;
begin
  r := StringGrid1.CellRect(ACol, ARow);
  if StringGrid1.ScreenToClient(Mouse.CursorPos).Y > r.Top + ((r.Bottom - r.Top) / 2) then
    ShowMessage('minus')
  else
    ShowMessage('plus');
end;


По поводу зачем мне это надо. 
В гриде в ячейке [0,0] вносятся плюс и минус. Это фиксированная строка, дальше в ней идут заголовки столбцов. Картинки я биру из ImageList. И рисую их в событии DrawCell. Картинок всего 4(+ и - серого цвета и  + и - синего цвета). + и - синего цвета рисутются только в ячейку [0,0].  Использую их для того чтобы по клику можно было полностью "раскрывать" СтринГрид или "закрывать". А + и -  серого цвета вносятся в 0 столбце по каждой строке и раскрывают или закрывают только одну сторку. Вот в принципе и всё.

Всем спасибо. 
PM MAIL ICQ   Вверх
dumb
Дата 10.1.2008, 17:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



Цитата(ACMilian @  10.1.2008,  10:40 Найти цитируемый пост)
Использую их для того чтобы по клику можно было полностью "раскрывать" СтринГрид или "закрывать"
может проще было Virtual Treeview использовать? smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0755 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.