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
- display and edit the data object
- manage child items
- 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?
- How to add a category?
- How to edit a property?
- How to edit a string?
- How to edit font?
- How to edit font name?
- How to edit simple data types?
- How to edit color?
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])).
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

浙公网安备 33010602011771号