rm_editordictionary.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 922 行 · 第 1/2 页

PAS
922
字号
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 := Report.Dictionary.RealFieldName[aList[i]]
      else
        lStr := Report.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));
  if Node.ImageIndex = Variable_Category then
    lVariableName := ' ' + Node.Text
  else if Node.ImageIndex = Variable_Variable then
    lVariableName := Node.Text
  else
    Exit;

  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
      s := aNode.Item[i].Text;
      n := FFieldAliases.IndexOf(lItemName + '."' + GetItemName(s) + '"');
      if n <> -1 then
        FFieldAliases.Delete(n);
    end;
    btnFieldDeleteAll.Enabled := treeFieldAliases.Items.Count > 1;
  end;

begin
  lNode := treeFieldAliases.Selected;
  if (lNode = nil) or (lNode.ImageIndex <> Dataset_INDEX) then Exit;

  treeFieldAliasesExpanding(nil, lNode, lFlag);
  s := GetItemName(lNode.Text);
  _DeleteFieldAlias(lNode);
  lstAllDataSets.Items.Add(s);
  lNode.Delete;
  FFieldAliases.Delete(FFieldAliases.IndexOf(s));
  treeFieldAliasesChange(nil, nil);
end;

procedure TRMDictionaryForm.treeFieldAliasesExpanding(Sender: TObject;
  Node: TTreeNode; var AllowExpansion: Boolean);
var
  i, lIndex, ImageIndex: Integer;
  sl: TStringList;
  ItemName, s: string;
  liNode: TTreeNode;
  lDataSet: TRMDataSet;
  lComponent: TComponent;
begin
  if Node.ImageIndex = 3 then
    AllowExpansion := False
  else if (Node.ImageIndex = Dataset_INDEX) and (Node.GetLastChild.ImageIndex = 0) then
  begin
    Node.DeleteChildren;
    sl := TStringList.Create;
    ItemName := GetItemName(Node.Text);

    lDataSet := nil;
    lComponent := RMFindComponent(Report.Owner, ItemName);
    if (lComponent <> nil) and (lComponent is TRMDataset) then
      lDataSet := TRMDataSet(lComponent);
    if lDataSet <> nil then
    begin
      try
        lDataSet.GetFieldsList(sl);
        //      Report.Dictionary.GetDataSetFields(ItemName, sl);
      except;
      end;

      for i := 0 to sl.Count - 1 do
      begin
        ImageIndex := Field_CanSelect;
        s := sl[i];
        lIndex := FFieldAliases.IndexOf(ItemName + '."' + sl[i] + '"');
        if lIndex >= 0 then
        begin
          if FFieldAliases.Value[lIndex] <> '' then
            s := sl[i] + ' {' + FFieldAliases.Value[lIndex] + '}'
          else
            ImageIndex := Field_CannotSelect;
        end;

        treeFieldAliases.Items.AddChild(Node, s);
        liNode := Node.GetLastChild;
        liNode.ImageIndex := ImageIndex;
        liNode.SelectedIndex := ImageIndex;
      end;
    end;

    sl.Free;
  end;
end;

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

procedure TRMDictionaryForm.edtFieldAliasExit(Sender: TObject);
var
  s: string;
begin
  if edtFieldAlias.Modified then
  begin
    if (FActiveNode <> nil) and (FActiveNode <> treeFieldAliases.Items[0]) then
    begin
      s := GetItemName(FActiveNode.Text);
      FActiveNode.Text := s + ' {' + edtFieldAlias.Text + '}';
      if FActiveNode.ImageIndex = Field_CanSelect then
        s := GetItemName(FActiveNode.Parent.Text) + '."' + s + '"';
      FFieldAliases[s] := edtFieldAlias.Text;
    end;
  end;
  edtFieldAlias.Modified := False;
end;

procedure TRMDictionaryForm.btnFieldAddAllClick(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to lstAllDataSets.Items.Count - 1 do
    AddFieldAlias(lstAllDataSets.Items[i]);

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

procedure TRMDictionaryForm.btnFieldDeleteAllClick(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to FFieldAliases.Count - 1 do
  begin
    if Pos('"', FFieldAliases.Name[i]) = 0 then
      lstAllDataSets.Items.Add(FFieldAliases.Name[i]);
  end;

  FFieldAliases.Clear;
  treeFieldAliases.Items[0].DeleteChildren;
  btnFieldDeleteAll.Enabled := treeFieldAliases.Items.Count > 1;
  treeFieldAliasesChange(nil, nil);
end;

procedure TRMDictionaryForm.cmbDataSetsClick(Sender: TObject);
begin
  if cmbDataSets.ItemIndex >= 0 then
  begin
    RMDesigner.Report.Dictionary.GetDataSetFields(cmbDataSets.Items[cmbDataSets.ItemIndex],
      lstFields.Items, FFieldAliases);
  end
  else
    lstFields.Items.Clear;

  lstFields.Items.Insert(0, RMLoadStr(SNotAssigned));
end;

procedure TRMDictionaryForm.edtExpressionEnter(Sender: TObject);
begin
  FActiveNode := treeVariables.Selected;
end;

procedure TRMDictionaryForm.edtExpressionExit(Sender: TObject);
begin
  if (FActiveNode = nil) or (FActiveNode.ImageIndex <> 6) then Exit;
  if edtExpression.Modified then
  begin
    FVariables[FActiveNode.Text] := edtExpression.Text;
  end;

  edtExpression.Modified := False;
  FActiveNode := nil;
end;

procedure TRMDictionaryForm.PageControl1Change(Sender: TObject);
begin
  FActiveNode := nil;
  if PageControl1.ActivePage = TabSheet1 then
  begin
		FillValiableDataSets;
    treeVariablesChange(nil, treeVariables.Selected);
  end;
end;

procedure TRMDictionaryForm.chkFieldNoSelectClick(Sender: TObject);
var
  liNode: TTreeNode;
  ItemName, FullName: string;
begin
  if FBusyFlag then Exit;
  liNode := treeFieldAliases.Selected;
  if (liNode = nil) or (liNode = treeFieldAliases.Items[0]) then Exit;

  if liNode.ImageIndex in [Field_CanSelect, Field_CannotSelect] then
  begin
    ItemName := GetItemName(liNode.Text);
    FullName := GetItemName(liNode.Parent.Text) + '."' + ItemName + '"';
    if liNode.ImageIndex = Field_CanSelect then
      liNode.ImageIndex := Field_CannotSelect
    else
      liNode.ImageIndex := Field_CanSelect;
    liNode.SelectedIndex := liNode.ImageIndex;

    if liNode.ImageIndex = Field_CanSelect then
      FFieldAliases.Delete(FFieldAliases.IndexOf(FullName))
    else
      FFieldAliases[FullName] := '';
    liNode.Text := ItemName;
  end;
end;

procedure TRMDictionaryForm.treeFieldAliasesChange(Sender: TObject; Node: TTreeNode);
var
  s: string;
begin
  if edtFieldAlias.Modified then edtFieldAliasExit(nil);

  FActiveNode := treeFieldAliases.Selected;
  btnFieldDeleteOne.Enabled := (FActiveNode.ImageIndex = Dataset_INDEX);
  btnFieldDeleteAll.Enabled := treeFieldAliases.Items.Count > 1;
  if FActiveNode <> treeFieldAliases.Items[0] then
  begin
    s := FActiveNode.Text;
    if Pos('{', s) <> 0 then
      s := Copy(s, Pos('{', s) + 1, Pos('}', s) - Pos('{', s) - 1);
    edtFieldAlias.Text := s;
  end
  else
    edtFieldAlias.Text := '';

  FBusyFlag := True;
  RMEnableControls([Label2, edtFieldAlias], FActiveNode.ImageIndex <> 0);
  chkFieldNoSelect.Enabled := FActiveNode.ImageIndex in [Field_CanSelect, Field_CannotSelect];
  chkFieldNoSelect.Checked := (FActiveNode <> treeFieldAliases.Items[0]) and
    (FActiveNode.ImageIndex = Field_CannotSelect);
  FBusyFlag := False;
end;

procedure TRMDictionaryForm.btnPackDictionaryClick(Sender: TObject);
begin
  THackDictionary(Report.Dictionary).Pack1(FFieldAliases);
end;

end.

⌨️ 快捷键说明

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