aprstped.pas

来自「delphi编程控件」· PAS 代码 · 共 843 行 · 第 1/2 页

PAS
843
字号
    for j := 0 to List.Count - 1 do
      AddProperties(trcnode, List.Objects[j].ClassInfo, AKinds,
        '', True, TPersistent(List.Objects[j]));

    if trcnode.HasChildren then begin
      FList.Clear;
      GetTreeNodeStructure(trcnode, FList);
      for j := 0 to FList.Count - 1 do
        for k := 0 to List.Count - 1 do begin
          trnode1 := TreeView.Items.AddChild(TTreeNode(FList[j]), List[k]);
          if(IsStoredProperty(TComponent(List.Objects[k]), TTreeNode(FList[j]).Text)) then
            trnode1.StateIndex := 1;
        end;
    end;
    if Not trcnode.HasChildren then trcnode.Free
  end;
  List.Free;
  FList.Free;
end;

procedure TfAutoPropertiesStoreEdit.BuildPropertiesTree;
Var
  i, j : Integer;
  trnode, trnode1 : TTreeNode;
begin
  TreeView.Items.Clear;
  FillPropNameList(GetTypeKinds);
  for i := 0 to PropNameList.Count - 1 do begin
    trnode := TreeView.Items.Add(Nil, PropNameList[i]);
    for j := 0 to ComponentList.Count - 1 do begin
      trnode1 := Nil;
      if(GetPropInfo(ComponentList.Objects[j].ClassInfo, PropNameList[i]) <> Nil) then
        trnode1 := TreeView.Items.AddChild(trnode, ComponentList[j]);
      if (trnode1 <> NIl)
      And (IsStoredProperty(TComponent(ComponentList.Objects[j]), PropNameList[i])) then
        trnode1.StateIndex := 1;
    end;
  end;
end;

procedure TfAutoPropertiesStoreEdit.BuildPropertiesClassTree;
Var
  i, j, k : Integer;
  trnode, trnode1, trcnode : TTreeNode;
  List : TStringList;
begin
  TreeView.Items.Clear;
  FillPropNameList(GetTypeKinds);
  List := TStringList.Create;
  for i := 0 to PropNameList.Count - 1 do begin
    trnode := TreeView.Items.Add(Nil, PropNameList[i]);
    for j := 0 to ClassList.Count - 1 do begin
      GetComponentByClasses(ClassList[j], List);
      if(GetPropInfo(List.Objects[0].ClassInfo, PropNameList[i]) <> Nil) then begin
        trcnode := TreeView.Items.AddChild(trnode, ClassList[j]);
        for k := 0 to List.Count - 1 do begin
          trnode1 := TreeView.Items.AddChild(trcnode, List[k]);
          if(IsStoredProperty(TComponent(List.Objects[k]), PropNameList[i])) then
             trnode1.StateIndex := 1;
        end;
      end;
    end;
  end;
  List.Free;
end;

procedure TfAutoPropertiesStoreEdit.ChangeStoredProperty(ATreeNode : TTreeNode);

  function GetComponent : TComponent;
  begin
    if RViewType.ItemIndex < 2 then begin
      Result := Form.FindComponent(ATreeNode.Parent.Text);
      if(Result = Nil) And (ATreeNode.Parent.Text = Form.Name) then
        Result := Form;
    end else begin
      Result := Form.FindComponent(ATreeNode.Text);
      if(Result = Nil) And (ATreeNode.Text = Form.Name) then
        Result := Form;
    end;  
  end;

  function GetPropName : String;
  Var
    tr : TTreeNode;
  begin
    if RViewType.ItemIndex < 2 then
      Result := ATreeNode.Text
      else
      if(RViewType.ItemIndex < 4) then
        Result := ATreeNode.Parent.Text
        else begin
          tr := ATreeNode;
          while tr.Parent <> Nil do
            tr := tr.Parent;
          Result := tr.Text;
        end;
  end;

