TStringGrid и редактирование ячеек
Есть такая задачка. В TStringGrid в качестве редактора в колонке нужно подцепить для одного столбца TListBox, а в другом TDateTimePicker.
Что-то все, что приходит в голову сплошной гемор. Может есть какие мысли? Или компоненту какую подскажете?.
Господа прогарммисты!
Есть такая задачка. В TStringGrid в качестве редактора в колонке нужно подцепить для одного столбца TListBox, а в другом TDateTimePicker.
Что-то все, что приходит в голову сплошной гемор. Может есть какие мысли? Или компоненту какую подскажете?.
1. Создать список со стилем WS_BORDER|WS_POPUP. 2. Родителем сделать GetDesktopWindow().
3. В нужный момент (например по клику мышки на ячейке):
- расчитать положение списка (это под ячейкой);
- отобразить список.
4. Для списка обработать:
- MouseMove (для подсветки эл. списка под мышью);
- MouseUp (для выбора значения).
5. Скрыть список когда:
- произошел выбор элемента из списка см. 4.2
- список отображен и произошел клик на др. ячейке;
- Форма получила WM_NCLBUTTONDOWN, WM_ACTIVATEAPP, сетка получила WM_KILLFOCUS и какое-либо подтверждение ввода (обычно ENTER).
6. Т. к. при отображенном списке фокус все равно на сетке, то надо перенаправить нажатие стрелок вверх вниз списку.
1. Создать список со стилем WS_BORDER|WS_POPUP. 2. Родителем сделать GetDesktopWindow().
3. В нужный момент (например по клику мышки на ячейке):
- расчитать положение списка (это под ячейкой);
- отобразить список.
4. Для списка обработать:
- MouseMove (для подсветки эл. списка под мышью);
- MouseUp (для выбора значения).
5. Скрыть список когда:
- произошел выбор элемента из списка см. 4.2
- список отображен и произошел клик на др. ячейке;
- Форма получила WM_NCLBUTTONDOWN, WM_ACTIVATEAPP, сетка получила WM_KILLFOCUS и какое-либо подтверждение ввода (обычно ENTER).
6. Т. к. при отображенном списке фокус все равно на сетке, то надо перенаправить нажатие стрелок вверх вниз списку.
Спасибо. Я приблизительно так и сделал. Хотел свою визуальную компоненту на основе TStringGrid заваять но не получается по нормальному создать propertis TListBox* Editor; Как то глючит все и вываливает в коре.
Спасибо. Я приблизительно так и сделал. Хотел свою визуальную компоненту на основе TStringGrid заваять но не получается по нормальному создать propertis TListBox* Editor; Как то глючит все и вываливает в коре.
С коспонентом будут проблемы с обработкой WM_NCLBUTTONDOWN, WM_ACTIVATEAPP. Попробуй такой фокус. Сохрани проект (на всякий случай), посади Object Inspector на Class Explorer. В инспекроте открой св-во типа Color, а теперь передвинь инспектор за заголовок.
Скинь код посмотрю (если не жалко конечно интеллектуальная собственность ведь).
С коспонентом будут проблемы с обработкой WM_NCLBUTTONDOWN, WM_ACTIVATEAPP. Попробуй такой фокус. Сохрани проект (на всякий случай), посади Object Inspector на Class Explorer. В инспекроте открой св-во типа Color, а теперь передвинь инспектор за заголовок.
Скинь код посмотрю (если не жалко конечно интеллектуальная собственность ведь).
На компоненту забил. Времени нет, пора уже проект сдавать. А сделал я так:
//Dates - таблица ввода дат, дата вводится в столбце №1
//DateEdit1 - TDateTimePicker элемент для ввода даты.
void __fastcall T_FModFirm::GridsDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if(ACol == 1)
{
if(State.Contains(gdSelected))
{
DateEdit1->Left = Dates->Left+Rect.Left+3;
DateEdit1->Top = Dates->Top+Rect.Top+3;
DateEdit1->Height = Rect.Height();
DateEdit1->Width = Rect.Width();
DateEdit1->Text = Dates->Cells[ACol][ARow];
DateEdit1->Visible = true;
}
else
{
DateEdit1->Visible = false;
}
}
else
DateEdit1->Visible = false;
}
[/COLOR]
Спасибо за помощь. Вместе думать веселей и полезней.