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

📄 fctreeview_itemseditor.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit fcTreeView_ItemsEditor;

interface

{$i fcIfDef.pas}

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, fcTreeView, ExtCtrls, checklst, fcCommon,   {$ifdef fcdelphi6up}
  designintf,
  {$else}
  dsgnintf,
  {$endif}
  Buttons;

type
  TfcTreeViewItemsEditor = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    TextEdit: TEdit;
    GroupBox2: TGroupBox;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    ImageIndexEdit: TEdit;
    SelectedIndexEdit: TEdit;
    StateIndexEdit: TEdit;
    ShowCheckBox: TCheckBox;
    CheckListBox: TCheckListBox;
    TreeView: TfcTreeView;
    StringData1Edit: TEdit;
    Label5: TLabel;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    Label6: TLabel;
    StringData2Edit: TEdit;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button4: TButton;
    Panel2: TPanel;
    NewItemButton: TSpeedButton;
    NewSubitemButton: TSpeedButton;
    DeleteButton: TSpeedButton;
    MoveUpButton: TSpeedButton;
    MoveDownButton: TSpeedButton;
    LoadButton: TSpeedButton;
    SpeedButton1: TSpeedButton;
    CheckboxRadioGroup: TGroupBox;
    CheckboxButton: TRadioButton;
    RadioButton: TRadioButton;
    GrayedCheckbox: TCheckBox;
    procedure NewItemButtonClick(Sender: TObject);
    procedure NewSubitemButtonClick(Sender: TObject);
    procedure DeleteButtonClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button3Click(Sender: TObject);
    procedure TextEditChange(Sender: TObject);
    procedure ShowCheckBoxClick(Sender: TObject);
    procedure StateIndexEditExit(Sender: TObject);
    procedure SelectedIndexEditExit(Sender: TObject);
    procedure ImageIndexEditExit(Sender: TObject);
    procedure CheckListBoxClickCheck(Sender: TObject);
    procedure CheckListBoxDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure CheckListBoxClick(Sender: TObject);
    procedure TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure MoveButtonClick(Sender: TObject);
    procedure TreeViewMouseDown(TreeView: TfcCustomTreeView; Node: TfcTreeNode; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure TreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure StateIndexEditKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure StringData1EditExit(Sender: TObject);
    procedure LoadButtonClick(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure StringData2EditExit(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure CheckboxButtonClick(Sender: TObject);
    procedure RadioButtonClick(Sender: TObject);
    procedure GrayedCheckboxClick(Sender: TObject);
    procedure TreeViewToggleCheckbox(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode);
    procedure TreeViewChanging(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; var AllowChange: Boolean);
    procedure TreeViewChange(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode);
    procedure TreeViewCalcNodeAttributes(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; State: TfcItemStates);
    procedure Button4Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    SuspendCheckboxList: Boolean;
    InRefreshControls: boolean;
    DataModified: boolean;
    OrigTreeView: TfcCustomTreeView;
//    DragFlag: Boolean;
    procedure RefreshControls;
    procedure UpdateNode(UpdateAll: boolean);
    procedure RefreshChecklistBox(Node: TfcTreeNode);
    procedure FillChecklistBox;
    procedure SetCheckboxEnabled(val: boolean);
    { Private declarations }
  public
    { Public declarations }
  end;

  {$ifdef fcDelphi6Up}
  TFormDesigner = IDesigner;
  {$else}
  TFormDesigner = IFormDesigner;
  {$endif}

  procedure ExecuteTreeNodesEditor(ADesigner: TFormDesigner; ATreeView: TfcTreeView);

var
  fcTreeViewItemsEditor: TfcTreeViewItemsEditor;

implementation

{$R *.DFM}

type TEditorTreeView = class(TfcTreeView);

procedure ExecuteTreeNodesEditor(ADesigner: TFormDesigner; ATreeView: TfcTreeView);
begin
  with TfcTreeViewItemsEditor.Create(Application) do
  begin
    TEditorTreeView(TreeView).NodeClass := TEditorTreeView(ATreeView).NodeClass;
    OrigTreeView:= ATreeView;
    TreeView.Items.Assign(ATreeView.Items);
    TreeView.MultiSelectAttributes.Assign(ATreeView.MultiSelectAttributes);

    TreeView.Font.Assign(ATreeView.Font);
    TreeView.Font.Color:= clWindowText; { 3/9/00 - Use window text for design - time }

    if ATreeView.Images <> nil then
      TreeView.Images:= ATreeView.Images;
    if ATreeView.StateImages <> nil then
      TreeView.StateImages := ATreeView.StateImages;
    TreeView.Options:= ATreeView.Options - [tvoAutoURL, tvoHideSelection];
    TreeView.Indent:= ATreeView.Indent;
    if ShowModal = mrOK then
    begin
      ATreeView.Items.Assign(TreeView.Items);
      if ADesigner <> nil then ADesigner.Modified else ShowMessage('nil');
    end;
    Free;
  end;
end;

procedure TfcTreeViewItemsEditor.NewItemButtonClick(Sender: TObject);
var ParentOfSelected: TfcTreeNode;
    Node: TfcTreeNode;
begin
//   UpdateNode(False);


   if TreeView.Selected=Nil then ParentOfSelected:= Nil
   else ParentOfSelected:= TreeView.Selected.parent;

   TreeView.selected := TreeView.Items.AddChild(ParentOfSelected, '');

   if parentOfSelected=nil then
      Node := TfcTreeNode(TreeView.Items.GetFirstNode)
   else
      Node := TfcTreeNode(parentOfSelected.GetFirstChild);

   if (Node<>Nil) and (Node.CheckboxType=tvctRadioGroup) then
   begin
      TfcTreeNode(TreeView.selected).CheckboxType:= tvctRadioGroup;
      TfcTreeNode(TreeView.selected).StateIndex:= 1;
   end;

   RefreshControls;
   UpdateNode(False);
   TextEdit.setFocus;

end;

procedure TfcTreeViewItemsEditor.NewSubitemButtonClick(Sender: TObject);
begin
//   UpdateNode;

   if TreeView.selected<>Nil then
   begin
      TreeView.selected:= TreeView.Items.AddChild(TreeView.Selected, '');
      UpdateNode(False);
      TextEdit.setFocus;
   end;
end;

procedure TfcTreeViewItemsEditor.DeleteButtonClick(Sender: TObject);
begin
  if TreeView.selected <> nil then
  begin
    TreeView.Items.Delete(TreeView.Selected);
    RefreshControls;
  end
end;

type TTempTree = class(TfcTreeView);

procedure TfcTreeViewItemsEditor.FillChecklistBox;
var BooleanProps: TStringList;
    i: Integer;
    Node: TfcTreeNode;
begin
  Node := TTempTree(TreeView).NodeClass.Create(TreeView.Items);

  ChecklistBox.Items.Clear;
  BooleanProps := TStringList.Create;
  try
    fcGetBooleanProps(Node, BooleanProps);
    if BooleanProps.count>0 then
    begin
       CheckListbox.enabled:= True;
       TabStop:= True;
    end;
    for i := 0 to BooleanProps.Count - 1 do
      ChecklistBox.Items.Add(BooleanProps[i]);
  finally
    BooleanProps.Free;
    Node.Free;
  end;
end;

procedure TfcTreeViewItemsEditor.RefreshChecklistBox(Node: TfcTreeNode);
var i: Integer;
begin
  SuspendCheckboxList := True;
  for i := 0 to CheckListBox.Items.Count - 1 do
    ChecklistBox.Checked[ChecklistBox.Items.Count - 1] :=
      Boolean(fcGetOrdProp(Node, ChecklistBox.Items[i]));
  SuspendCheckboxList := False;
end;

procedure TfcTreeViewItemsEditor.RefreshControls;
var haveSelection: boolean;
begin
   haveSelection:= TreeView.selected<>Nil;
   InRefreshControls:= True;

   DeleteButton.enabled:= haveSelection;
   NewSubItemButton.enabled:= haveSelection;
   TextEdit.enabled:= haveSelection;
   ImageIndexEdit.enabled:= haveSelection;
   StringData1Edit.enabled:= haveSelection;
   StringData2Edit.enabled:= haveSelection;
   SelectedIndexEdit.enabled:= haveSelection;
   StateIndexEdit.enabled:= haveSelection;
   ShowCheckbox.enabled:= haveSelection;
   CheckListBox.Enabled := haveSelection;
   if ShowCheckBox.enabled then
   begin
       ShowCheckbox.enabled:= haveSelection and
          not TreeView.MultiSelectCheckboxNeeded(TreeView.Selected);
       if not ShowCheckbox.enabled then begin
          ShowCheckbox.checked:= false;
       end
   end;

   if TreeView.selected <> nil then
   begin
      RefreshChecklistBox(TreeView.Selected);
      TextEdit.text:= TreeView.Selected.Text;
      ImageIndexEdit.text:= inttostr(TreeView.Selected.ImageIndex);
      StringData1Edit.text:= TreeView.Selected.StringData;
      StringData2Edit.text:= TreeView.Selected.StringData2;
      SelectedIndexEdit.text:= inttostr(TreeView.Selected.SelectedIndex);
      StateIndexEdit.text:= inttostr(TreeView.Selected.StateIndex);
      ShowCheckbox.checked:= (TreeView.Selected as TfcTreeNode).CheckboxType<>tvctNone;

      If ShowCheckbox.checked then begin
         StateIndexEdit.enabled:= False;
         if (TreeView.Selected as TfcTreeNode).CheckboxType=tvctRadioGroup then
         begin
            CheckboxButton.checked:= False;
            RadioButton.checked:= True;
         end
         else begin
            CheckboxButton.checked:= True;
            RadioButton.checked:= False;
         end;
         GrayedCheckbox.checked:= TreeView.Selected.Grayed;
      end
      else begin
         CheckboxButton.checked:= True;
         RadioButton.checked:= False;
      end;
      SetCheckboxEnabled(ShowCheckbox.checked);
   end;
   InRefreshControls:= False;

end;

procedure TfcTreeViewItemsEditor.SetCheckboxEnabled(val: boolean);
begin
    CheckboxButton.enabled:= val;
    RadioButton.enabled:= val;
    GrayedCheckbox.enabled:= val;
end;

procedure TfcTreeViewItemsEditor.UpdateNode(UpdateAll: boolean);

    procedure SetSiblingsToRadio(Node: TfcTreeNode; RadioGroupFlag: boolean);
    begin
       Node:=  TreeView.GetFirstSibling(Node);
{       parentNode:= TwwTreeNode(TreeView.selected.parent);
       if parentNode=nil then
          Node := TreeView.Items.GetFirstNode as TwwTreeNode
       else
          Node := TwwTreeNode(parentNode.GetFirstChild);
}
       while Node <> nil do
       begin
          if RadioGroupFlag then begin
             Node.CheckboxType:= tvctRadioGroup;
             Node.StateIndex:=strtoint(StateIndexEdit.text);
          end
          else if Node.CheckboxType=tvctRadioGroup then begin
             Node.CheckboxType:= tvctNone;
             Node.StateIndex:=-1;
          end;
          Node := TfcTreeNode(Node.GetNextSibling);
       end;
       TreeView.Invalidate;
    end;

begin
    if TreeView.selected<>nil then begin
       DataModified:= True;
       TreeView.Selected.Text := TextEdit.text;
       if ImageIndexEdit.text<>'' then
          TreeView.Selected.ImageIndex:= strtoint(ImageIndexEdit.text);
       if StringData1Edit.text<>'' then
          TreeView.Selected.StringData:= StringData1Edit.text;
       if StringData2Edit.text<>'' then
          TreeView.Selected.StringData2:= StringData2Edit.text;
       if SelectedIndexEdit.text<>'' then
          TreeView.Selected.SelectedIndex:= strtoint(SelectedIndexEdit.text);
       if StateIndexEdit.text<>'' then
          TreeView.Selected.StateIndex:= strtoint(stateindexedit.text);

       if not UpdateAll then exit;

       if ShowCheckbox.checked then
       begin
          if RadioButton.checked then { Radio group }
             SetSiblingsToRadio(TfcTreeNode(TreeView.selected), True)
          else begin
             SetSiblingsToRadio(TfcTreeNode(TreeView.selected), False);

⌨️ 快捷键说明

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