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

📄 rm_editordictionary.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 3 页
字号:
      if not FindCategory(' ' + Result) then
        break;
    end;
  end;

begin
  TreeNode := treeVariables.Selected;
  if treeVariables.ShowRoot = False then
  begin
    TreeNode.Delete;
    TreeNode := nil;
    treeVariables.ShowRoot := True;
  end;
  if TreeNode <> nil then
    TreeNode := treeVariables.Items[0];

  s := CreateNewCategory;
  FVariables[' ' + s] := '';
  ANode := treeVariables.Items.Add(TreeNode, s);
  ANode.ImageIndex := 5;
  ANode.SelectedIndex := 5;
  treeVariables.Selected := ANode;
  ANode.EditText;
end;

procedure TRMDictionaryForm.btnNewVarClick(Sender: TObject);
var
  ANode, TreeNode: TTreeNode;
  s: string;

  function CreateNewVariable: string;
  var
    i: Integer;

    function FindVariable(s: string): Boolean;
    var
      i: Integer;
    begin
      Result := False;
      for i := 0 to FVariables.Count - 1 do
      begin
        if AnsiCompareText(FVariables.Name[i], s) = 0 then
        begin
          Result := True;
          break;
        end;
      end;
    end;

  begin
    for i := 1 to 10000 do
    begin
      Result := 'Variable' + IntToStr(i);
      if not FindVariable(Result) then
        break;
    end;
  end;

begin
  TreeNode := treeVariables.Selected;
  if (TreeNode = nil) or not treeVariables.ShowRoot then Exit;
  if TreeNode.Parent <> nil then
    TreeNode := TreeNode.Parent;

  s := CreateNewVariable;

  if TreeNode.GetNextSibling <> nil then
    FVariables.Insert(FVariables.IndexOf(' ' + TreeNode.GetNextSibling.Text), s,'')
  else
    FVariables[s] := '';

  ANode := treeVariables.Items.AddChild(TreeNode, s);
  ANode.ImageIndex := 6;
  ANode.SelectedIndex := 6;
  TreeNode.Expand(True);
  treeVariables.Selected := ANode;
  ANode.EditText;
end;

procedure TRMDictionaryForm.btnEditClick(Sender: TObject);
var
  TreeNode: TTreeNode;
begin
  TreeNode := treeVariables.Selected;
  if (TreeNode <> nil) and treeVariables.ShowRoot then
    TreeNode.EditText;
end;

procedure TRMDictionaryForm.btnDelClick(Sender: TObject);
var
  TreeNode: TTreeNode;
  i: integer;
begin
  TreeNode := treeVariables.Selected;
  if (TreeNode <> nil) and treeVariables.ShowRoot then
  begin
    if TreeNode.ImageIndex = 5 then
    begin
      i := FVariables.IndexOf(' ' + TreeNode.Text);
      FVariables.Delete(i);
      while (i < FVariables.Count) and (FVariables.Name[i][1] <> ' ') do
        FVariables.Delete(i);
    end
    else
      FVariables.Delete(FVariables.IndexOf(TreeNode.Text));

    TreeNode.Delete;
    if treeVariables.Items.Count = 0 then
    begin
      TreeNode := treeVariables.Items.Add(treeVariables.Selected, RMLoadStr(SNotAssigned));
      TreeNode.ImageIndex := -1;
      TreeNode.SelectedIndex := -1;
      treeVariables.ShowRoot := False;
      treeVariables.Selected := treeVariables.Items[0];
    end;
  end;
end;

procedure TRMDictionaryForm.treeVariablesKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = vk_Insert then
  begin
    if ssCtrl in Shift then
      btnNewCategoryClick(nil)
    else if (treeVariables.Selected = nil) or (treeVariables.ShowRoot = False) then
      btnNewCategory.Click
    else
      btnNewVar.Click;
  end
  else if (Key = vk_Delete) and not treeVariables.IsEditing then
    btnDel.Click
  else if Key = vk_Return then
    btnEdit.Click
  else if (Key = vk_Escape) and not treeVariables.IsEditing then
    btnCancel.Click;
