monrus
Опытный
Offline
|
|
« : 29-01-2006 17:37 » |
|
ЗАсунул я в StringGrid DateDimePicker. При нажатии на определенную ячейку в ячейке появляется определенная дата. А мне нужно чтобы вываливался сам DateDimePicker. А он вываливается если нажимаешь на кнопочку вываливания. При установке DroppedDown:=True вываливается ошибка: [Pascal Error] Unit1.pas(889): E2129 Cannot assign to a read-only property
хотя если поставить комбобокс и установить DroppedDown:=True, то при выборе определенной ячейки он сразу вываливается. Помогите разобраться.
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #1 : 31-01-2006 14:39 » |
|
ну че, никто не знает?
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #2 : 01-02-2006 14:55 » |
|
Какая версия Делфи? Как "ЗАсовывал"? Если можно, то пожалуйста приведите фрагменты кода.
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
zubr
Гость
|
|
« Ответ #3 : 02-02-2006 07:34 » |
|
При установке DroppedDown:=True вываливается ошибка: [Pascal Error] Unit1.pas(889): E2129 Cannot assign to a read-only property Ну так естественно, для TDateDimePicker данное свойство только для чтения, оно только сообщает что компонент вывалился. Глянь исходники на компонент. Чтобы сделать как ты хочешь, сдается мне надо компоненту посылать сообщение WM_NOTIFY с определенными параметрами. Короче поройся в исходниках TDateDimePicker или посмотри в MSDN WM_NOTIFY.
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #4 : 02-02-2006 17:44 » |
|
Вообще то можно сделать так: procedure TForm1.DateTimePicker1Click(Sender: TObject); begin DateTimePicker1.Perform(WM_KEYDOWN, VK_F4, 0); DateTimePicker1.Perform(WM_KEYUP, VK_F4, 0); end;
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #5 : 04-02-2006 08:45 » |
|
оно работает, но как-то странно. пикер вываливается., но при выборе даты она заносится в ячейку, где од этого был курсор.
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #6 : 04-02-2006 20:18 » |
|
Код в студию.
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #7 : 05-02-2006 08:07 » |
|
у меня в СтрингГриде в 5-й строке установлен ДейтТаймПикер. Допустим, на жал я на ячейку в 4-й строке, а затем в 5-й. Вываливается пикер, я выбираю дату, но ДАТА УСТАНАВЛИВАЕТСЯ В ЯЧЕЙКЕ 4-Й СТРОКИ, которая до этого была выделена. Почему? if ARow=5 then // если нажата строка 5 begin R := SG2.CellRect(ACol, ARow); // SG2 - StringGrid R.Left := R.Left + SG2.Left; R.Right := R.Right + SG2.Left; R.Top := R.Top + SG2.Top; R.Bottom := R.Bottom + SG2.Top; DT2.Left := R.Left + 1; // DT2 - DateTimePicker DT2.Top := R.Top + 1; DT2.Width := (R.Right + 1) - R.Left; DT2.Height := (R.Bottom + 1) - R.Top; DT2.Visible := True; DT2.SetFocus; DT2.Perform(WM_KEYDOWN, VK_F4, 0); DT2.Perform(WM_KEYUP, VK_F4, 0); //DT2.DroppedDown:=True; end
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #8 : 05-02-2006 13:52 » |
|
Как я понимаю, это ты в событии SelectCell делаешь. По данному событию все должно работать. Наверно где то в другом месте проблема, показывай весь код или хотябы все что связано с стринггридом и пикером.
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #9 : 06-02-2006 04:18 » |
|
if ARow=5 then begin Col:=ACol; Row:=ARow; .... end;
procedure TForm1.DT2Change(Sender: TObject); begin SG2.Cells[Col,Row]:=DateTimeToStr(DT2.DateTime); end;
|
|
« Последнее редактирование: 06-02-2006 04:29 от RomCom »
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
zubr
Гость
|
|
« Ответ #10 : 06-02-2006 04:35 » |
|
RomCom, это же обработчик события, а не перегружаемая функция класса-предка и не перехватываемое сообщение, здесь inherited ничего не даст.
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #11 : 06-02-2006 04:54 » |
|
RomCom, это же обработчик события, а не перегружаемая функция класса-предка и не перехватываемое сообщение, здесь inherited ничего не даст.
Извиняюсь, понедельник день тяжелый. Отправил и только потом понял что написал бред. Испаравил. С сохранением Col:=ACol; Row:=ARow; у меня работает.
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #12 : 07-02-2006 00:27 » |
|
вот пример
|
qqq.rar (9.85 Кб - загружено 850 раз.)
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #13 : 07-02-2006 08:34 » |
|
monrus, проблема в том, что ты пытаешься в событии DT2Change, вставить выбранное значение пикера в выбранную ячейку стринггрида, но событие DT2Change происходит раньше чем закончится SG2SelectCell, поэтому значение попадает в предыдущую выбранную ячейку. Как вариант решения данной проблемы, создаем 2 глобальных переменных, в которых будем сохранять значения строки и столбца выбранного пикера: public { Public declarations } ColSelect:Integer; RowSelect:Integer; end;
procedure TForm1.FormCreate(Sender: TObject); begin ColSelect:=SG2.Col; RowSelect:=SG2.Row; end;
else if ARow=5 then begin Memo1.Visible:=False; Sex.Visible:=False;
R := SG2.CellRect(ACol, ARow); R.Left := R.Left + SG2.Left; R.Right := R.Right + SG2.Left; R.Top := R.Top + SG2.Top; R.Bottom := R.Bottom + SG2.Top; DT2.Left := R.Left + 1; DT2.Top := R.Top + 1; DT2.Width := (R.Right + 1) - R.Left; DT2.Height := (R.Bottom + 1) - R.Top; DT2.Visible := True; ColSelect:=ACol; RowSelect:=ARow; DT2.SetFocus; DT2.Perform(WM_KEYDOWN, VK_F4, 0); DT2.Perform(WM_KEYUP, VK_F4, 0);
И убери CanSelect := True; - это бесполезно.
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #14 : 08-02-2006 15:32 » |
|
спасибо, zubr, за интересное решение, но почему тогда комбик нормально работает?
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #15 : 08-02-2006 15:34 » |
|
или без DT2.Perform(WM_KEYDOWN, VK_F4, 0); DT2.Perform(WM_KEYUP, VK_F4, 0); тоже работает?
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #16 : 08-02-2006 22:35 » |
|
почему тогда комбик нормально работает? Комбик и пикер совсем разные компоненты. Если смотреть по иерархии классов, то они "дальние родственники". или без DT2.Perform(WM_KEYDOWN, VK_F4, 0); DT2.Perform(WM_KEYUP, VK_F4, 0); тоже работает? Потому что имитируя нажатие кнопки F4 действие происходит внутри обработчика SelectCell и пока пользователь дату не выберет, событие SelectCell не завершится. Изменение значения ячейки стринггрида ты делаешь в событии пикера OnChange, которое происходит внутри события SelectCell, а так как SelectCell еще не завершилось стринггрид "не понимает", что выбранная ячейка изменилась и выдает адрес предыдущей ячейки.
|
|
|
Записан
|
|
|
|
|