Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему не вываливается DateDime picker  (Прочитано 10727 раз)
0 Пользователей и 1 Гость смотрят эту тему.
monrus
Опытный

ru
Offline 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
Опытный

ru
Offline Offline

« Ответ #1 : 31-01-2006 14:39 » 

ну че, никто не знает?
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 01-02-2006 14:55 » 

Какая версия Делфи? Как "ЗАсовывал"?  Если можно, то пожалуйста приведите фрагменты кода.
Записан

С уважением, Oldy.
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #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
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ru
Offline Offline

« Ответ #5 : 04-02-2006 08:45 » 

оно работает, но как-то странно. пикер вываливается., но при выборе даты она заносится в ячейку, где од этого был курсор.
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #6 : 04-02-2006 20:18 » 

Код в студию.
Записан
monrus
Опытный

ru
Offline 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
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #8 : 05-02-2006 13:52 » 

Как я понимаю, это ты в событии SelectCell делаешь. По данному событию все должно работать. Наверно где то в другом месте проблема, показывай весь код или хотябы все что связано с стринггридом и пикером.
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #10 : 06-02-2006 04:35 » 

RomCom, это же обработчик события, а не перегружаемая функция класса-предка и не перехватываемое сообщение, здесь inherited ничего не даст.
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Опытный

ru
Offline Offline

« Ответ #12 : 07-02-2006 00:27 » 

вот пример

* qqq.rar (9.85 Кб - загружено 707 раз.)
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ru
Offline Offline

« Ответ #14 : 08-02-2006 15:32 » 

спасибо, zubr, за интересное решение, но почему тогда комбик нормально работает?
Записан
monrus
Опытный

ru
Offline Offline

« Ответ #15 : 08-02-2006 15:34 » 

или без
 DT2.Perform(WM_KEYDOWN, VK_F4, 0);
    DT2.Perform(WM_KEYUP, VK_F4, 0);
тоже работает?
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #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 еще не завершилось стринггрид "не понимает", что выбранная ячейка изменилась и выдает адрес предыдущей ячейки.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines