![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIntegerField.EditMask [D7]
alehan © (2006-09-19 18:43:00)В базе время храниться в секундах, пользователь видит и вводит его по маске nn:ss. На форме ClientDataSet с двумя Integer-полями, DataSource и DBGrid. У полей заданы события OnSetText и OnGetText и св-во EditMask.
Код:
TForm1 = class(TForm)
ClientDataSet: TClientDataSet;
ClientDataSetN1: TIntegerField;
ClientDataSetN2: TIntegerField;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
procedure FormCreate(Sender: TObject);
procedure ClientDataSetNGetText(Sender: TField; var Text: String; DisplayText: Boolean);
procedure ClientDataSetNSetText(Sender: TField; const Text: String);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientDataSetN1.EditMask:='99\:99;1;_';
ClientDataSetN2.EditMask:='99\:99;1;_';
ClientDataSet.CreateDataSet;
end;
procedure TForm1.ClientDataSetNGetText(Sender: TField; var Text: String; DisplayText: Boolean);
var i, j: integer;
begin
i:=Sender.AsInteger;
j:=i mod 60; Text:=IntToStr(j); if j<=9 then Text:='0'+Text;
i:=(i-j) div 60; Text:=IntToStr(i)+':'+Text; if i<=9 then Text:='0'+Text;
end;
procedure TForm1.ClientDataSetNSetText(Sender: TField; const Text: String);
begin
//ShowMessage(Text);
Sender.AsInteger:=60*StrToIntDef(copy(Text,1,2),0)+StrToIntDef(copy(Text,4,2),0);
end;
Если вводить вручную - всё работает нормально.
Но если копировать в DBGrid из буфера обмена (строку типа "12:34") - при переходе в другой столбец значение сбрасывается на старое. Закомментированный ShowMessage в OnSetText показывает тоже старое значение.
Кто-нибудь делал что-то похожее? Помогите! Спасибо.
alehan (2006-09-20 13:15:00) [1]В Delphi2006 тоже самое.
TJvDBGrid ведёт себя также.
А вот обычный TDBEdit - работает нормально. Т.е. воспринимает ввод через буфер обмена. Т.е. дело именно в DBGrid.
Ну хоть посочувствовал бы кто!