var
  Component : TComponent;
  PropName : String;
  Index : Integer;
  objstore : TAutoObjectStore;

begin
  Component := GetComponent;
  PropName := GetPropName;
  Index := Store.Items.IndexOfComponent(Component);
  if(Index = -1) then
    objstore := Store.Items.Add(Component)
  else objstore := Store.Items[Index];
  if (ATreeNode.StateIndex = -1) then begin
    objstore.StoredProp.Add(PropName);
    ATreeNode.StateIndex := 1
  end else begin
    Index := objstore.StoredProp.IndexOf(PropName);
    if(Index > -1) then
    objstore.StoredProp.Delete(Index);
    if(objstore.StoredProp.Count = 0) then
      objstore.Free;
    ATreeNode.StateIndex := -1;
  end;
  DeleteDoubleTreeNode(ATreeNode);
  CreateDoubleTreeNode(ATreeNode);
  TreeView.Invalidate;
end;

function TfAutoPropertiesStoreEdit.IsStoredProperty(Component : TComponent; PropName : String) : Boolean;
Var
  i, Index : Integer;
begin
  Result := False;
  Index := Store.Items.IndexOfComponent(Component);
  if(Index > -1) then begin
    for i := 0 to Store.Items[Index].StoredProp.Count -1 do begin
      if(Propname = Store.Items[Index].StoredProp[i]) then begin
        Result := True;
        break;
      end;
    end;
  end;
end;

procedure TfAutoPropertiesStoreEdit.GetChildTreeNodes(AList : TList);
Var
  tr : TTreeNode;

  procedure GetTreeNodeStructure_(ATreeNode : TTreeNode);
  Var
    tr1 : TTreeNode;
  begin
    if(ATreeNode.HasChildren) then begin
      tr1 := ATreeNode.GetFirstChild;
      while tr1 <> Nil do begin
        GetTreeNodeStructure_(tr1);
        tr1 := ATreeNode.GetNextChild(tr1);
      end;
    end else AList.Add(ATreeNode);
  end;

begin
 AList.Clear;
 tr := TreeView.Items.GetFirstNode;
 while tr <> Nil do begin
   GetTreeNodeStructure_(tr);
   tr := tr. GetNextSibling;
 end;
end;

procedure TfAutoPropertiesStoreEdit.CreateDoubleTreeNode(ATreeNode : TTreeNode);
Var
  TV : TTreeView;
  List, List1 : TList;
  i, j : Integer;
  treenode : TTreeNode;
  FoundFlag : Boolean;

  procedure GetOneLevelTreeNodes(tr : TTreeNode);
  Var
    tr1 : TTreeNode;
  begin
    List1.Clear;
    if(tr = Nil) then begin
      tr1 := TV.Items.GetFirstNode;
      while tr1 <> Nil do begin
        List1.Add(tr1);
        tr1 := tr1. GetNextSibling;
      end;
    end else begin
      tr1 := tr.GetFirstChild;
      while tr1 <> Nil do begin
        List1.Add(tr1);
        tr1 := tr.GetNextChild(tr1);
      end;
    end;
  end;

begin
  List := TList.Create;
  List1 := TList.Create;
  if (AtreeNode.StateIndex = -1) then
    TV := TreeView2
  else TV := TreeView1;
  List.Add(AtreeNode.Parent);
  while TTreeNode(List[0]).Parent <> Nil do
    List.Insert(0, TTreeNode(List[0]).Parent);
  treenode := Nil;
  j := 0;
  for i := 0 to List.Count - 1 do begin
    FoundFlag := False;
    GetOneLevelTreeNodes(treenode);
    if(List1.Count = 0) then break;
    for j := 0 to List1.Count - 1 do
      if(CompareText((TTreeNode(List1[j])).Text, TTreeNode(List[i]).Text) >= 0) then begin
         if(TTreeNode(List[i]).Text = TTreeNode(List1[j]).Text) then begin
           treenode := TTreeNode(List1[j]);
           FoundFlag := True;
         end;
         break;
      end;
    if(Not FoundFlag) then break;
  end;

  if(i = List.Count) then begin
    GetOneLevelTreeNodes(treenode);
    for i := 0 to List1.Count - 1 do begin
      if(ATreeNode.Text <= TTreeNode(List1[i]).Text) then
        break;
    end;
    if (i < List1.Count) then
      treenode := TV.Items.Insert(TTreeNode(List1[i]), ATreeNode.Text)
    else treenode := TV.Items.Add(TTreeNode(List1.Last), ATreeNode.Text);
  end else begin
    if(i = 0) then begin
      if(j < List1.Count) then
        treenode := TV.Items.Insert(TTreeNode(List1[j]), TTreeNode(List[i]).Text)
      else treenode := TV.Items.Add(Nil, TTreeNode(List[i]).Text);
    end else begin
      if(j < List1.Count) then
        treenode := TV.Items.Insert(TTreeNode(List1[j]), TTreeNode(List[i]).Text)
      else treenode := TV.Items.AddChild(treenode, TTreeNode(List[i]).Text);
    end;
    for i := i + 1 to List.Count - 1 do
      treenode := TV.Items.AddChild(treenode, TTreeNode(List[i]).Text);
    treenode := TV.Items.AddChild(treenode, ATreeNode.Text)
  end;
  treenode.Data := ATreeNode;
  ATreeNode.Data := treeNode;
  treenode.StateIndex := ATreeNode.StateIndex;

  List.Free;
  List1.Free;
end;

procedure TfAutoPropertiesStoreEdit.DeleteDoubleTreeNode(ATreeNode : TTreeNode);
Var
  tr : TTreeNode;
  List : TList;
begin
  List := TList.Create;
  tr := TTreeNode(ATreeNode.Data);
  List.Add(tr.Parent);
  while TTreeNode(List.Last).Parent <> Nil do
    List.Add(TTreeNode(List.Last).Parent);
  tr.Free;
  while (List.Count > 0) And Not TTreeNode(List[0]).HasChildren do begin
    tr := TTreeNode(List[0]);
    List.Remove(tr);
    tr.Free;
  end;
  List.Free;
end;

procedure TfAutoPropertiesStoreEdit.TVKeyPress(ATreeView : TTreeView; var Key: Char);
begin
  if(ATreeView.Selected <> Nil) And (Key = ' ')
  And Not ATreeView.Selected.HasChildren then begin
    Key := #0;
    if(ATreeView <> TreeView) then
      ChangeStoredProperty(TTreeNode(ATreeView.Selected.Data))
    else ChangeStoredProperty(TreeView.Selected);
  end;
end;

procedure TfAutoPropertiesStoreEdit.TVDblClick(ATreeView : TTreeView);
Var
  lpht: TTVHitTestInfo;
begin
  if(ATreeView.Selected <> Nil)
  And Not (ATreeView.Selected.HasChildren) then begin
    GetCursorPos(lpht.pt);
    lpht.pt := ATreeView.ScreenToClient(lpht.pt);
    lpht.Flags := TVHT_ONITEMLABEL;
    TreeView_HitTest(ATreeView.Handle,  lpht);
    if(lpht.hItem = ATreeView.Selected.ItemId) then begin
      if(ATreeView <> TreeView) then
        ChangeStoredProperty(TTreeNode(ATreeView.Selected.Data))
      else ChangeStoredProperty(TreeView.Selected);
    end;
  end;
end;

procedure TfAutoPropertiesStoreEdit.FormCreate(Sender: TObject);
Var
  i : Integer;
