?? dbsumlst.pas
字號:
FMasterPropInfo := nil;
FMasterDataSet := nil;
FEventsOverloaded := False;
for i := 0 to FVirtualRecList.Count-1 do FDataSet.FreeBookmark(FVirtualRecList[i]);
FVirtualRecList.Clear;
end;
end;
procedure TDBSumListProducer.SetDataSet(Value:TDataSet);
var OldActive:Boolean;
begin
if (FDataSet = Value) then Exit;
if not (csLoading in FOwner.ComponentState) and
(FDesignTimeWork or not (csDesigning in FOwner.ComponentState)) then begin
OldActive := Active;
Deactivate(True);
FDataSet := Value;
if OldActive then Activate(True);
end else FDataSet := Value;
end;
procedure TDBSumListProducer.Loaded;
begin
// inherited;
if Assigned(FDataSet) and Active then begin
Activate(True);
end;
end;
procedure TDBSumListProducer.RecalcAll;
var i: Integer;
item:TDBSum;
NeedRecalc:Boolean;
begin
if (not FDesignTimeWork and (csDesigning in FOwner.ComponentState)) or
(csLoading in FOwner.ComponentState) or (Active = False) or not Assigned(DataSet) or
(DataSet.Active = False) or (FEventsOverloaded = False) then Exit;
try
ClearSumValues;
FOldRecNo:=-1;
if Assigned(OnRecalcAll) then OnRecalcAll(Self);
if ExternalRecalc then Exit;
NeedRecalc := False;
for i := 0 to FSumCollection.Count - 1 do
if (TDBSum(FSumCollection.Items[i]).GroupOperation = goCount) or
(TDBSum(FSumCollection.Items[i]).FieldName <> '') then begin
NeedRecalc := True;
Break;
end;
if not FDataSet.IsSequenced and VirtualRecords then
NeedRecalc := True;
if NeedRecalc then begin
FDataSet.DisableControls;
for i := 0 to FVirtualRecList.Count-1 do FDataSet.FreeBookmark(FVirtualRecList[i]);
FVirtualRecList.Clear;
Changing := True;
FDataSet.First;
while FDataSet.Eof = False do begin
for i := 0 to FSumCollection.Count - 1 do begin
item := TDBSum(FSumCollection.Items[i]);
if (item.GroupOperation = goCount) or (item.FieldName <> '') then begin
case Item.GroupOperation of
goSum:
begin
if (FDataSet.FieldByName(Item.FieldName).IsNull = False) then
Item.SumValue := Item.SumValue + FDataSet.FieldByName(Item.FieldName).AsFloat;
end;
goCount: Item.SumValue := Item.SumValue + 1;
end;
end;
end;
if not FDataSet.IsSequenced and VirtualRecords then
FVirtualRecList.Add(Pointer(FDataSet.GetBookmark));
FDataSet.Next;
end;
FDataSet.First;
FDataSet.EnableControls;
end;
//// Form1.Edit1.Text := FormatFloat('#,##0.0',cur);
//// SumValue := Cur;
finally
Filtered := FDataSet.Filtered;
Filter := FDataSet.Filter;
Changing := False;
DoSumListChanged;
end;
end;
procedure TDBSumListProducer.DataSetAfterEdit(DataSet: TDataSet);
var i: Integer;
item:TDBSum;
begin
if (Assigned(OldAfterEdit)) then
OldAfterEdit(DataSet);
if (Active = False) then Exit;
for i := 0 to FSumCollection.Count - 1 do begin
item := TDBSum(FSumCollection.Items[i]);
if (item.GroupOperation = goCount) or (item.FieldName <> '') then begin
case Item.GroupOperation of
goSum:
if (FDataSet.FieldByName(Item.FieldName).IsNull = False) then
Item.Value := FDataSet.FieldByName(Item.FieldName).AsFloat
else
Item.Value := 0;
goCount: Item.Value := 0;
end;
end;
end;
end;
procedure TDBSumListProducer.DataSetAfterInsert(DataSet: TDataSet);
var i: Integer;
item:TDBSum;
ABookMark:TBookmark;
begin
if Active then
begin
for i := 0 to FSumCollection.Count - 1 do begin
item := TDBSum(FSumCollection.Items[i]);
if (item.GroupOperation = goCount) or (item.FieldName <> '') then begin
case Item.GroupOperation of
goSum: Item.Value := 0;
goCount: Item.Value := 1;
end;
end;
end;
if not FDataSet.IsSequenced and VirtualRecords then begin
ABookMark := FDataSet.GetBookmark;
if Assigned(ABookMark) then
FVirtualRecList.Add(Pointer(ABookMark))
else
FTryedInsert := True;
end;
end;
if (Assigned(OldAfterInsert)) then
OldAfterInsert(DataSet);
end;
procedure TDBSumListProducer.DataSetAfterOpen(DataSet: TDataSet);
begin
if Active then RecalcAll;
if (Assigned(OldAfterOpen)) then
OldAfterOpen(DataSet);
end;
procedure TDBSumListProducer.DataSetAfterPost(DataSet: TDataSet);
var i: Integer;
item:TDBSum;
ARecNo,C:Integer;
begin
if Active then
begin
for i := 0 to FSumCollection.Count - 1 do begin
item := TDBSum(FSumCollection.Items[i]);
if (item.GroupOperation = goCount) or (item.FieldName <> '') then begin
case Item.GroupOperation of
goSum:
if (FDataSet.FieldByName(Item.FieldName).IsNull = False) then
Item.SumValue := Item.SumValue - Item.Value + FDataSet.FieldByName(Item.FieldName).AsFloat
else
Item.SumValue := Item.SumValue - Item.Value;
goCount:
Item.SumValue := Item.SumValue + Item.Value;
end;
end;
end;
if not FDataSet.IsSequenced and VirtualRecords and FTryedInsert = True then begin
ARecNo := FOldRecNo;
if (ARecNo = -1) or (ARecNo >= FVirtualRecList.Count) then ARecNo := 0;
if (FVirtualRecList.Count > 0) then
C := DataSet.CompareBookmarks(TBookMark(FVirtualRecList[ARecNo]), TBookMark(FDataSet.Bookmark))
else
C := 0;
if (C > 0) then
while C > 0 do begin
Dec(ARecNo);
if (ARecNo < 0) then Break;
C := DataSet.CompareBookmarks(TBookMark(FVirtualRecList[ARecNo]), TBookMark(FDataSet.Bookmark));
end
else if (C < 0) then
while C < 0 do begin
Inc(ARecNo);
if (ARecNo >= FVirtualRecList.Count) then Break;
C := DataSet.CompareBookmarks(TBookMark(FVirtualRecList[ARecNo]), TBookMark(FDataSet.Bookmark));
end;
FVirtualRecList.Insert(ARecNo,Pointer(FDataSet.GetBookmark));
FTryedInsert := False;
end;
DoSumListChanged;
end;
if (Assigned(OldAfterPost)) then
OldAfterPost(DataSet);
end;
procedure TDBSumListProducer.DataSetAfterScroll(DataSet: TDataSet);
begin
if (Assigned(OldAfterScroll)) then
OldAfterScroll(DataSet);
if (Active = False) then Exit;
if (Changing = False) then begin
if ((DataSet.Filtered and (Filter <> DataSet.Filter)) or (Filtered <> DataSet.Filtered)) then
RecalcAll;
{else if (FMasterDataset <> GetMasterDataSet(FMasterPropInfo)) then begin
ResetMasterInfo;
RecalcAll;
end;}
end;
end;
procedure TDBSumListProducer.DataSetBeforeDelete(DataSet: TDataSet);
var i: Integer;
item:TDBSum;
begin
if (Assigned(OldBeforeDelete)) then
OldBeforeDelete(DataSet);
if (Active = False) then Exit;
for i := 0 to FSumCollection.Count - 1 do begin
item := TDBSum(FSumCollection.Items[i]);
if (item.GroupOperation = goCount) or (item.FieldName <> '') then begin
case Item.GroupOperation of
goSum: Item.SumValue := Item.SumValue - FDataSet.FieldByName(Item.FieldName).AsFloat;
goCount: Item.SumValue := Item.SumValue - 1;
end;
end;
end;
if not FDataSet.IsSequenced and VirtualRecords then begin
i := FindVirtualRecord(TBookmark(FDataSet.Bookmark));
if i >= 0 then begin
FDataSet.FreeBookmark(FVirtualRecList[i]);
FVirtualRecList.Delete(i);
end;
end;
DoSumListChanged;
end;
procedure TDBSumListProducer.DataSetAfterClose(DataSet: TDataSet);
begin
if Active then
begin
ClearSumValues;
DoSumListChanged;
Changing := False;
end;
if (Assigned(OldAfterClose)) then
OldAfterClose(DataSet);
end;
procedure TDBSumListProducer.SetSumCollection(const Value: TDBSumCollection);
begin
FSumCollection.Assign(Value);
end;
procedure TDBSumListProducer.SetActive(const Value: Boolean);
begin
if (FActive = Value) then Exit;
if (Value = True) then Activate(True);
if (Value = False) then Deactivate(True);
end;
procedure TDBSumListProducer.Activate(ARecalcAll: Boolean);
begin
FActive := True;
if (csLoading in FOwner.ComponentState) or
(not FDesignTimeWork and (csDesigning in FOwner.ComponentState)) then Exit;
SetDataSetEvents;
if ARecalcAll then RecalcAll;
end;
procedure TDBSumListProducer.Deactivate(AClearSumValues: Boolean);
begin
FActive := False;
if (csLoading in FOwner.ComponentState) or
(not FDesignTimeWork and (csDesigning in FOwner.ComponentState)) then Exit;
ReturnEvents;
if AClearSumValues then ClearSumValues;
end;
procedure TDBSumListProducer.DoSumListChanged;
begin
if Assigned(SumListChanged) then SumListChanged(Self);
end;
procedure TDBSumListProducer.ClearSumValues;
var i:Integer;
item:TDBSum;
begin
for i := 0 to FSumCollection.Count - 1 do begin
item := TDBSum(FSumCollection.Items[i]);
item.SumValue := 0;
item.Value := 0;
end;
DoSumListChanged;
end;
procedure TDBSumListProducer.SetExternalRecalc(const Value: Boolean);
begin
if (FExternalRecalc = Value) then Exit;
FExternalRecalc := Value;
RecalcAll;
end;
procedure TDBSumListProducer.MasterDataSetAfterScroll(DataSet: TDataSet);
begin
if (Assigned(OldMasterAfterScroll)) then
OldMasterAfterScroll(DataSet);
if (Active = False) then Exit;
if Changing=False then RecalcAll;
end;
procedure TDBSumListProducer.DataSetAfterCancel(DataSet: TDataSet);
begin
if (Assigned(OldAfterCancel)) then
OldAfterCancel(DataSet);
FTryedInsert := False;
end;
function TDBSumListProducer.GetOwner: TPersistent;
begin
Result := FOwner;
end;
procedure TDBSumListProducer.Update;
begin
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -