Автор: Dennica
Дата сообщения: 31.08.2007 10:44
Samara123
Если view связан с данными из датасета, то применять SetValue для установки значений нельзя. Нужно изменять сам датасет. Для такой задачи датасет должен естественно быть кэшыруемым, т.е. CachedUpdates должно стоять true. Вообще, если бы я начал делать эту задачу, то скорее всего вместо PropertiesValidate воспользовался бы OnUpdateData эвентом TDataSource. Попробую счас накидать код в качестве разминки.
Добавлено:
Samara123
Вроде работает...
Текст pas [more]unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage,
cxEdit, DB, cxDBData, cxGridCustomTableView, cxGridTableView,
cxGridDBTableView, dxmdaset, cxGridLevel, cxClasses, cxControls,
cxGridCustomView, cxGrid, cxCalendar;
type
TForm2 = class(TForm)
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
dxMemData1: TdxMemData;
dxMemData1ds: TDateTimeField;
dxMemData1de: TDateTimeField;
DataSource1: TDataSource;
cxGrid1DBTableView1RecId: TcxGridDBColumn;
cxGrid1DBTableView1ds: TcxGridDBColumn;
cxGrid1DBTableView1de: TcxGridDBColumn;
procedure DataSource1UpdateData(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.DataSource1UpdateData(Sender: TObject);
var
bm: Pointer;
cds, cde: Variant;
begin
with dxMemData1 do begin
dxMemData1.DisableControls;
bm := dxMemData1.GetBookmark;
try
cds := FieldByName('ds').Value;
cde := FieldByName('de').Value;
// Если изменилась дата начала периода
if cds <> FieldByName('ds').OldValue then begin
// Если первая запись, не даем менять дату начала периода
if RecNo = 1 then begin
Edit;
FieldValues['ds'] := FieldByName('ds').OldValue;
Post;
end else begin
Prior;
Edit;
FieldValues['de'] := cds;
Post;
end;
// Если изменилась дата конца периода
end else if cde <> FieldByName('de').OldValue then begin
// Если последняя запись, не даем менять дату конца периода
if RecNo = RecordCount then begin
Edit;
FieldValues['de'] := FieldByName('de').OldValue;
Post;
end else begin
Next;
Edit;
FieldValues['ds'] := cde;
Post;
end;
end else
Exit;
GotoBookmark(bm);
finally
FreeBookmark(bm);
EnableControls;
end;
end;
end;
end.[/more]
Текст dfm [more]object Form2: TForm2
Left = 0
Top = 0
Caption = 'Form2'
ClientHeight = 286
ClientWidth = 426
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object cxGrid1: TcxGrid
Left = 0
Top = 0
Width = 426
Height = 241
Align = alTop
TabOrder = 0
object cxGrid1DBTableView1: TcxGridDBTableView
NavigatorButtons.ConfirmDelete = False
DataController.DataSource = DataSource1
DataController.KeyFieldNames = 'ds'
DataController.Options = [dcoAssignGroupingValues, dcoAssignMasterDetailKeys, dcoSaveExpanding, dcoImmediatePost]
DataController.Summary.DefaultGroupSummaryItems = <>
DataController.Summary.FooterSummaryItems = <>
DataController.Summary.SummaryGroups = <>
OptionsData.Deleting = False
OptionsData.Inserting = False
object cxGrid1DBTableView1RecId: TcxGridDBColumn
DataBinding.FieldName = 'RecId'
Visible = False
end
object cxGrid1DBTableView1ds: TcxGridDBColumn
DataBinding.FieldName = 'ds'
PropertiesClassName = 'TcxDateEditProperties'
Properties.ImmediatePost = True
end
object cxGrid1DBTableView1de: TcxGridDBColumn
DataBinding.FieldName = 'de'
PropertiesClassName = 'TcxDateEditProperties'
Properties.ImmediatePost = True
end
end
object cxGrid1Level1: TcxGridLevel
GridView = cxGrid1DBTableView1
end
end
object dxMemData1: TdxMemData
Active = True
Indexes = <>
Persistent.Data = {
5665728FC2F5285C8FFE3F02000000080000000B000300647300080000000B00
03006465000100009E7083C9CC420100003043D3C9CC420100003043D3C9CC42
010000385C1BCACC42010000385C1BCACC42010000CA2E6BCACC42010000CA2E
6BCACC420100007621AECACC42}
SortOptions = []
Left = 360
Top = 248
object dxMemData1ds: TDateTimeField
FieldName = 'ds'
end
object dxMemData1de: TDateTimeField
FieldName = 'de'
end
end
object DataSource1: TDataSource
DataSet = dxMemData1
OnUpdateData = DataSource1UpdateData
Left = 392
Top = 248
end
end[/more]