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

📄 wwinspectorprop.pas

📁 胜天进销存源码,国产优秀的进销存
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit wwInspectorProp;
{
//
// Components : Design-time property editors for inspector
//
// Copyright (c) 1999-2001 by Woll2Woll Software
//
// 2/8/2000 - Repaint inspector after move
}
{$i wwIfDef.pas}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ComCtrls, ExtCtrls,
       {$ifdef wwdelphi6up}
       designintf, designeditors,
       {$else}
       dsgnintf,
       {$endif}
  checklst,
  Mask, wwdbedit, Wwdotdot, Wwdbcomb, wwdatainspector;

type
  TInspectorPropEdit = class(TForm)
    Panel2: TPanel;
    NewItemButton: TSpeedButton;
    NewSubItemButton: TSpeedButton;
    DeleteButton: TSpeedButton;
    MoveUpButton: TSpeedButton;
    MoveDownButton: TSpeedButton;
    Button5: TButton;
    procedure NewItemButtonClick(Sender: TObject);
    procedure NewSubitemButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure MoveButtonClick(Sender: TObject);
    procedure TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure TreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
   procedure TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure DeleteButtonClick(Sender: TObject);
    procedure TreeViewChange(Sender: TObject; Node: TTreeNode);
    procedure TreeViewExpanded(Sender: TObject; Node: TTreeNode);
    procedure TreeViewCollapsed(Sender: TObject; Node: TTreeNode);
    procedure TreeViewCustomDrawItem(Sender: TCustomTreeView;
       Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure Button5Click(Sender: TObject);
  private
     TreeView: TTreeView;
//     DesignerForm: TCustomForm;
     Designer:
        {$ifdef wwDelphi6Up} IDesigner;
        {$else} {$ifdef wwDelphi4Up} IFormDesigner; {$else} TFormDesigner; {$endif}
        {$endif}
//     {$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
     Inspector: TwwDataInspector;
     SkipUpdate: boolean;
     SkipChange: boolean;
     procedure AddChildrenToTree(ParentNode: TTreeNode; Items: TwwInspectorCollection);
     procedure AddChildrenToInspector(ParentNode: TTreeNode; ParentItem: TwwInspectorItem);
//     procedure UpdateComponent;
     procedure RefreshNodeText(ParentNode: TTreeNode);
  public
    destructor Destroy; override;
    procedure Update; override;
    { Public declarations }
  end;

Function ExecuteInspectorEditor(
   ADesigner:
//     {$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
        {$ifdef wwDelphi6Up} IDesigner;
        {$else} {$ifdef wwDelphi4Up} IFormDesigner; {$else} TFormDesigner; {$endif}
        {$endif}
//   ADesignerForm: TCustomForm;
   AEdit: TwwDataInspector): boolean;

var
  InspectorPropEdit: TInspectorPropEdit=nil;

implementation

{$R *.DFM}

uses typinfo, wwcommon, wwprpfld, db;

type

 TObjTreeView=class(TTreeView)
  private
    LastSelectedNode: TTreeNode;
    MultiSelectActive: boolean;
  protected
    procedure UnselectAllNodes(IgnoreNode: TTreeNode);
    function CreateNode: TTreeNode; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
                X, Y: Integer); override;
    Function MultiSelectCount: integer;
    function NumChildren: integer;

 end;

 TObjTreeNode=class(TTreeNode)
 public
   Caption: string;
   ObjItem: TwwInspectorItem;
   MultiSelected: boolean;

   constructor Create(AOwner: TTreeNodes); virtual;
   destructor Destroy; override;
   procedure InvalidateNode;
 end;

 constructor TObjTreeNode.Create(AOwner: TTreeNodes);
 begin
    inherited Create(AOwner);
 end;

 destructor TObjTreeNode.Destroy;
 begin
    if TObjTreeView(TreeView).LastSelectedNode= self then
       TObjTreeView(TreeView).LastSelectedNode:= nil;

    inherited Destroy;
 end;

 procedure TObjTreeNode.InvalidateNode;
 var r: TRect;
 begin
     R := DisplayRect(False);
     InvalidateRect(TreeView.handle, @R, True);
 end;

