Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2009, 19:24   #1
Marx88
 
Регистрация: 26.11.2009
Сообщений: 9
По умолчанию DBGrid и DateTimePicker

Использую компонент DBGrid для отображения содержимого таблицы БД. В ней есть поле типа Date. Когда происходит редактирование строки таблицы, нужно чтобы при нажатии на поле (типа Date) выскакивал календарь, т.е. каждое поле колонки реализует функции компонента DateTimePicker. Как это можно реализовать? Может кто уже встречался с такой проблемой?


Заранее благодарен
Marx88 вне форума Ответить с цитированием
Старый 08.12.2009, 22:14   #2
rockedit
Форумчанин
 
Аватар для rockedit
 
Регистрация: 18.03.2009
Сообщений: 109
По умолчанию

Не сталкивался с такой проблемой, но етсь предложения, для столбца типа дата создай событие OnChange и в нем можешь попробовтаь описать работу с DateTimePicker
Мозг человека обычно загружен лишь на 10% своей мощности; остальное резерв для опереционной системы. Если помог не пожалей "+", это лучшее спасибо
rockedit вне форума Ответить с цитированием
Старый 08.12.2009, 23:46   #3
Droid
Форумчанин
 
Аватар для Droid
 
Регистрация: 24.04.2008
Сообщений: 440
Счастье

Цитата:
Сообщение от Marx88 Посмотреть сообщение
Использую компонент DBGrid для отображения содержимого таблицы БД. В ней есть поле типа Date. Когда происходит редактирование строки таблицы, нужно чтобы при нажатии на поле (типа Date) выскакивал календарь, т.е. каждое поле колонки реализует функции компонента DateTimePicker. Как это можно реализовать? Может кто уже встречался с такой проблемой?


Заранее благодарен
тут есть такой вариант, причем я знаю только единственный способ его )
Способ такой: берешь компонент и ставишь его поверх значения даты, вот в принцепе и все, главное теперь не ошибится в коде, я делал такое очень геморойно...
1 старый программист, лучше новых 2-х
Droid вне форума Ответить с цитированием
Старый 08.12.2009, 23:54   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот, попробуйте:
Код:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = 'MyDate') then
    with DateTimePicker do 
    begin
      Left := Rect.Left + DBGrid1.Left + 1;
      Top := Rect.Top + DBGrid1.Top + 1;
      Width := Rect.Right - Rect.Left + 2;
      Width := Rect.Right - Rect.Left + 2;
      Height := Rect.Bottom - Rect.Top + 2;
      Visible := True;
    end;
  end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  if DBGrid1.SelectedField.FieldName = 'MyDate' then 
    DateTimePicker.Visible := False;
end;

procedure TForm1.DBGrid1KeyPress
(Sender: TObject; var Key: Char);
begin
  if (key = Chr(9)) then Exit; // код табуляции
  if (DBGrid1.SelectedField.FieldName = 'MyDate') then
  begin
    DateTimePicker.SetFocus;
    SendMessage(DateTimePicker.Handle, WM_Char, word(Key), 0);
  end;
end;

procedure TForm1.DateTimePickerChange(Sender: TObject);
begin
  if DBGrid1.DataSource.State in [dsEdit, dsInsert] then
    ADOTable1MyDate.Value := DateTimePicker.DateTime;
end;

procedure TForm1.DateTimePickerDropDown(Sender: TObject);
begin
  DBGrid1.DataSource.Edit;
end;
mihali4 вне форума Ответить с цитированием
Старый 09.12.2009, 00:37   #5
Marx88
 
Регистрация: 26.11.2009
Сообщений: 9
По умолчанию

Спасибо огромное,это очень помогло!!! Но я использую не объект ADOTable1, а просто Table1 (компонент TTable). Поэтому преобразовал код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  ExtCtrls, DBCtrls, DB, DBTables, Grids, DBGrids, Menus, ComCtrls,
  StdCtrls;

type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Table1: TTable;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    DateTimePicker1: TDateTimePicker;
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid1ColExit(Sender: TObject);
    procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure DateTimePicker1Change(Sender: TObject);
    procedure DateTimePicker1DropDown(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = 'Последний платеж') then
    with DateTimePicker1 do
    begin
      Left := Rect.Left + DBGrid1.Left + 1;
      Top := Rect.Top + DBGrid1.Top + 1;
      Width := Rect.Right - Rect.Left + 2;
      Width := Rect.Right - Rect.Left + 2;
      Height := Rect.Bottom - Rect.Top + 2;
      Visible := True;
    end;
  end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  if DBGrid1.SelectedField.FieldName = 'Последний платеж' then
    DateTimePicker1.Visible := False;
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if (key = Chr(9)) then Exit; // код табуляции
  if (DBGrid1.SelectedField.FieldName = 'Последний платеж') then
  begin
    DateTimePicker1.SetFocus;
    SendMessage(DateTimePicker1.Handle, WM_Char, word(Key), 0);
  end;
end;



procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  if DBGrid1.DataSource.State in [dsEdit, dsInsert] then
    DBGrid1.SelectedField.Value:=DateTimePicker1.DateTime;
end;

procedure TForm1.DateTimePicker1DropDown(Sender: TObject);
begin
    DBGrid1.DataSource.Edit;
end;

end.
Но почему-то выскакивает сообщение об ошибке, когда пытаешься изменить дату в первой строке. Сообщение об ошибке:
Record locked by another user.
Table: C:\DB222\PART.DB
User: <какое-то непонятное имя, видимо из-за кодировки>

Из-за чего не пойму. Может что-то неправильно изменил?

P.S. Извиняюсь за глупые вопросы, это мое первое приложение с БД

Последний раз редактировалось mihali4; 09.12.2009 в 01:15.
Marx88 вне форума Ответить с цитированием
Старый 09.12.2009, 01:18   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Судя по всему - БД Парадокс ?
Это блокировка файлом С:\PDOXUSRS.NET
Нужно закрыть DataBaseDesktop и другие программы, которые могут обращаться к таблице.
Возможно, придется перезапустить Дельфи.
mihali4 вне форума Ответить с цитированием
Старый 09.12.2009, 01:38   #7
Marx88
 
Регистрация: 26.11.2009
Сообщений: 9
По умолчанию

Да все правильно БД - Парадокс.
Спасибо, так и сделал - все работает!

Последний раз редактировалось mihali4; 09.12.2009 в 02:15.
Marx88 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по DateTimePicker MasterofCDM Компоненты Delphi 3 01.04.2009 10:36
DateTimePicker в будильнике DeFREEnd Компоненты Delphi 11 15.01.2009 10:14
показания DateTimePicker при нажатии Buttons перенести в колонку DBGrid Alex_76 Помощь студентам 1 14.07.2008 15:55
DateTimePicker в DBGrid Alex_76 Помощь студентам 4 20.06.2008 15:21
DateTimePicker и API Андрей= Win Api 5 22.04.2008 15:21