end;

procedure TRMDictionaryForm.treeVariablesEdited(Sender: TObject; Node: TTreeNode; var S: string);
var
  s1: string;
begin
  if Node.ImageIndex = 6 then
    s1 := s
  else
    s1 := ' ' + s;
  if (AnsiCompareText(s, Node.Text) <> 0) and (FVariables.IndexOf(s1) <> -1) then
    s := Node.Text
  else
  begin
    if Node.ImageIndex = 6 then
      FVariables.Name[FVariables.IndexOf(Node.Text)] := s1
    else
      FVariables.Name[FVariables.IndexOf(' ' + Node.Text)] := s1;
  end;
end;

procedure TRMDictionaryForm.edtExpressionKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
    treeVariables.SetFocus;
end;

procedure TRMDictionaryForm.btnExpressionClick(Sender: TObject);
var
  expr: string;
begin
  expr := edtExpression.Text;
  if RMGetExpression('', expr, nil, False) then
  begin
    edtExpression.Text := expr;
    edtExpression.SetFocus;
    edtExpression.Modified := True;
  end;
end;

procedure TRMDictionaryForm.lstFieldsClick(Sender: TObject);
var
  liNode: TTreeNode;
  liValue: string;
begin
  if edtExpression.Modified then
    edtExpressionExit(nil);

  liNode := treeVariables.Selected;
  if (liNode = nil) or (liNode.ImageIndex <> 6) then Exit;

  if lstFields.ItemIndex <= 0 then
    liValue := ''
  else
    liValue := cmbDataSets.Text + '."' + lstFields.Items[lstFields.ItemIndex] + '"';

  FVariables[liNode.Text] := liValue;
end;

procedure TRMDictionaryForm.ShowValue(aValue: string);
var
  i, n: Integer;
  s1, s2: string;
  Found: Boolean;

  function FindStr(aList: TStrings; aStr: string; aIsField: Boolean): Integer;
  var
    i: Integer;
    lStr: string;
  begin
    Result := -1;
    for i := 0 to aList.Count - 1 do
    begin
      if aIsField then
        lStr := CurReport.Dictionary.RealFieldName[nil, aList[i]]
      else
        lStr := CurReport.Dictionary.RealDataSetName[aList[i]];

      if AnsiCompareText(lStr, aStr) = 0 then
      begin
        Result := i;
        Break;
      end;
    end;
  end;

begin
  s1 := '';
  s2 := '';
  Found := False;

  if Pos('.', aValue) <> 0 then
  begin
    for i := Length(aValue) downto 1 do
    begin
      if aValue[i] = '.' then
      begin
        s1 := Copy(aValue, 1, i - 1);
        s2 := Copy(aValue, i + 1, 255);
        break;
      end;
    end;

    n := FindStr(cmbDataSets.Items, s1, FALSE);
    if n <> -1 then
    begin
      if cmbDataSets.ItemIndex <> n then
      begin
        cmbDataSets.ItemIndex := n;
        cmbDataSetsClick(nil);
      end;
      if (s2 <> '') and (s2[1] = '"') then
        s2 := Copy(s2, 2, Length(s2) - 2);
      n := FindStr(lstFields.Items, s2, TRUE);
      if n <> -1 then
      begin
        lstFields.ItemIndex := n;
        Found := True;
      end;
    end;
  end;

  if not Found then
  begin
    if Trim(aValue) = '' then
    begin
      lstFields.ItemIndex := 0;
      edtExpression.Text := '';
    end;

    edtExpression.Text := aValue;
    lstFields.ItemIndex := 0;
  end
  else
  begin
    edtExpression.Text := '';
  end;
end;

procedure TRMDictionaryForm.treeVariablesChange(Sender: TObject; Node: TTreeNode);
var
  lVariableName: string;
