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

📄 rm_editorexpr.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      Left := 10;
      Top := i * 40;
      case ParamList[i + 1] of
        'N': Caption := RMLoadStr(rmRes + 719);
        'B': Caption := RMLoadStr(rmRes + 718);
        'S', 'C': Caption := RMLoadStr(rmRes + 717);
        'V': Caption := RMLoadStr(rmRes + 720);
        'D': Caption := RMLoadStr(rmRes + 716);
        'T': Caption := RMLoadStr(rmRes + 715);
        'E': Caption := RMLoadStr(rmRes + 714);
      end;
      Caption := Format(Caption, [I + 1]);
    end;

    if ParamList[i + 1] = 'C' then
    begin
      with TComboBox.Create(Self) do
      begin
        Parent := FuncParamSB;
        Left := 10;
        Top := I * 40 + 15;
        Width := Parent.Width - 60;
        Tag := I;
        Items.Add(RMLoadStr(SNotAssigned));
        for j := 0 to RMDesigner.Page.Objects.Count - 1 do
        begin
          t := RMDesigner.Page.Objects[j];
          if t.IsBand and (TRMCustomBandView(t).BandType in [rmbtMasterData, rmbtDetailData]) then
          begin
            lStr := t.Name;
            case TRMCustomBandView(t).BandType of
              rmbtMasterData: lStr := lStr + ' (Master Data)';
              rmbtDetailData: lStr := lStr + ' (Detail Data)';
            end;
            Items.Add(lStr);
          end;
        end;
      end;
    end
    else
    begin
      with TEdit.Create(Self) do
      begin
        Parent := FuncParamSB;
        Left := 10;
        Top := I * 40 + 15;
        Width := Parent.Width - 60;
        Tag := I;
      end;
      with TSpeedButton.Create(Self) do
      begin
        Parent := FuncParamSB;
        Left := Parent.Width - 40;
        Width := 20;
        Height := 20;
        Top := I * 40 + 15;
        Caption := '...';
        Tag := I;
        OnClick := GetParamExprClick;
      end;
    end;

    FuncParamSB.VertScrollBar.Range := Length(ParamList) * 40;
    FuncParamSB.VertScrollBar.Increment := 40;
  end;

  FFuncParamsResult := 0;
  repeat
    Application.HandleMessage;
  until FFuncParamsResult <> 0;
  Result := FFuncParamsResult = 1;
  if Result then
  begin
    ParamResult := '';
    for i := 0 to FuncParamSB.ControlCount - 1 do
    begin
      if FuncParamSB.Controls[i] is TComboBox then
      begin
        if ParamResult <> '' then
          ParamResult := ParamResult + ',';

        if TComboBox(FuncParamSB.Controls[i]).ItemIndex = 0 then
          ParamResult := ParamResult + ''
        else
        begin
          lStr := TComboBox(FuncParamSB.Controls[i]).Text;
          ParamResult := ParamResult + Copy(lStr, 1, Pos(' (', lStr) - 1);
        end;
      end
      else if FuncParamSB.Controls[i] is TEdit then
      begin
//        if TEdit(FuncParamSB.Controls[I]).Text <> '' then
        begin
          if ParamResult <> '' then
            ParamResult := ParamResult + ',';
          ParamResult := ParamResult + TEdit(FuncParamSB.Controls[i]).Text;
        end;
      end;
    end;
  end;
  while FuncParamSB.ControlCount > 0 do
    FuncParamSB.Controls[0].Free;
end;

function TRMFormExpressionBuilder.GetDatafield(var Field: string): boolean;
begin
  FDatafieldResult := 0;
  PageControl1.ActivePage := TabSheetDatabase;
  repeat
    Application.HandleMessage;
  until FDatafieldResult <> 0;

  Result := FDatafieldResult = 1;
  if Result and (lstDatasets.ItemIndex > -1) and (lstFields.ItemIndex > -1) then
  begin
    if chkUseTableName.Checked then
      Field := lstDatasets.Items[lstDatasets.ItemIndex] + '."'
    else
      Field := '"';
    Field := Field + lstFields.Items[lstFields.ItemIndex] + '"';
  end
  else
    Field := '';

  if isScript and (Field <> '') then
    Field := 'GetValue(''' + Field + ''')';
end;

function TRMFormExpressionBuilder.GetFunc(var Func: string): boolean;
var
  AllArguments: string;
  Arguments: string;
begin
  PageControl1.ActivePage := TabSheetFunc;
  FFuncResult := 0;
  repeat
    Application.HandleMessage;
  until FFuncResult <> 0;

  if FFuncResult = 1 then
  begin
    Result := true;
    if (lstFunc.ItemIndex >= 0) and (lstFunc.ItemIndex <= lstFunc.Items.Count - 1) then
    begin
      Func := lstFunc.Items[lstFunc.ItemIndex];
      Arguments := GetArguments(Func);
    end;

    if Length(Arguments) > 0 then
    begin
      if GetParams(Arguments, AllArguments) then
        Func := Func + '(' + AllArguments + ')'
      else
        Result := false;
    end;
    PageControl1.ActivePage := TabSheetFunc;
  end
  else
    Result := false;

  if not Result then
    Func := '';
end;

function TRMFormExpressionBuilder.GetVariable(var Variable: string): boolean;
begin
  FVariableResult := 0;
  PageControl1.ActivePage := TabSheetVal;
  repeat
    Application.HandleMessage
  until FVariableResult <> 0;

  Result := FVariableResult = 1;
  if Result then
    Variable := FVal;
end;

procedure TRMFormExpressionBuilder.FormCreate(Sender: TObject);
begin
  FFunctionBMP := TBitmap.Create;
  FFunctionBMP.LoadFromResourceName(hInstance, 'RM_BMPFUNCTION');

  FDataSetBMP := TBitmap.Create;
  FDataSetBMP.LoadFromResourceName(hInstance, 'RM_FLD1');

  FFieldBMP := TBitmap.Create;
  FFieldBMP.LoadFromResourceName(hInstance, 'RM_FLD2');

  FVariableFolderBMP := TBitmap.Create;
  FVariableFolderBMP.LoadFromResourceName(hInstance, 'RM_FLD3');

  FVariableBMP := TBitmap.Create;
  FVariableBMP.LoadFromResourceName(hInstance, 'RM_FLD4');

  btnInsertDataField.Glyph.Assign(FDataSetBMP);
  btnInsertVariable.Glyph.Assign(FVariableBMP);

  Localize;
  PageControl1.ActivePage := TabSheetExpr;
  edtExpression := TWordWrapEdit.Create(Self);
  with edtExpression do
  begin
    Parent := TabSheetExpr;
    AutoSize := false;
    Top := lblHeading.BoundsRect.Bottom + 4;
    Left := InsertGroupBox.Left;
    Width := InsertGroupBox.Width;
    Height := InsertGroupBox.Top - Top - 4;
  end;
end;

procedure TRMFormExpressionBuilder.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if FExprResult <> 1 then
    FExprResult := 2;
end;

procedure TRMFormExpressionBuilder.btnOKClick(Sender: TObject);
begin
  FExprResult := 1;
end;

procedure TRMFormExpressionBuilder.btnCancelClick(Sender: TObject);
begin
  FExprResult := 2;
end;

procedure TRMFormExpressionBuilder.btnClearExprClick(Sender: TObject);
begin
  edtExpression.Text := '';
  edtExpression.SetFocus;
end;

procedure TRMFormExpressionBuilder.btnInsertDataFieldClick(Sender: TObject);
var
  AField: string;
begin
  if GetDatafield(AField) then
  begin
    if IsScript then
      InsertText(AField)
    else
      InsertText(AddBrackets(AField));
  end;
  PageControl1.ActivePage := TabSheetExpr;
  edtExpression.SetFocus;
end;

procedure TRMFormExpressionBuilder.btnDataFieldOKClick(Sender: TObject);
begin
  if lstDatasets.ItemIndex >= 0 then
  begin
    RM_Dsg_LastDataSet := lstDatasets.Items[lstDatasets.ItemIndex];
    FDatafieldResult := 1;
  end;
end;

procedure TRMFormExpressionBuilder.DataFieldCancelBtnClick(
  Sender: TObject);
begin
  FDatafieldResult := 2;
end;

procedure TRMFormExpressionBuilder.btnInsertFunctionClick(Sender: TObject);
var
  AFunction: string;
begin
  if GetFunc(AFunction) then
  begin
    if isScript or (Pos('(', AFunction) <> 0) then
      InsertText(AFunction)
    else
      InsertText(AddBrackets(AFunction));
  end;
  PageControl1.ActivePage := TabSheetExpr;
  edtExpression.SetFocus;
end;

procedure TRMFormExpressionBuilder.btnFunctionOKClick(Sender: TObject);
begin
  if lstFunc.ItemIndex >= 0 then
    FFuncResult := 1;
end;

procedure TRMFormExpressionBuilder.btnInsertVariableClick(Sender: TObject);
var
  AVariable: string;
begin
  if GetVariable(AVariable) then
  begin
    if isScript then
      InsertText(AVariable)
    else
      InsertText(AddBrackets(AVariable));
  end;
  PageControl1.ActivePage := TabSheetExpr;
  edtExpression.SetFocus;
end;

procedure TRMFormExpressionBuilder.btnFunctionCancelClick(Sender: TObject);
begin
  FFuncResult := 2;
end;

procedure TRMFormExpressionBuilder.lstDatasetsClick(Sender: TObject);
begin
  lstFields.Items.Clear;
  if lstDataSets.ItemIndex >= 0 then
  begin
    if FReport <> nil then
      FReport.Dictionary.GetDataSetFields(lstDataSets.Items[lstDataSets.ItemIndex],
        lstFields.Items)
    else
      RMDesigner.Report.Dictionary.GetDataSetFields(lstDataSets.Items[lstDataSets.ItemIndex],
        lstFields.Items);
  end
  else
    lstFields.Items.Clear;
end;

procedure TRMFormExpressionBuilder.AddOrClick(Sender: TObject);
begin
  InsertText(' ' + TSpeedButton(Sender).Caption + ' ');
  edtExpression.SetFocus;
end;

procedure TRMFormExpressionBuilder.lstFieldsDblClick(Sender: TObject);
begin
  if lstFields.ItemIndex >= 0 then
    btnDataFieldOK.Click;
end;

function TRMFormExpressionBuilder.CurDataSet: string;
begin
  Result := '';
  if lstVariableFolder.ItemIndex <> -1 then
    Result := lstVariableFolder.Items[lstVariableFolder.ItemIndex];
end;

procedure TRMFormExpressionBuilder.GetVariables;
begin
  if FReport <> nil then
    FReport.Dictionary.GetVariablesList(lstVariableFolder.Items[lstVariableFolder.ItemIndex],
      lstVariables.Items)
  else
    RMDesigner.Report.Dictionary.GetVariablesList(lstVariableFolder.Items[lstVariableFolder.ItemIndex],
      lstVariables.Items);
end;

procedure TRMFormExpressionBuilder.GetSpecValues;
var
  i: Integer;
begin
  with lstVariables.Items do
  begin
    Clear;
    for i := 0 to RMSpecCount - 1 do
    begin
      Add(RMLoadStr(SVar1 + i));
    end;

    for i := 0 to RMVariables.Count - 1 do
      Add(RMVariables.Name[i]);
  end;
end;

procedure TRMFormExpressionBuilder.btnVariableOKClick(Sender: TObject);
begin
  if lstVariables.ItemIndex >= 0 then
  begin
    if CurDataSet <> RMLoadStr(SSystemVariables) then
    begin
      if lstVariables.ItemIndex <> -1 then
        FVal := lstVariables.Items[lstVariables.ItemIndex];
    end
    else
    begin
      if lstVariables.ItemIndex < RMSpecCount then
        FVal := RMSpecFuncs[lstVariables.ItemIndex]
      else
        FVal := lstVariables.Items[lstVariables.ItemIndex];
    end;

    FLastVariableFolder := lstVariableFolder.Items[lstVariableFolder.ItemIndex];
    FVariableResult := 1;
  end;
end;

procedure TRMFormExpressionBuilder.btnVariableCancelClick(Sender: TObject);
begin
  FVariableResult := 2;
end;

procedure TRMFormExpressionBuilder.lstFuncDblClick(Sender: TObject);
begin
  if lstFunc.ItemIndex >= 0 then
    btnFunctionOK.Click;
end;

procedure TRMFormExpressionBuilder.btnFuncParamOkClick(Sender: TObject);
begin
  FFuncParamsResult := 1;
end;

procedure TRMFormExpressionBuilder.btnFuncArgCancelClick(Sender: TObject);
begin
  FFuncParamsResult := 2;
end;

procedure TRMFormExpressionBuilder.lstFuncClick(Sender: TObject);
begin
  SelectFunc(lstFunc.ItemIndex);
end;

procedure TRMFormExpressionBuilder.lstVariableFolderDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  s: string;
  liBmp: TBitmap;
begin
  with TListBox(Control) do
  begin
    s := Items[Index];
    if Control = lstDatasets then
      liBmp := FDataSetBMP
    else
      liBmp := FFieldBMP;

    if Control = lstVariableFolder then
      liBmp := FVariableFolderBMP
    else if Control = lstVariables then
      liBmp := FVariableBMP
    else if Control = lstFunc then
      liBmp := FFunctionBMP
    else if Control = lstDatasets then
      liBmp := FDataSetBMP
    else if Control = lstFields then
      liBmp := FFieldBMP;

    Canvas.FillRect(Rect);
    Canvas.BrushCopy(Bounds(Rect.Left + 2, Rect.Top, liBmp.Width, liBmp.Height),
      liBmp, Bounds(0, 0, liBmp.Width, liBmp.Height), liBmp.TransparentColor);
    Canvas.TextOut(Rect.Left + 4 + liBmp.Width, Rect.Top, s);
  end;
end;

procedure TRMFormExpressionBuilder.lstVariableFolderClick(Sender: TObject);
begin
  if CurDataSet = RMLoadStr(SSystemVariables) then
    GetSpecValues
  else
    GetVariables;
end;

procedure TRMFormExpressionBuilder.lstVariablesDblClick(Sender: TObject);
begin
  if lstVariables.ItemIndex >= 0 then
    btnVariableOK.Click;
end;

procedure TRMFormExpressionBuilder.TreeViewFunctionsChange(Sender: TObject;
  Node: TTreeNode);
begin
  GetFunctionList(Node.Text, lstFunc.Items);
  lstFunc.ItemIndex := 0;
  lstFuncClick(nil);
end;

procedure TRMFormExpressionBuilder.FormShow(Sender: TObject);

  procedure _FillFunctions;
  var
    i: integer;
    s: TStringList;
    TreeNode, ANode: TTreeNode;
  begin
    s := TStringList.Create;
    try
      GetFunctionFolder(s);

      TreeNode := TreeViewFunctions.Items.Add(nil, RMLoadStr(SAllCategories));
      TreeNode.ImageIndex := 0;
      TreeNode.SelectedIndex := 0;
      for i := 0 to s.Count - 1 do
      begin
        ANode := TreeViewFunctions.Items.AddChild(TreeNode, s[i]);
        ANode.ImageIndex := 1;
        ANode.SelectedIndex := 1;
      end;

      TreeViewFunctions.FullExpand;
      TreeViewFunctions.Selected := TreeViewFunctions.Items[0];
    finally
      s.Free;
    end;
  end;

  procedure _FillCategoryLB;
  var
    s: TStringList;
  begin
    s := TStringList.Create;
    if FReport <> nil then
      FReport.Dictionary.GetCategoryList(s)
    else
      RMDesigner.Report.Dictionary.GetCategoryList(s);
    s.Add(RMLoadStr(SSystemVariables));
    lstVariableFolder.Items.Assign(s);
    s.Free;
  end;

begin
  if FDataSet <> nil then
    lstDataSets.Items.Add(FDataSet.Owner.Name + '.' + FDataSet.Name)
  else
    RMDesigner.Report.Dictionary.GetDataSets(lstDatasets.Items);

  if lstDatasets.Items.IndexOf(RM_Dsg_LastDataSet) <> -1 then
    lstDatasets.ItemIndex := lstDatasets.Items.IndexOf(RM_Dsg_LastDataSet)
  else
    lstDatasets.ItemIndex := 0;
  lstDatasetsClick(nil);

  _FillCategoryLB;
  with lstVariableFolder do
  begin
    if Items.IndexOf(FLastVariableFolder) <> -1 then
      ItemIndex := Items.IndexOf(FLastVariableFolder)
    else
      ItemIndex := 0;
  end;

  lstVariableFolderClick(nil);
  _FillFunctions;
  edtExpression.SetFocus;
end;

procedure TRMFormExpressionBuilder.FormDestroy(Sender: TObject);
begin
  FFunctionBMP.Free;
  FDataSetBMP.Free;
  FFieldBMP.Free;
  FVariableFolderBMP.Free;
  FVariableBMP.Free;
end;

end.

⌨️ 快捷键说明

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