function ExecuteInspectorEditor(
   ADesigner: //{$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
        {$ifdef wwDelphi6Up} IDesigner;
        {$else} {$ifdef wwDelphi4Up} IFormDesigner; {$else} TFormDesigner; {$endif}
        {$endif}
//   ADesignerForm: TCustomForm;
   AEdit: TwwDataInspector): boolean;
begin
  if InspectorPropEdit <> nil then InspectorPropEdit.Free;
  InspectorPropEdit := TInspectorPropEdit.Create(Application);

  with InspectorPropEdit do
  begin
//     DesignerForm:= ADesignerForm;
     Designer:= ADesigner;
     Inspector:= AEdit;
     Inspector.Designer := InspectorPropEdit;
     AddChildrenToTree(nil, Inspector.Items);
     Show;
  end;
  result:= true;
end;


Function TObjTreeView.MultiSelectCount: integer;
var count: Integer;
    Node: TObjTreeNode;
begin
   count:= 0;
   Node:= Items.GetFirstNode as TObjTreeNode;
   while Node<>nil do begin
      if Node.MultiSelected then inc(count);
      Node:= Node.GetNext as TObjTreeNode;
   end;
   result:= count;
end;

procedure TObjTreeView.UnselectAllNodes(IgnoreNode: TTreeNode);
var Node: TObjTreeNode;
begin
   Node:= Items.GetFirstNode as TObjTreeNode;
   while Node<>nil do begin
      if Node<>IgnoreNode then
      begin
         if Node.MultiSelected then begin
            Node.MultiSelected:= false;
            Node.InvalidateNode;
         end
      end;
      Node:= Node.GetNext as TObjTreeNode;
   end;
end;

procedure TInspectorPropEdit.TreeViewCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
   if (Node as TObjTreeNode).multiselected then
   begin
      Sender.Canvas.Brush.Color:= clHighlight;
      Sender.Canvas.Font.Color:= clHighlightText;
   end
   else if Node.Selected and (TreeView as TObjTreeView).MultiSelectActive then
   begin
      Sender.Canvas.Brush.Color:= clWindow;
      Sender.Canvas.Font.Color:= clWindowText;
   end;
//   Sender.Canvas.Font.assign(TObjTreeView(sender).Font);
end;

procedure TObjTreeView.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
var Node, CurNode, LastNode: TObjTreeNode;
    hitTest: THitTests;
    {$ifdef wwDelphi5Up}
    Selections: IDesignerSelections;
    {$else}
    Selections: TComponentList;
    {$endif}

   Function SameLevelShiftSelect: boolean;
   begin
       result:=
         (ssShift in Shift) and
         ((LastSelectedNode<>Nil) and (LastSelectedNode.parent=Node.parent) or
          (LastSelectedNode=Nil))
   end;

  procedure AddSelections;
  var Node: TObjTreeNode;
  begin
     Node:= Items.GetFirstNode as TObjTreeNode;
     while Node<>nil do begin
        if Node.MultiSelected then begin
           {$ifdef wwDelphi6Up}
           Selections.Add(Node.ObjItem);
           {$else}
             {$ifdef wwDelphi5Up}
             Selections.Add(MakeIPersistent(Node.ObjItem));
             {$else}
             Selections.Add(Node.ObjItem);
             {$endif}
           {$endif}
        end;
        Node:= Node.GetNext as TObjTreeNode;
     end;
  end;


begin

   inherited MouseDown(Button, Shift, X, Y);

   Node:= GetNodeAt(X, Y) as TObjTreeNode;
   if Node=Nil then exit;

   hitTest:= GetHitTestInfoAt(X, Y);

   if (ssDouble in Shift) and (Button = mbLeft) then Exit;

   If (hitTest * [htOnItem, htOnLabel, htOnRight] <> []) then
   begin
      if (not (ssCtrl in Shift)) then
      begin
         if SameLevelShiftSelect then begin
            UnselectAllNodes(LastSelectedNode)
         end
         else
            UnselectAllNodes(nil);
      end;

      if (ssShift in Shift) then begin
         if SamelevelShiftSelect and (LastSelectedNode<>nil) then begin
            if Node.index>LastSelectedNode.index then begin
               curNode:= LastSelectedNode as TObjTreeNode;
               curNode.multiselected:= true;
               LastNode:= Node;

               while curNode<>LastNode do begin
                  curNode:= curNode.GetNextSibling as TObjTreeNode;
                  if curNode=Nil then break;
                  curNode.multiselected:= true;
                  MultiSelectActive:= True;
                  invalidate;
               end;
            end
            else begin
               curNode:= Node;
               LastNode:= LastSelectedNode as TObjTreeNode;
               while curNode<>LastNode do begin
                  curNode.multiselected:= true;
                  MultiSelectActive:= True;
                  invalidate;
                  curNode:= curNode.GetNextSibling as TObjTreeNode;
                  if curNode=Nil then break;
               end;
               if curNode=LastNode then curNode.multiselected:= true;
            end;
            if not node.selected then node.selected:= True;
         end
      end
      else begin
          if Node<>nil then
             with Node as TObjTreeNode do begin
                if ssCtrl in Shift then
                begin
                  MultiSelectActive:= True;
                  { Select previous node if no previous selections }
                  if (LastSelectedNode<>nil) and
                     not (LastSelectedNode as TObjTreeNode).MultiSelected and
                     (MultiSelectCount=0) then
                     (LastSelectedNode as TObjTreeNode).multiSelected:= True;
                  Node.MultiSelected:= not Node.MultiSelected;
                  invalidate;
                end;
                if not node.selected then node.selected:= True;
             end;
      end;

   end;

   if not (ssShift in Shift) then
      LastSelectedNode:= Node;

   if MultiSelectActive then
   begin
       if (Owner as TInspectorPropEdit).Designer<>nil then begin
          {$ifndef wwDelphi5Up}
          Selections := TComponentList.Create;
          {$else}
          Selections := CreateSelectionList;
          {$endif}

          AddSelections;
          if Selections.Count > 0 then
             (Owner as TInspectorPropEdit).Designer.SetSelections(Selections);
          {$ifndef wwDelphi5Up}
          Selections.Free;
          {$endif}
       end;
   end
end;



destructor TInspectorPropEdit.Destroy;
begin
  Inspector.Designer := nil;
  InspectorPropEdit:= nil;
  inherited Destroy;
end;

(*procedure TInspectorPropEdit.UpdateComponent;
var i: integer;
    Node: TObjTreeNode;
    Item: TwwInspectorItem;
begin
   SkipUpdate:= True;
   Inspector.BeginUpdate;
   for i:= Inspector.Items.Count-1 downto 0 do
      Inspector.Items[i].Free;

   Node := TObjTreeNode(TreeView.Items.GetFirstNode);
   while Node <> nil do
   begin
      Item:= TwwInspectorItem.create(Inspector.Items);
      AddChildrenToInspector(Node, Item);
      Node := TObjTreeNode(Node.GetNextSibling);
   end;
   SkipUpdate:= False;
   Inspector.EndUpdate;
end;
*)
function TObjTreeView.CreateNode: TTreeNode;
begin
  Result := TObjTreeNode.Create(Items);
end;

function TObjTreeView.NumChildren: integer;
var Node: TTreeNode;
    count: Integer;
begin
     Node := Items.GetFirstNode;
     count:= 0;
     while Node <> nil do
     begin
        inc(count);
        Node := Node.GetNextSibling;
     end;
     result:= count;
end;

{ Update displaynames for each node in tree }
procedure TInspectorPropEdit.RefreshNodeText(ParentNode: TTreeNode);
var Node: TTreeNode;
begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -