⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jvqinspdb.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:
          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 + -