begin
  if edtExpression.Modified then
    edtExpressionExit(nil);

  RMEnableControls([edtExpression, btnExpression], (Node <> nil) and (Node.ImageIndex = Variable_Variable));

  lVariableName := '';
  if (Node <> nil) and (Node.ImageIndex = Variable_Category) then
    lVariableName := ' ' + Node.Text
  else if (Node <> nil) and (Node.ImageIndex = Variable_Variable) then
    lVariableName := Node.Text;

  if lVariableName <> '' then
    ShowValue(FVariables[lVariableName]);
end;

procedure TRMDictionaryForm.lstAllDataSetsDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  s: string;
  liBmp: TBitmap;
  liCanvas: TCanvas;
begin
  liBmp := TBitmap.Create;
  liCanvas := nil;
  try
    if Control = lstAllDataSets then
    begin
      liCanvas := lstAllDataSets.Canvas;
      s := lstAllDataSets.Items[Index];
      ImageList1.GetBitmap(Dataset_INDEX, liBmp);
    end
    else if Control = cmbDataSets then
    begin
      liCanvas := cmbDataSets.Canvas;
      s := cmbDataSets.Items[Index];
      ImageList1.GetBitmap(Dataset_INDEX, liBmp);
    end
    else if Control = lstFields then
    begin
      liCanvas := lstFields.Canvas;
      s := lstFields.Items[Index];
      ImageList1.GetBitmap(Field_INDEX, liBmp);
    end;

    if liCanvas <> nil then
    begin
      liCanvas.FillRect(Rect);
      liCanvas.BrushCopy(Bounds(Rect.Left + 2, Rect.Top, liBmp.Width, liBmp.Height),
        liBmp, Bounds(0, 0, liBmp.Width, liBmp.Height), liBmp.TransparentColor);
      liCanvas.TextOut(Rect.Left + 4 + liBmp.Width, Rect.Top, s);
    end;
  finally
    liBmp.Free;
  end;
end;

function GetItemName(const s: string): string;
var
  liPos: Integer;
begin
  liPos := Pos('{', s);
  if liPos > 0 then
    Result := Trim(Copy(s, 1, liPos - 1))
  else
    Result := s;
end;

procedure TRMDictionaryForm.AddFieldAlias(const aDataSet: string);
var
  liNode: TTreeNode;
begin
  if aDataSet <> '' then
  begin
    treeFieldAliases.Items.AddChild(treeFieldAliases.Items[0], aDataSet);
    liNode := treeFieldAliases.Items[0].GetLastChild;
    liNode.ImageIndex := Dataset_INDEX;
    liNode.SelectedIndex := Dataset_INDEX;
    treeFieldAliases.Items.AddChild(liNode, RMLoadStr(SNotAssigned));
    FFieldAliases[aDataSet] := '';
  end;
  btnFieldDeleteAll.Enabled := treeFieldAliases.Items.Count > 1;
end;

procedure TRMDictionaryForm.btnFieldAddOneClick(Sender: TObject);
var
  i: Integer;
begin
  i := 0;
  while i < lstAllDataSets.Items.Count do
  begin
    if lstAllDataSets.Selected[i] then
    begin
      AddFieldAlias(lstAllDataSets.Items[i]);
      lstAllDataSets.Items.Delete(i);
    end
    else
      Inc(i);
  end;

  treeFieldAliases.Items[0].Expand(False);
  treeFieldAliases.Selected := treeFieldAliases.Items[0];
end;

procedure TRMDictionaryForm.btnFieldDeleteOneClick(Sender: TObject);
var
  lNode: TTreeNode;
  lFlag: Boolean;
  s: string;

  procedure _DeleteFieldAlias(aNode: TTreeNode);
  var
    i, n: Integer;
    s, lItemName: string;
  begin
    lItemName := GetItemName(aNode.Text);
    for i := 0 to aNode.Count - 1 do
    begin

⌨️ 快捷键说明

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