📄 gsentitydataset.pas
字号:
function TgsDataSetProxy.GetPropCount: Integer;
begin
Result := GetTypeData(Self.ClassInfo)^.PropCount;
FPropCount := Result;
end;
function TgsDataSetProxy.GetPropFieldValue(
PropField: TgsPropField): Variant;
begin
Result := Null;
if PropField is TStringF then
Result := TStringF(PropField).AsStr
else if PropField is TIntF then
Result := TIntF(PropField).AsInt
else if PropField is TNumberF then
Result := TNumberF(PropField).AsNum
else if PropField is TDateTimeF then
Result := TDateTimeF(PropField).AsDT
else if PropField is TBooleanF then
Result := TBooleanF(PropField).AsBool
//else if PropField is TStringF then
// Result := TStringF(PropField).AsStr
end;
function TgsDataSetProxy.GetPropName(Index: Integer): ShortString;
begin
Result := GetProp(Index)^.Name;
end;
function TgsDataSetProxy.GetPropObj(Index: Integer): TObject;
var
Prop: TrtProperty;
i: Integer;
sPropName: string;
begin
Result := nil;
//属性名
sPropName := GetPropName(Index);
if sPropName = '' then
Exit;
for i := 0 to FPropCount - 1 do
begin
Prop := FRTTI.ItemsByName[sPropName];
if CompareText(Prop.PropInfo.Name, sPropName) = 0 then
begin
Result := Prop.AsObject;
Break;
end;
end;
end;
function TgsDataSetProxy.GetPropObj(PropName: string): TObject;
var
Prop: TrtProperty;
i: Integer;
begin
Result := nil;
//属性名
for i := 0 to FPropCount - 1 do
begin
// FRTTI 的指针对象顺序已经颠倒,不能用index,只能利用index
Prop := FRTTI.ItemsByName[PropName];
if CompareText(Prop.PropInfo.Name, PropName) = 0 then
begin
Result := Prop.AsObject;
Break;
end;
end;
end;
function TgsDataSetProxy.GetPropTypes(Index: Integer): string;
begin
Result := GetProp(Index).PropType^.Name;
end;
function TgsDataSetProxy.GetStringF(Index: Integer): TStringF;
begin
Result := TStringF(FFieldList.Items[Index]);
Result.Name := PropNames[Index];
if not FEditState then
begin
Result.Caption := FDataSet.FieldByName(PropNames[Index]).DisplayLabel;
Result.AsStr := FDataSet.FieldByName(PropNames[Index]).AsString;
end;
end;
function TgsDataSetProxy.GetVarF(Index: Integer): TVarF;
begin
Result := TVarF(FFieldList.Items[Index]);
Result.Name := PropNames[Index];
if not FEditState then
begin
Result.Caption := FDataSet.FieldByName(PropNames[Index]).DisplayLabel;
Result.AsVar := FDataSet.FieldByName(PropNames[Index]).Value;
end;
end;
function TgsDataSetProxy.HasProperty(PropertyName: string): boolean;
begin
Result := FRTTI.HasProperty(PropertyName);
end;
procedure TgsDataSetProxy.Insert(EntityFields: array of TgsPropField; Included: Boolean);
var
i, j: Integer;
IsFound: Boolean;
obj: TObject;
sPropName: string;
begin
CheckedEditState;
try
try
FDataSet.Insert;
//新增列举的实体字段
if Included then
begin
for i := Low(EntityFields) to High(EntityFields) do
begin
if EntityFields[i] is TStringF then
FDataSet[EntityFields[i].Name] := TStringF(EntityFields[i]).AsStr
else if EntityFields[i] is TIntF then
FDataSet[EntityFields[i].Name] := TIntF(EntityFields[i]).AsInt
else if EntityFields[i] is TNumberF then
FDataSet[EntityFields[i].Name] := TNumberF(EntityFields[i]).AsNum
else if EntityFields[i] is TDateTimeF then
FDataSet[EntityFields[i].Name] := TDateTimeF(EntityFields[i]).AsDT
else if EntityFields[i] is TBooleanF then
FDataSet[EntityFields[i].Name] := TBooleanF(EntityFields[i]).AsBool
end;
end
else
begin
for i := 0 to PropCount - 1 do
begin
IsFound := False;
for j := Low(EntityFields) to High(EntityFields) do
begin
sPropName := PropNames[i];
if CompareText(sPropName, EntityFields[j].Name) = 0 then
begin
IsFound := True;
Break;
end;
end;
if IsFound then
Continue;
obj := GetPropObj(i);
if obj = nil then
Continue;
if obj is TStringF then
FDataSet[sPropName] := TStringF(obj).AsStr
else if obj is TIntF then
FDataSet[sPropName] := TIntF(obj).AsInt
else if obj is TNumberF then
FDataSet[sPropName] := TNumberF(obj).AsNum
else if obj is TDateTimeF then
FDataSet[sPropName] := TDateTimeF(obj).AsDT
else if obj is TBooleanF then
FDataSet[sPropName] := TBooleanF(obj).AsBool
end;
end;
FDataSet.Post;
except
on e: Exception do
begin
e.Create('新增记录失败! ' + cstWrap + e.Message);
end;
end;
finally
EndEdit;
end;
end;
procedure TgsDataSetProxy.Insert;
var
i: Integer;
FieldObj: TObject;
sFieldName: string;
begin
CheckedEditState;
try
try
FDataSet.Insert;
for i := 0 to PropCount - 1 do
begin
FieldObj := GetPropObj(i);
sFieldName := PropNames[i];
if FieldObj is TStringF then
FDataSet[sFieldName] := TStringF(FieldObj).AsStr
else if FieldObj is TIntF then
FDataSet[sFieldName] := TIntF(FieldObj).AsInt
else if FieldObj is TNumberF then
FDataSet[sFieldName] := TNumberF(FieldObj).AsNum
else if FieldObj is TDateTimeF then
FDataSet[sFieldName] := TDateTimeF(FieldObj).AsDT
else if FieldObj is TBooleanF then
FDataSet[sFieldName] := TBooleanF(FieldObj).AsBool
else if FieldObj is TBlobF then
TBlobField(FDataSet.FieldByName(sFieldName)).LoadFromStream(TBlobF(FieldObj).AsBlob);
end;
FDataSet.Post;
except
on e: Exception do
begin
e.Create('新增记录失败! ' + cstWrap + e.Message);
end;
end;
finally
EndEdit;
end;
end;
procedure TgsDataSetProxy.Last;
begin
FDataSet.Last;
end;
function TgsDataSetProxy.Locate(Value: Variant): Boolean;
begin
Result := FDataSet.Locate(KeyName, Value, []);
end;
function TgsDataSetProxy.Locate(EntityField: TgsPropField): Boolean;
begin
Result := FDataSet.Locate(EntityField.Name, GetPropFieldValue(EntityField), []);
end;
function TgsDataSetProxy.Next: Boolean;
begin
FDataSet.Next;
Result := not FDataSet.Eof;
end;
function TgsDataSetProxy.Prior: Boolean;
begin
FDataSet.Prior;
Result := not FDataSet.Bof;
end;
procedure TgsDataSetProxy.Update(EntityFields: array of TgsPropField;
EntityKey: TgsPropField; Included: Boolean);
var
i, j: Integer;
sPropName: string;
IsFound: Boolean;
obj: TObject;
begin
CheckedEditState;
try
try
if not Locate(EntityKey) then
Exit;
FDataSet.Edit;
//修改列举的实体字段
if Included then
begin
for i := Low(EntityFields) to High(EntityFields) do
begin
if EntityFields[i] is TStringF then
FDataSet[EntityFields[i].Name] := TStringF(EntityFields[i]).AsStr
else if EntityFields[i] is TIntF then
FDataSet[EntityFields[i].Name] := TIntF(EntityFields[i]).AsInt
else if EntityFields[i] is TNumberF then
FDataSet[EntityFields[i].Name] := TNumberF(EntityFields[i]).AsNum
else if EntityFields[i] is TDateTimeF then
FDataSet[EntityFields[i].Name] := TDateTimeF(EntityFields[i]).AsDT
else if EntityFields[i] is TBooleanF then
FDataSet[EntityFields[i].Name] := TBooleanF(EntityFields[i]).AsBool
end;
end
else
begin
for i := 0 to PropCount - 1 do
begin
IsFound := False;
for j := Low(EntityFields) to High(EntityFields) do
begin
sPropName := PropNames[i];
if CompareText(sPropName, EntityFields[j].Name) = 0 then
begin
IsFound := True;
Break;
end;
end;
if IsFound then
Continue;
obj := GetPropObj(i);
if obj = nil then
Continue;
if obj is TStringF then
FDataSet[sPropName] := TStringF(obj).AsStr
else if obj is TIntF then
FDataSet[sPropName] := TIntF(obj).AsInt
else if obj is TNumberF then
FDataSet[sPropName] := TNumberF(obj).AsNum
else if obj is TDateTimeF then
FDataSet[sPropName] := TDateTimeF(obj).AsDT
else if obj is TBooleanF then
FDataSet[sPropName] := TBooleanF(obj).AsBool
end;
end;
FDataSet.Post;
except
on e: Exception do
begin
e.Create('修改记录失败! ' + cstWrap + e.Message);
end;
end;
finally
EndEdit;
end;
end;
procedure TgsDataSetProxy.Update(EntityKey: TgsPropField);
var
i: Integer;
FieldObj: TObject;
sFieldName: string;
begin
CheckedEditState;
try
try
if not Locate(EntityKey) then
Exit;
FDataSet.Edit;
for i := 0 to PropCount - 1 do
begin
FieldObj := GetPropObj(i);
sFieldName := PropNames[i];
if FieldObj is TStringF then
FDataSet[sFieldName] := TStringF(FieldObj).AsStr
else if FieldObj is TIntF then
FDataSet[sFieldName] := TIntF(FieldObj).AsInt
else if FieldObj is TNumberF then
FDataSet[sFieldName] := TNumberF(FieldObj).AsNum
else if FieldObj is TDateTimeF then
FDataSet[sFieldName] := TDateTimeF(FieldObj).AsDT
else if FieldObj is TBooleanF then
FDataSet[sFieldName] := TBooleanF(FieldObj).AsBool
else if FieldObj is TBlobF then
TBlobField(FDataSet.FieldByName(sFieldName)).LoadFromStream(TBlobF(FieldObj).AsBlob);
end;
FDataSet.Post;
except
on e: Exception do
begin
e.Create('修改记录失败! ' + cstWrap + e.Message);
end;
end;
finally
EndEdit;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -