📄 jvqinspdb.pas
字号:
MinValue := GetTypeData(TypeInfo).MinValue;
MaxValue := GetTypeData(TypeInfo).MaxValue;
if (Value < MinValue) or (Value > MaxValue) then
raise ERangeError.CreateResFmt(@SOutOfRange, [MinValue, MaxValue]);
DataLink.Edit;
Field.AsInteger := Smallint(Value)
end;
otUWord:
begin
MinValue := GetTypeData(TypeInfo).MinValue;
MaxValue := GetTypeData(TypeInfo).MaxValue;
if (Value < MinValue) or (Value > MaxValue) then
raise ERangeError.CreateResFmt(@SOutOfRange, [MinValue, MaxValue]);
DataLink.Edit;
Field.AsInteger := Word(Value)
end;
otSLong:
begin
MinValue := GetTypeData(TypeInfo).MinValue;
MaxValue := GetTypeData(TypeInfo).MaxValue;
if (Value < MinValue) or (Value > MaxValue) then
raise ERangeError.CreateResFmt(@SOutOfRange, [MinValue, MaxValue]);
DataLink.Edit;
Field.AsInteger := Integer(Value)
end;
otULong:
begin
MinValue := Longword(GetTypeData(TypeInfo).MinValue);
MaxValue := Longword(GetTypeData(TypeInfo).MaxValue);
if (Value < MinValue) or (Value > MaxValue) then
raise ERangeError.CreateResFmt(@SOutOfRange, [MinValue, MaxValue]);
DataLink.Edit;
Field.AsInteger := Integer(Value)
end;
end;
end
else
if TypeInfo.Kind = tkClass then
begin
DataLink.Edit;
Field.AsInteger := Integer(Value);
end
else
raise EJvInspectorData.CreateResFmt(@RsEJvInspDataNoAccessAs, [cJvInspectorOrdinal]);
end;
procedure TJvInspectorDBData.SetAsString(const Value: string);
begin
CheckWriteAccess;
if TypeInfo.Kind in [tkString, tkLString, tkWString] then
begin
DataLink.Edit;
Field.AsString := Value;
end
else
raise EJvInspectorData.CreateResFmt(@RsEJvInspDataNoAccessAs, [cJvInspectorString]);
end;
procedure TJvInspectorDBData.SetDataSource(const Value: TDataSource);
var
OrgFieldName: string;
begin
if DataSource <> Value then
begin
OrgFieldName := FieldName;
DataLink.DataSource := Value;
if FieldName <> OrgFieldName then
FieldName := OrgFieldName
else
Invalidate;
end;
end;
procedure TJvInspectorDBData.SetField(const Value: TField);
begin
if Field <> Value then
begin
TFieldDataLink(DataLink).FieldName := Value.FieldName;
Invalidate;
end;
end;
procedure TJvInspectorDBData.SetFieldName(const Value: string);
begin
if FieldName <> Value then
begin
TFieldDataLink(DataLink).FieldName := Value;
Invalidate;
end;
end;
procedure RegisterDBTypes; forward;
class function TJvInspectorDBData.FieldTypeMapping: TJvInspectorRegister;
begin
if GlobalMapReg = nil then
begin
GlobalMapReg := TJvInspectorRegister.Create(TJvCustomInspectorData);
RegisterDBTypes; // register
end;
Result := GlobalMapReg;
end;
procedure TJvInspectorDBData.GetAsSet(var Buf);
var
CompType: PTypeInfo;
EnumMin: Integer;
EnumMax: Integer;
ResBytes: Integer;
TmpInt: Integer;
begin
CheckReadAccess;
if TypeInfo.Kind <> tkSet then
raise EJvInspectorData.CreateResFmt(@RsEJvInspDataNoAccessAs, [cJvInspectorSet]);
CompType := GetTypeData(TypeInfo).CompType^;
EnumMin := GetTypeData(CompType).MinValue;
EnumMax := GetTypeData(CompType).MaxValue;
ResBytes := (EnumMax div 8) - (EnumMin div 8) + 1;
if ResBytes > 4 then
ResBytes := 4;
TmpInt := Field.AsInteger;
Move(TmpInt, Buf, ResBytes);
end;
function TJvInspectorDBData.HasValue: Boolean;
begin
Result := IsInitialized and (DataSource <> nil) and (DataSource.DataSet <> nil) and
DataSource.DataSet.Active;
end;
function TJvInspectorDBData.IsAssigned: Boolean;
begin
Result := IsInitialized and not Field.IsNull;
end;
function TJvInspectorDBData.IsInitialized: Boolean;
begin
Result := (DataLink <> nil) and (DataSource <> nil) and (Field <> nil);
end;
class function TJvInspectorDBData.ItemRegister: TJvInspectorRegister;
begin
if GlobalDBReg = nil then
GlobalDBReg := TJvInspectorRegister.Create(TJvInspectorDBData);
Result := GlobalDBReg;
end;
class function TJvInspectorDBData.New(const AParent: TJvCustomInspectorItem;
const ADataSource: TDataSource; const AFieldName: string): TJvCustomInspectorItem;
var
Data: TJvInspectorDBData;
begin
Data := CreatePrim('', nil);
Data.InitDB(ADataSource, AFieldName);
Data := TJvInspectorDBData(RegisterInstance(Data));
if Data <> nil then
Result := Data.NewItem(AParent)
else
Result := nil;
end;
class function TJvInspectorDBData.New(const AParent: TJvCustomInspectorItem;
const ADataSource: TDataSource): TJvInspectorItemInstances;
var
DS: TDataSet;
IArr: Integer;
I: Integer;
TmpItem: TJvCustomInspectorItem;
begin
SetLength(Result, ADataSource.DataSet.FieldCount);
DS := ADataSource.DataSet;
IArr := 0;
for I := 0 to DS.FieldCount - 1 do
begin
TmpItem := New(AParent, ADataSource, DS.Fields[I].FieldName);
if TmpItem <> nil then
begin
Result[IArr] := TmpItem;
Inc(IArr);
end;
end;
SetLength(Result, IArr);
end;
class function TJvInspectorDBData.New(const AParent: TJvCustomInspectorItem;
const ADataSource: TDataSource; const AFieldNames: array of string): TJvInspectorItemInstances;
var
IArr: Integer;
I: Integer;
TmpItem: TJvCustomInspectorItem;
begin
SetLength(Result, Length(AFieldNames));
IArr := 0;
for I := Low(AFieldNames) to High(AFieldNames) do
begin
TmpItem := New(AParent, ADataSource, AFieldNames[I]);
if TmpItem <> nil then
begin
Result[IArr] := TmpItem;
Inc(IArr);
end;
end;
end;
procedure TJvInspectorDBData.SetAsSet(const Buf);
var
CompType: PTypeInfo;
EnumMin: Integer;
EnumMax: Integer;
ResBytes: Integer;
TmpInt: Integer;
begin
CheckWriteAccess;
if TypeInfo.Kind <> tkSet then
raise EJvInspectorData.CreateResFmt(@RsEJvInspDataNoAccessAs, [cJvInspectorSet]);
CompType := GetTypeData(TypeInfo).CompType^;
EnumMin := GetTypeData(CompType).MinValue;
EnumMax := GetTypeData(CompType).MaxValue;
ResBytes := (EnumMax div 8) - (EnumMin div 8) + 1;
if ResBytes > 4 then
ResBytes := 4;
TmpInt := 0;
Move(Buf, TmpInt, ResBytes);
DataLink.Edit;
Field.AsInteger := TmpInt;
end;
//=== { TJvInspectorTFieldTypeRegItem } ======================================
constructor TJvInspectorTFieldTypeRegItem.Create(const AFieldName, AFieldTable: string;
const AFieldType: TFieldType; ATypeInfo: PTypeInfo);
begin
inherited Create(nil);
FFieldName := AFieldName;
FFieldTable := AFieldTable;
FFieldType := AFieldType;
FTypeInfo := ATypeInfo;
end;
function TJvInspectorTFieldTypeRegItem.MatchValue(const ADataObj: TJvCustomInspectorData): Integer;
var
ThisField: TField;
GoOn: Boolean;
ThisTableName: string;
ThisFieldName: string;
begin
{ Determine value as follows:
Base value = 0
* FieldType specified:
* no match: return 0
* match: add 16
* FieldName specified:
* no match: return 0
* matches by mask: add 4
* exact match: add 8
* FieldTable specified:
* no match: return 0
* matches by mask: add 1
* exact match: add 2 }
ThisField := (ADataObj as TJvInspectorDBData).Field;
Result := 0;
GoOn := ThisField <> nil;
if GoOn then
begin
ThisTableName := GetTableName(ThisField);
ThisFieldName := GetFieldName(ThisField);
if FieldType <> ftUnknown then
begin
if FieldType = ThisField.DataType then
Result := Result or 16
else
GoOn := False;
end;
if GoOn and (FieldName <> '') then
begin
if AnsiSameText(FieldName, ThisFieldName) then
Result := Result or 8
else
GoOn := False;
end;
if GoOn and (FieldTable <> '') then
begin
if AnsiSameText(FieldTable, ThisTableName) then
Result := Result or 2
else
GoOn := False;
end;
end;
if not GoOn then
Result := 0;
if FieldType = ftUnknown then
Result := 1;
end;
function TJvInspectorTFieldTypeRegItem.MatchPercent(const ADataObj: TJvCustomInspectorData): Integer;
begin
if IsMatch(ADataObj) then
ADataObj.TypeInfo := TypeInfo;
if (FieldType = ftUnknown) and (ADataObj.TypeInfo = nil) then
Result := 100 // terminate the search now
else
Result := 0; // Make sure the other items are searched as well
end;
procedure RegisterDBTypes;
begin
with TJvInspectorDBData.FieldTypeMapping do
begin
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftString, System.TypeInfo(string)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftSmallint, System.TypeInfo(Smallint)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftInteger, System.TypeInfo(Integer)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftWord, System.TypeInfo(Word)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftBoolean, System.TypeInfo(Boolean)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftFloat, System.TypeInfo(Double)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftCurrency, System.TypeInfo(Currency)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftBCD, System.TypeInfo(Currency)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftDate, System.TypeInfo(TDateTime)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftTime, System.TypeInfo(TDateTime)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftDateTime, System.TypeInfo(TDateTime)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftAutoInc, System.TypeInfo(Integer)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftMemo, System.TypeInfo(string)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftFmtMemo, System.TypeInfo(string)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftFixedChar, System.TypeInfo(string)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftWideString, System.TypeInfo(WideString)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftLargeint, System.TypeInfo(Int64)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftVariant, System.TypeInfo(Variant)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftInterface, System.TypeInfo(IUnknown)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftIDispatch, System.TypeInfo(IDispatch)));
Add(TJvInspectorTFieldTypeRegItem.Create('', '', ftGUID, System.TypeInfo(string)));
end;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQInspDB.pas,v $';
Revision: '$Revision: 1.10 $';
Date: '$Date: 2004/11/06 22:08:18 $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
initialization
{$IFDEF UNITVERSIONING}
RegisterUnitVersion(HInstance, UnitVersioning);
{$ENDIF UNITVERSIONING}
finalization
FreeAndNil(GlobalDBReg);
FreeAndNil(GlobalMapReg);
{$IFDEF UNITVERSIONING}
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -