• JVCL的TJvInspector组件使用方法


    本文转自:http://www.neugls.info/?p=97

    JVCL

    The JEDI Visual Component Library (JVCL) consists of a large collection (currently ca 500) visual and non-visual components which can be instantly reused in your Delphi, Kylix and C++ Builder projects. You can visit this website to know more about JVCL: http://jvcl.delphi-jedi.org/; you can download JVCL here.

    Introduce

    1TJvInspector is a component which can let you display properties of an object, it is like delphi's inspect. It may look like this:  The control is completely separated from the editing layer and the editing layer is completely separated from the data layer. This means the control is able to "inspect" a wide variety of data types, without the need of creating a new descendant of the inspector control. It also means you can mix various data sources in one view. The control does not handle the painting itself. This is left to a painter object. Each of the properties is called an item, a instance of TJvCustomInspectorItem. TJvCustomInspectorItem is the base inspector item. An item is responsible for drawing and editing the underlying data object, as well as managing the sub items. The base class introduces methods and properties to:
    • display and edit the data object
    • manage child items
    The base class itself can be used as a read only item with no underlying data object. An instance of this class is used as the root item for the inspector. The standard package provides various item classes to edit the different types of data:
    • Ordinals
    • Enumerations
    • Sets
    • Strings
    • Floats

    In addition it provides an item class that functions as a category holder. A category holder also has no data instance to provide values. Categories can be nested, but each item can belong to only one category.

    Usage

    How to edit properties of a component?

    By using the AddComponent method of TJvCustomInspector  you can edit the properties of the component, like:
    procedure TSimpleMainForm.FormShow(Sender: TObject);
    begin
      JvInspector1.Clear;
      JvInspector1.AddComponent(Self, 'A Form Inspecting Itself', True);
    end;
    You can also do it like this:
    procedure TForm1.FormCreate(Sender: TObject);
    var
      InspCat: TJvInspectorCustomCategoryItem;
    begin
      InspCat:=TJvInspectorCustomCategoryItem.Create(self.JvInspector1.Root,nil);
      InspCat.DisplayName:='Form1';
      TJvInspectorPropData.New(InspCat,Self);
    end;

    How to add a category?

    You can also do it like this:
    procedure TForm1.FormCreate(Sender: TObject);
    var
      InspCat: TJvInspectorCustomCategoryItem;
    begin
      InspCat:=TJvInspectorCustomCategoryItem.Create(self.JvInspector1.Root,nil);
      InspCat.DisplayName:='Form1';
      TJvInspectorPropData.New(InspCat,Self);
    end;

    How to edit a property?

    By using the New method of TJvInspectorPropData, we can edit a property of an object, such as:
    TJvInspectorPropData.New(InspCat, JvInspector1, GetPropInfo(JvInspector1, PropArray[I, 0])).
    2
    Detial usage you can consult the help

    How to edit a string?

    TJvInspectorVarData.New(InspCat,'DisplayName',TypeInfo(String),@MyString);

    How to edit font?

    var
      Form1: TForm1;
      FColor:Integer=clRed;
      MyString:string='aa';
      Font:TFont;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      InspCat: TJvInspectorCustomCategoryItem;
    begin
      InspCat:=TJvInspectorCustomCategoryItem.Create(self.JvInspector1.Root,nil);
      InspCat.DisplayName:='Property';
    
      Font:=TFont.Create;
      TJvInspectorVarData.New(InspCat,'DisplayName',TypeInfo(String),@MyString);
      TJvInspectorVarData.New(InspCat,'Font',TypeInfo(TFont),@Font);
    
      InspCat.Expanded:=True;
    end;
    Note: The 4th parameters of the procedure TJvInspectorVarData.New could not be local variables.

    How to edit font name?

      MyFontName:string='Tahoma';
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      InspCat: TJvInspectorCustomCategoryItem;
    begin
      InspCat:=TJvInspectorCustomCategoryItem.Create(self.JvInspector1.Root,nil);
      InspCat.DisplayName:='Property';
    
      TJvInspectorVarData.ItemRegister.Add(TJvInspectorTypeInfoRegItem.Create(TJvInspectorFontNameItem,TypeInfo(String)));
      TJvInspectorVarData.New(InspCat,'FontName',TypeInfo(String),@MyFontName);
    
      InspCat.Expanded:=True;
    
    end;

    How to edit simple data types?

    With TJvInspectorVarData, we can edit Simple data types, such as:
    TJvInspectorVarData.New(InspCat,'FontName',TypeInfo(String),@MyFontName);
    TJvInspectorVarData is the inspector data layer that obtains its data from a simple variable or some value on the heap. The class implements all access properties, but the type info will be used to check the legality of the access (ie. a float can't be accessed as Int64).

    How to edit color?

    JVCL provider us a class called TJvInspectorColorItem which can let'us edit TColor properties. You can use it like this:
    FColor:TColor
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      InspCat: TJvInspectorCustomCategoryItem;
    begin
      InspCat:=TJvInspectorCustomCategoryItem.Create(self.JvInspector1.Root,nil);
      InspCat.DisplayName:='Property';
    
      TJvInspectorVarData.ItemRegister.Add(TJvInspectorTypeInfoRegItem.Create(TJvInspectorColorItem,TypeInfo(TColor)));
      TJvInspectorVarData.New(InspCat,'Color',TypeInfo(TColor),@FColor);
    
      InspCat.Expanded:=True;
    
    end;

    How to make your own item?

    In this section, I will show you an example to demonstrate how to make your own item. Following shows the code:
    (*
     * Author : Neugls.
     * Website: Http://www.neugls.info
     * Email  : NeuglsWorkStudio@gmail.com
     *)
    unit NuColorInspectItem;
    
    interface
    uses JvInspector,Graphics,Types;
    type
      TJvInspectorColorItem = class(TJvCustomInspectorItem)
      private
      protected
        function NameForColor(const Color: TColor): string;
        procedure PaintValue(const Color: TColor; const ColorName: string;const ACanvas: TCanvas; const ARect: TRect);
        procedure SetFlags(const Value: TInspectorItemFlags); override;
        procedure SetRects(const RectKind: TInspectorPaintRect; Value: TRect); override;
        procedure ButtonClick(Sender: TObject); override;
        function GetDisplayValue: string; override;
        procedure SetDisplayValue(const Value: string); override;
      public
        constructor Create(const AParent: TJvCustomInspectorItem;
          const AData: TJvCustomInspectorData); override;
        procedure BeforeDestruction; override;
        procedure DrawValue(const ACanvas: TCanvas); override;
        class procedure RegisterAsDefaultItem;
        class procedure UnregisterAsDefaultItem;
      end;
    
    implementation
    uses JvResources,SysUtils,Dialogs,Windows;
    
    function Color2RGB(Color:TColor):Integer;
    begin
      Result:=0;
      Result:=Result or((Color and $FF) shl 16);
      //Result:=Result or(Color shl 16);
      Result:=Result or(((Color shr 8) and $FF) shl 8);
      //Result:=Result or(Color and $0000FF00);
      Result:=Result or(((Color shr 16) and $FF));
    end;
    
    //=== { TJvInspectorColorItem } ==============================================
    
    procedure TJvInspectorColorItem.ButtonClick(Sender: TObject);
    var
      ColorDlg:TColorDialog;
    begin
      ColorDlg:=TColorDialog.Create(nil);
      try
        if ColorDlg.Execute then
        begin
          //DisplayValue:=NameForColor(FColor);
          Data.AsOrdinal:=ColorDlg.Color;
        end;
      finally
        ColorDlg.Free;
      end;
      inherited;
    end;
    
    constructor TJvInspectorColorItem.Create(const AParent: TJvCustomInspectorItem;
      const AData: TJvCustomInspectorData);
    begin
      inherited Create(AParent, AData);
      Flags := [iifVisible, iifEditButton,iifEditFixed];
    end;
    
    function TJvInspectorColorItem.NameForColor(const Color: TColor): string;
    var
      RGBColor:Integer;
    begin
      RGBColor:=Color2RGB(Color);
      Result := '0x'+IntToHex(RGBColor,6);
    end;
    
    procedure TJvInspectorColorItem.PaintValue(const Color: TColor; const ColorName: string;
      const ACanvas: TCanvas; const ARect: TRect);
    var
      TH: Integer;
      BoxRect: TRect;
      bc: TColor;
      pc: TColor;
      txtRect: TRect;
    begin
      TH := Rects[iprValue].Bottom - Rects[iprValue].Top - 2;
      BoxRect.Left := ARect.Left + (ARect.Bottom - ARect.Top - TH) div 2;
      BoxRect.Top := ARect.Top + BoxRect.Left - ARect.Left;
      BoxRect.Right := BoxRect.Left + TH;
      BoxRect.Bottom := BoxRect.Top + TH;
      with ACanvas do
      begin
        if Color <> clNone then
        begin
          bc := Brush.Color;
          pc := Pen.Color;
          try
            Brush.Color := Color;
            //Pen.Color := BorderColor(bc, Color);
            Rectangle(BoxRect);
          finally
            Pen.Color := pc;
            Brush.Color := bc;
          end;
        end;
       txtRect := ARect;
       txtRect.Left := txtRect.Left + (txtRect.Bottom-txtRect.Top)+ 1;
       TextRect(txtRect, txtRect.Left, BoxRect.Top, ColorName);
      end;
    end;
    
    procedure TJvInspectorColorItem.SetDisplayValue(const Value: string);
    begin
      inherited;
      OutputDebugString(PWideChar(Value));
    end;
    
    procedure TJvInspectorColorItem.SetFlags(const Value: TInspectorItemFlags);
    begin
      inherited SetFlags(Value + [iifEditButton,iifEditFixed]);
    end;
    
    procedure TJvInspectorColorItem.SetRects(const RectKind: TInspectorPaintRect; Value: TRect);
    begin
      if RectKind = iprValue then
        Value.Left := Value.Left + (Value.Bottom - Value.Top) + 2;
      inherited SetRects(RectKind, Value);
    end;
    
    procedure TJvInspectorColorItem.BeforeDestruction;
    begin
    
      inherited BeforeDestruction;
    end;
    
    procedure TJvInspectorColorItem.DrawValue(const ACanvas: TCanvas);
    var
      Color: TColor;
      S: string;
      ARect: TRect;
      SafeColor: TColor;
    begin
      Color := clNone;
      if Data = nil then
        S := RsJvInspItemUnInitialized
      else
      try
        if not Data.IsInitialized then
          S := RsJvInspItemUnInitialized
        else
        if not Data.HasValue then
          S := RsJvInspItemNoValue
        else
        if not Data.IsAssigned then
          S := RsJvInspItemUnassigned
        else
        begin
          S := DisplayValue;
          Color := Data.AsOrdinal;
        end;
      except
        S := RsJvInspItemValueException + ExceptObject.ClassName + ': ' +
          Exception(ExceptObject).Message;
      end;
      ARect := Rects[iprValueArea];
      SafeColor := ACanvas.Brush.Color;
      if Editing then
        ACanvas.Brush.Color := clWindow;
      try
        ACanvas.FillRect(ARect);
        PaintValue(Color, S, ACanvas, ARect);
        if Editing then
          DrawEditor(ACanvas);
      finally
        if Editing then
          ACanvas.Brush.Color := SafeColor;
      end;
    end;
    
    function TJvInspectorColorItem.GetDisplayValue: string;
    begin
      Result:=NameForColor(Data.AsOrdinal);
    end;
    
    class procedure TJvInspectorColorItem.RegisterAsDefaultItem;
    begin
      with TJvCustomInspectorData.ItemRegister do
        if IndexOf(Self) = -1 then
          Add(TJvInspectorTypeInfoRegItem.Create(Self, TypeInfo(TColor)));
    end;
    
    class procedure TJvInspectorColorItem.UnregisterAsDefaultItem;
    begin
      TJvCustomInspectorData.ItemRegister.Delete(Self);
    end;
    
    end.

    Effect image

    DownLoad the Unit
  • 相关阅读:
    Python--day61--Django ORM单表操作之展示用户列表
    Python--day61 PyCharm连接MySQL工具的使用
    Python--day61--ORM介绍及Django使用ORM创建表
    Python--day49--ORM框架SQLAlchemy之relationship的使用(有时间要从新看,这里状态不好,没有仔细听)
    Python--day48--ORM框架SQLAlchemy之子查询
    Python--day48--ORM框架SQLAlchemy操作表
    Python--day48--ORM框架SQLAlchemy
    Python--day48--面向对象回顾
    web api 限制单个IP在一定时间内访问次数
    前端常用js插件
  • 原文地址:https://www.cnblogs.com/neugls/p/2006252.html
Copyright © 2020-2023  润新知