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

📄 jvregautoeditorform.pas

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