begin
  ComponentList := TStringList.Create;
  ClassList := TStringList.Create;
  PropNameList := TStringList.Create;

  BOk.Caption := LoadStr(ACB_OK);
  BCancel.Caption := LoadStr(ACB_CANCEL);
  BHelp.Caption := LoadStr(ACB_HELP);
  TSAll.Caption := LoadStr(AEL_PROPSTORE_ALLP);
  TSStoredProp.Caption := LoadStr(AEL_PROPSTORE_STOREDP);
  TSNonStoredProp.Caption := LoadStr(AEL_PROPSTORE_NONSTOREDP);
  RViewType.Caption := LoadStr(AEL_PROPSTORE_VIETYPE);
  RViewType.Items.Clear;
  RViewType.Items.Add(LoadStr(AEL_PROPSTORE_VTDEFAULT));
  RViewType.Items.Add(LoadStr(AEL_PROPSTORE_VTCLASSES));
  RViewType.Items.Add(LoadStr(AEL_PROPSTORE_VTPROPERTIES));
  RViewType.Items.Add(LoadStr(AEL_PROPSTORE_VTCLASSESPROPERTIES));
  RViewType.Items.Add(LoadStr(AEL_PROPSTORE_VTPROPERTIESCLASSES));
  RViewType.ItemIndex := 0;
  GTypeKinds.Caption := LoadStr(AEL_PROPSTORE_TYPEKINDS);
  CBAllTypeKinds.Caption := LoadStr(AEL_PROPSTORE_ALLTYPEKINDS);
  LHelp1.Caption := LoadStr(AEL_PROPSTORE_HELP1);

  {$IFDEF DELPHI3_0}
  with LBTypeKinds.Items do begin
    Clear;
    Add('tkArray');
    Add('tkChar');
    Add('tkClass');
    Add('tkEnumeration');
    Add('tkFloat');
    Add('tkInteger');
    Add('tkInterface');
    Add('tkLString');
    Add('tkRecord');
    Add('tkSet');
    Add('tkString');
    Add('tkVariant');
    Add('tkWChar');
   end;
  {$ENDIF}

  for i := 0 to LBTypeKinds.Items.Count - 1 do
    LBTypeKinds.Selected[i] := True;
end;

procedure TfAutoPropertiesStoreEdit.FormDestroy(Sender: TObject);
begin
  ComponentList.Free;
  ClassList.Free;
  PropNameList.Free;
end;

procedure TfAutoPropertiesStoreEdit.RViewTypeClick(Sender: TObject);
begin
  UpdatePropTrees;
end;

procedure TfAutoPropertiesStoreEdit.CBAllTypeKindsClick(Sender: TObject);
Var
  i : Integer;
begin
  if(CBAllTypeKinds.Checked) then begin
    for i := 0 to LBTypeKinds.Items.Count - 1 do
      LBTypeKinds.Selected[i] := True;
    UpdatePropTrees;  
  end;
end;

procedure TfAutoPropertiesStoreEdit.LBTypeKindsClick(Sender: TObject);
begin
  CBAllTypeKinds.Checked := False;
  UpdatePropTrees;
end;

procedure TfAutoPropertiesStoreEdit.TreeViewKeyPress(Sender: TObject;
  var Key: Char);
begin
  TVKeyPress(TreeView, Key);
end;

procedure TfAutoPropertiesStoreEdit.TreeViewDblClick(Sender: TObject);
begin
  TVDblClick(TreeView);
end;

procedure TfAutoPropertiesStoreEdit.TreeView1KeyPress(Sender: TObject;
  var Key: Char);
begin
  TVKeyPress(TreeView1, Key);
end;

procedure TfAutoPropertiesStoreEdit.TreeView2KeyPress(Sender: TObject;
  var Key: Char);
begin
   TVKeyPress(TreeView2, Key);
end;

procedure TfAutoPropertiesStoreEdit.TreeView1DblClick(Sender: TObject);
begin
  TVDblClick(TreeView1);
end;

procedure TfAutoPropertiesStoreEdit.TreeView2DblClick(Sender: TObject);
begin
  TVDblClick(TreeView2);
end;

procedure TfAutoPropertiesStoreEdit.BHelpClick(Sender: TObject);
begin
  Application.HelpFile := 'aob_ps.hlp';
  Application.HelpContext(10003);
end;

end.

⌨️ 快捷键说明

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