📄 jvregautoeditorform.pas
字号:
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvRegAutoEditorForm.PAS, released on 2002-07-04.
The Initial Developers of the Original Code are: Andrei Prygounkov <a dott prygounkov att gmx dott de>
Copyright (c) 1999, 2002 Andrei Prygounkov
All Rights Reserved.
Contributor(s):
Last Modified: 2002-07-04
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
description : Design-time Editor for TJvRegAuto component
Known Issues:
Some russian comments were translated to english; these comments are marked
with [translated]
-----------------------------------------------------------------------------}
{$I JVCL.INC}
unit JvRegAutoEditorForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
StdCtrls, ExtCtrls, ComCtrls, Buttons, Menus,
{$IFDEF COMPILER6_UP}
DesignIntf, DesignEditors,
{$ELSE}
DsgnIntf,
{$ENDIF COMPILER6_UP}
{$IFDEF COMPILER4_UP}
ImgList,
{$ENDIF COMPILER4_UP}
JvRegAuto, JvComponent;
type
TJvRegAutoEditor = class(TComponentEditor)
function GetVerbCount: Integer; override;
function GetVerb(Index: Integer): string; override;
procedure ExecuteVerb(Index: Integer); override;
end;
TJvRegEditor = class(TForm)
panelBottom: TPanel;
panelTop: TPanel;
panelOKCancelApply: TPanel;
btnOk: TButton;
btnCancel: TButton;
panelButtons: TPanel;
edtProp: TEdit;
TreeImages: TImageList;
Tree: TTreeView;
btnAddProp: TSpeedButton;
List: TListBox;
PopupMenu1: TPopupMenu;
Sort1: TMenuItem;
procedure btnOkClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TreeChange(Sender: TObject; Node: TTreeNode);
procedure btnAddPropClick(Sender: TObject);
procedure ListKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ListClick(Sender: TObject);
procedure TreeEnter(Sender: TObject);
procedure ListDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure FormCreate(Sender: TObject);
procedure edtPropChange(Sender: TObject);
procedure edtPropKeyPress(Sender: TObject; var Key: Char);
procedure ListDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure ListDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure TreeDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure TreeDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure ListEnter(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Sort1Click(Sender: TObject);
private
Component: TJvRegAuto;
FProps: string;
FModified: Boolean;
procedure Apply;
procedure TreeLoad;
procedure ListLoad;
procedure PropAdd;
procedure PropDelete;
procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
public
constructor Create1(AOwner: TComponent; lComponent: TComponent);
property Modified: Boolean read FModified;
end;
implementation
uses
JvConsts, JvCtlConst, TypInfo, ExptIntf, JvDsgnIntf;
{$R *.DFM}
//=== TJvRegAutoEditor =======================================================
function TJvRegAutoEditor.GetVerbCount: Integer;
begin
Result := inherited GetVerbCount + 1;
end;
function TJvRegAutoEditor.GetVerb(Index: Integer): string;
begin
if Index = GetVerbCount - 1 then
Result := 'Editor'
else
Result := inherited GetVerb(Index);
end;
procedure TJvRegAutoEditor.ExecuteVerb(Index: Integer);
var
RegEditor: TJvRegEditor;
begin
if Index = GetVerbCount - 1 then
begin
RegEditor := TJvRegEditor.Create1(nil, Component);
try
RegEditor.ShowModal;
if RegEditor.Modified then
Designer.Modified;
finally
RegEditor.Free;
end
end
else
inherited ExecuteVerb(Index);
end;
//=== TJvLoadProgress ========================================================
type
TJvLoadProgress = class(TForm)
ProgressBar: TProgressBar;
procedure btnCancelClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
Canceled: Boolean;
end;
var
LoadProgress: TJvLoadProgress;
const
// Indexes of pictures in TreeImages [translated]
imUnknown = 4;
imClass = 4;
imInteger = 1;
imChar = 1;
imString = 1;
imEnumeration = 1;
imComponent = 3; // With this picture start komponety [translated]
function LoadProgressCreate: TJvLoadProgress;
begin
{$IFDEF DELPHI}
Result := TJvLoadProgress.CreateNew(Application);
{$ELSE}
Result := TJvLoadProgress.CreateNew(Application, 1);
{$ENDIF}
with Result do
begin
OnClose := FormClose;
Width := 279;
Height := 148;
BorderStyle := bsDialog;
Position := poScreenCenter;
Caption := 'JvRegAuto Editor';
with TLabel.Create(Result) do
begin
Parent := Result;
Caption := 'Reading RTTI';
Left := 68;
Top := 16;
Font.Size := 10;
Font.Style := [fsBold];
end;
with TButton.Create(Result) do
begin
Parent := Result;
Left := 96;
Top := 88;
Caption := 'Cancel';
OnClick := btnCancelClick;
end;
ProgressBar := TProgressBar.Create(Result);
with ProgressBar do
begin
Parent := Result;
SetBounds(7, 56, 257, 18);
end;
Canceled := False;
end;
end;
procedure TJvLoadProgress.btnCancelClick(Sender: TObject);
begin
Canceled := True;
end;
procedure TJvLoadProgress.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
//=== TJvRegEditor ===========================================================
constructor TJvRegEditor.Create1(AOwner: TComponent; lComponent: TComponent);
begin
inherited Create(AOwner);
Component := lComponent as TJvRegAuto;
FProps := Component.Props.Text;
FModified := False;
end;
procedure TJvRegEditor.btnOkClick(Sender: TObject);
begin
Apply;
Close;
end;
procedure TJvRegEditor.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TJvRegEditor.Apply;
begin
Component.Props := List.Items;
end;
procedure TJvRegEditor.FormShow(Sender: TObject);
begin
LoadProgress := LoadProgressCreate;
try
LoadProgress.Show;
TreeLoad;
finally
LoadProgress.Close;
end;
ListLoad;
end;
procedure TJvRegEditor.ListLoad;
begin
List.Items.Assign(Component.Props);
end;
function IsEnabled(S: ShortString): Boolean;
var
P: Integer;
begin
P := Pos(#0, S);
Result := not ((P = 0) or (Length(S) <= P) or (S[P + 1] = 'N'));
end;
procedure TJvRegEditor.TreeLoad;
const
SOrdType: array [0..5] of PChar =
('Shortint', 'Byte', 'Integer', 'Word', 'Longint', 'Cardinal');
SFloatType: array [0..4] of PChar =
('Single', 'Double', 'Extended', 'Comp', 'Currency');
var
I, J: Integer;
ANode: TTreeNode;
TypeInf: PTypeInfo;
TypeData: PTypeData;
PropList: PPropList;
NumProps: word;
AName: string;
CompList: TList;
Comp: TComponent;
procedure AddToTree(AComponent: TComponent; APropInfo: PPropInfo; Node: TTreeNode);
var
ATypeInfo: PTypeInfo;
aPropList: PPropList;
aNumProps: Word;
I: Integer;
MyNode: TTreeNode;
begin
ATypeInfo := APropInfo^.PropType^;
TypeData := GetTypeData(ATypeInfo);
MyNode := nil;
with ATypeInfo^ do
case Kind of
tkUnknown:
begin
MyNode :=
Tree.Items.AddChild(Node, 'Unknown - ' + AName + #0 + 'N');
MyNode.ImageIndex := imUnknown; // Picture - Not possible to select [translated]
end;
tkInteger:
begin
MyNode :=
Tree.Items.AddChild(Node, AName + ' : '
+ SOrdType[Integer(TypeData^.OrdType)] + #0 + 'Y');
MyNode.ImageIndex := imInteger; // Picture - Possible to select [translated]
end;
tkFloat:
begin
MyNode :=
Tree.Items.AddChild(Node, AName + ' : '
+ SFloatType[Integer(TypeData^.FloatType)] + #0 + 'Y');
MyNode.ImageIndex := imInteger; // Picture - Possible to select [translated]
end;
tkWChar,
tkChar:
begin
MyNode :=
Tree.Items.AddChild(Node, AName + ' : '
+ System.Copy(GetEnumName(TypeInfo(TTypeKind)
, Integer(Kind)), 3, 255) + #0 + 'Y');
MyNode.ImageIndex := imChar; // Picture - Possible to select [translated]
end;
tkEnumeration:
begin
MyNode :=
Tree.Items.AddChild(Node, AName + ' : '
+ ATypeInfo^.Name + #0 + 'Y');
MyNode.ImageIndex := imEnumeration; // Picture - Possible to select [translated]
end;
tkString, tkLString {, tkWString}:
begin
MyNode :=
Tree.Items.AddChild(Node, AName + ' : '
+ ATypeInfo^.Name + ' ( '
+ Format('String[%d]', [TypeData^.MaxLength])
+ ' )' + #0 + 'Y');
MyNode.ImageIndex := imString; // Picture - Possible to select [translated]
end;
tkClass:
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -