📄 memtableeh.pas
字号:
end;
end;
while (Result = -1) and not FProviderEOF do
begin
DoFetchRecords(1);
InstantReadEnter(RecordCount-1);
try
if CompareRecord then
Result := RecordCount-1;
finally
InstantReadLeave;
end;
end;
finally
Fields.Free;
end;
end;
function TCustomMemTableEh.Locate(const KeyFields: string;
const KeyValues: Variant; Options: TLocateOptions): Boolean;
var
FindedRecPos: Integer;
begin
Result := False;
CheckBrowseMode;
if BOF and EOF then Exit;
FRecordsView.CatchChanged := False;
FindedRecPos := FindRec(KeyFields, KeyValues, Options);
if FindedRecPos <> -1 then
begin
FRecordPos := FindedRecPos;
// FInstantReadCurRow := FindedRecPos;
Result := True;
end;
if Result or FRecordsView.CatchChanged then
begin
DoBeforeScroll;
Resync([rmExact, rmCenter]);
DoAfterScroll;
end;
end;
function TCustomMemTableEh.Lookup(const KeyFields: string;
const KeyValues: Variant; const ResultFields: string): Variant;
var
FindedRecPos: Integer;
begin
Result := Unassigned;
FRecordsView.CatchChanged := False;
FindedRecPos := FindRec(KeyFields, KeyValues, []);
if FindedRecPos <> -1 then
begin
InstantReadEnter(FindedRecPos);
try
Result := FieldValues[ResultFields];
finally
InstantReadLeave;
end;
end;
if FRecordsView.CatchChanged then
Resync([]);
end;
{ Table Manipulation }
procedure TCustomMemTableEh.EmptyTable;
begin
if Active then
begin
CheckBrowseMode;
ClearRecords;
ClearBuffers;
DataEvent(deDataSetChange, 0);
end;
end;
procedure TCustomMemTableEh.CopyStructure(Source: TDataSet);
procedure CheckDataTypes(FieldDefs: TFieldDefs);
var
I: Integer;
begin
for I := FieldDefs.Count - 1 downto 0 do
begin
if not (FieldDefs.Items[I].DataType in ftSupported) then
FieldDefs.Items[I].Free
else CheckDataTypes(FieldDefs[I].ChildDefs);
end;
end;
var
I: Integer;
begin
CheckInactive;
for I := FieldCount - 1 downto 0 do
Fields[I].Free;
if (Source = nil) then Exit;
Source.FieldDefs.Update;
FieldDefs := Source.FieldDefs;
CheckDataTypes(FieldDefs);
CreateFields;
for I := 0 to FieldDefs.Count - 1 do
begin
if (csDesigning in ComponentState) and (Owner <> nil) then
FieldDefs.Items[I].CreateField(Owner)
else
FieldDefs.Items[I].CreateField(Self);
end;
end;
function TCustomMemTableEh.LoadFromDataSet(Source: TDataSet; RecordCount: Integer;
Mode: TLoadMode): Integer;
var
SourceActive: Boolean;
MovedCount: Integer;
begin
Result := 0;
if Source = Self then Exit;
SourceActive := Source.Active;
Source.DisableControls;
try
DisableControls;
try
Filtered := False;
with Source do
begin
Open;
CheckBrowseMode;
UpdateCursorPos;
end;
if Mode = lmCopy then
begin
Close;
CopyStructure(Source);
end;
// FreeIndexList;
if not Active then Open;
CheckBrowseMode;
if FRecordsView.Count > 0 then
MovedCount := FRecordsView.Count
else
begin
Source.First;
MovedCount := MaxInt;
end;
try
while not Source.EOF do
begin
Append;
//DBUtils AssignRecord(Source, Self, True);
Post;
Inc(Result);
if Result >= MovedCount then Break;
Source.Next;
end;
finally
First;
end;
finally
EnableControls;
end;
finally
if not SourceActive then
Source.Close;
Source.EnableControls;
end;
end;
function TCustomMemTableEh.SaveToDataSet(Dest: TDataSet; RecordCount: Integer): Integer;
var
MovedCount: Integer;
begin
Result := 0;
if Dest = Self then Exit;
CheckBrowseMode;
UpdateCursorPos;
Dest.DisableControls;
try
DisableControls;
try
if not Dest.Active
then Dest.Open
else Dest.CheckBrowseMode;
if RecordCount > 0 then
MovedCount := RecordCount
else
begin
First;
MovedCount := MaxInt;
end;
try
while not EOF do
begin
Dest.Append;
//DBUtils AssignRecord(Self, Dest, True);
Dest.Post;
Inc(Result);
if Result >= MovedCount then Break;
Next;
end;
finally
Dest.First;
end;
finally
EnableControls;
end;
finally
Dest.EnableControls;
end;
end;
{ Index Related }
type
TOrderByItem = class(TObject)
public
Field: TField;
FieldNo: Integer;
Desc: Boolean;
CaseIns: Boolean;
end;
TOrderByList = class(TObjectList)
private
function GetItem(Index: Integer): TOrderByItem;
procedure SetItem(Index: Integer; const Value: TOrderByItem);
public
property Items[Index: Integer]: TOrderByItem read GetItem write SetItem; default;
end;
function TCustomMemTableEh.GetInstantReadCurRow: Integer;
begin
UpdateCursorPos;
Result := FInstantReadCurRow;
end;
procedure TCustomMemTableEh.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) then
begin
if AComponent = FProviderDataSet then
ProviderDataSet := nil;
end;
end;
procedure TCustomMemTableEh.InternalRefresh;
begin
FRecordsView.RefreshFilteredRecsList;
InternalFirst;
end;
procedure TCustomMemTableEh.UpdateDetailMode(AutoRefresh: Boolean);
var
NewDetailMode: Boolean;
begin
NewDetailMode := False;
if Fields.Count > 0 then
begin
FDetailFieldList.Clear;
GetFieldList(FDetailFieldList, DetailFields);
if MasterDetailSide = mdsOnSelfEh then
begin
if (FDetailFieldList.Count > 0) and FMasterDataLink.Active and
(FMasterDataLink.Fields.Count > 0)
then
NewDetailMode := True;
end else if FMasterDataLink.Active then
NewDetailMode := True;
end;
if NewDetailMode <> FDetailMode then
begin
FDetailMode := NewDetailMode;
if not FDetailMode then
FMasterValues := Unassigned
else if MasterDetailSide = mdsOnSelfEh then
FMasterValues := MasterSource.DataSet.FieldValues[MasterFields];
if AutoRefresh then
if MasterDetailSide = mdsOnProviderEh
then RefreshParams
else Refresh;
end;
end;
procedure TCustomMemTableEh.MasterChange(Sender: TObject);
var
OldDetailMode: Boolean;
begin
OldDetailMode := FDetailMode;
UpdateDetailMode(False);
if MasterDetailSide = mdsOnProviderEh then
RefreshParams
else if (OldDetailMode <> FDetailMode) or
(FDetailMode and not VarEquals(FMasterValues, MasterSource.DataSet.FieldValues[MasterFields])) then
begin
FMasterValues := MasterSource.DataSet.FieldValues[MasterFields];
Refresh;
end;
end;
function TCustomMemTableEh.GetCanModify: Boolean;
begin
Result := not ReadOnly;
end;
procedure TCustomMemTableEh.DoOnNewRecord;
var
i: Integer;
begin
for i := 0 to Fields.Count-1 do
if (Fields[i].DefaultExpression <> '') and Fields[i].CanModify then
Fields[i].Text := Fields[i].DefaultExpression;
if FDetailMode then
FieldValues[FDetailFields] := MasterSource.DataSet.FieldValues[MasterFields];
inherited DoOnNewRecord;
end;
procedure TCustomMemTableEh.SetParams(const Value: TParams);
begin
FParams.Assign(Value);
end;
procedure TCustomMemTableEh.SetMasterDetailSide(const Value: TMasterDetailSideEh);
begin
if (FMasterDetailSide <> Value) then
begin
FMasterDetailSide := Value;
UpdateDetailMode(False);
if FDetailMode and Active then
if MasterDetailSide = mdsOnProviderEh then
begin
Close;
Open;
end else
Refresh;
end;
end;
procedure TCustomMemTableEh.SetParamsFromCursor;
var
I: Integer;
DataSet: TDataSet;
begin
if MasterSource <> nil then
begin
DataSet := MasterSource.DataSet;
if DataSet <> nil then
begin
DataSet.FieldDefs.Update;
for I := 0 to FParams.Count - 1 do
with FParams[I] do
if not Bound then
begin
AssignField(DataSet.FieldByName(Name));
Bound := False;
end;
end;
end;
end;
procedure TCustomMemTableEh.RefreshParams;
var
DataSet: TDataSet;
Field: TField;
I: Integer;
begin
DisableControls;
try
if MasterSource <> nil then
begin
DataSet := MasterSource.DataSet;
if DataSet <> nil then
if DataSet.Active and (DataSet.State <> dsSetKey) then
begin
for I := 0 to FParams.Count - 1 do
begin
Field := DataSet.FindField(FParams[I].Name);
if (Field <> nil) and not VarEquals(Field.Value, FParams[I].Value) then
begin
Close;
Open;
Break;
end;
end;
end;
end;
finally
EnableControls;
end;
end;
procedure TCustomMemTableEh.FetchParams;
var
ProviderParams: TParams;
begin
if ProviderDataSet <> nil then
begin
ProviderParams := IProviderSupport(ProviderDataSet).PSGetParams;
Params.Assign(ProviderParams);
end;
end;
procedure TCustomMemTableEh.RefreshRecord;
var
vValues: Variant;
i: Integer;
KeyFound: Boolean;
Bookmark: TBookmarkStr;
DeltaField, ProviderField: TField;
DeltaDataSet: TCustomMemTableEh;
begin
if (ProviderDataSet <> nil) then
begin
DeltaDataSet := CreateDeltaDataSet;
try
DeltaDataSet.Insert;
for i := 0 to FieldCount-1 do
if Fields[i].FieldKind = fkData then
begin
DeltaField := DeltaDataSet.FieldByName(Fields[i].FieldName);
if Up
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -