rm_dsgform.pas

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

PAS
2,142
字号

  lBmp := TBitmap.Create;
  try
    j := 0;
    for i := 0 to RMAddInsCount - 1 do
    begin
      if (not RMAddIns(i).IsPage) and (RMAddIns(i).Page = lPage) then
      begin
        lBmp.LoadFromResourceName(Hinstance, RMAddIns(i).ButtonBmpRes);
        //        FImageList.Add(lBmp, nil);
        FImageList.AddMasked(lBmp, lBmp.TransparentColor);

        lMenuItem := TMenuItem.Create(Self);
        lMenuItem.Caption := RMAddIns(i).ButtonHint;
        if (lMenuItem.Caption = '') and (RMAddIns(i).ClassRef <> nil) then
          lMenuItem.Caption := RMAddIns(i).ClassRef.ClassName;
        lMenuItem.Tag := rmgtAddIn + i;
        lMenuItem.OnClick := OnAddInObectMenuItemClick;
        lMenuItem.ImageIndex := j;
        FPopupMenuComponent.Items.Add(lMenuItem);
        Inc(j);
      end;
    end;
  finally
    FreeAndNil(lBmp);
  end;

  lPoint := Point(TSpeedButton(Sender).Left + TSpeedButton(Sender).Height,
    TSpeedButton(Sender).Top);
  lPoint := ClientToScreen(lPoint);
  FPopupMenuComponent.Popup(lPoint.X, lPoint.Y);
end;

procedure TRMToolbarComponent.OnBandMenuPopup(Sender: TObject);
var
  i: Integer;
  lItem: TMenuItem;
  t: TRMView;
  lIsSubreport: Boolean;
begin
  FBtnNoSelect.Down := True;
  t := FDesignerForm.IsSubreport(FDesignerForm.CurPage);
  if (t <> nil) and (TRMSubReportView(t).SubReportType = rmstChild) then
    lIsSubreport := True
  else
    lIsSubreport := False;

  for i := 0 to FBandsMenu.Items.Count - 1 do
  begin
    lItem := FBandsMenu.Items[i];
    lItem.Enabled := (TRMBandType(lItem.Tag) in [rmbtHeader, rmbtFooter, rmbtGroupHeader,
      rmbtGroupFooter, rmbtMasterData, rmbtDetailData]) or
      (not FDesignerForm.RMCheckBand(TRMBandType(lItem.Tag)));

    if lIsSubreport and (TRMBandType(lItem.Tag) in
      [rmbtReportTitle, rmbtReportSummary, rmbtPageHeader, rmbtPageFooter,
      rmbtGroupHeader, rmbtGroupFooter, rmbtColumnHeader, rmbtColumnFooter]) then
      lItem.Enabled := False;
  end;
end;

procedure TRMToolbarComponent.OnAddBandEvent(Sender: TObject);
var
  t, t1: TRMView;
  liTop, dx, dy: Integer;

  function _GetMaxTop: Integer;
  var
    i: Integer;
    t: TRMView;
  begin
    Result := 0;
    for i := 0 to FDesignerForm.PageObjects.Count - 1 do
    begin
      t := FDesignerForm.PageObjects[i];
      if t.IsBand and (not (TRMCustomBandView(t).BandType in [rmbtCrossHeader, rmbtCrossData, rmbtCrossFooter])) and
        (t.spBottom_Designer > Result) then
        Result := t.spBottom_Designer;
    end;
    if RM_Class.RMShowBandTitles then
      Result := Result + 18;
  end;

begin
  if FDesignerForm.SelNum = 1 then
    t1 := FDesignerForm.PageObjects[FDesignerForm.TopSelected]
  else
    t1 := nil;

  FDesignerForm.UnselectAll;
  FDesignerForm.FWorkSpace.DrawPage(dmSelection);

  t := RMCreateBand(TRMBandType(TComponent(Sender).Tag));
  t.ParentPage := FDesignerForm.Page;
  FDesignerForm.SetObjectID(t);
  if TRMBandType(TComponent(Sender).Tag) in [rmbtCrossHeader, rmbtCrossData, rmbtCrossFooter,
    rmbtOverlay] then
  begin
    t.Selected := True;
    dx := 36;
    dy := 36;
    FDesignerForm.GetDefaultSize(dx, dy);
    FDesignerForm.SelNum := 1;
    if TRMBandType(TComponent(Sender).Tag) = rmbtOverlay then
    begin
      t.spTop_Designer := _GetMaxTop;
      t.spHeight_Designer := dy;
    end
    else
    begin
      t.spLeft_Designer := 0;
      t.spTop_Designer := 0;
      t.spWidth_Designer := dx;
      t.spHeight_Designer := dy;
    end;
    FDesignerForm.SendBandsToDown;
  end
  else
  begin
    liTop := FDesignerForm.FWorkSpace.Height;
    if (t1 <> nil) and t1.IsBand and (TRMCustomBandView(t1).BandType in [rmbtMasterData, rmbtDetailData]) then
    begin
      case TRMCustomBandView(t).BandType of
        rmbtGroupHeader, rmbtHeader: liTop := t1.spTop_Designer - 1;
        rmbtGroupFooter, rmbtFooter: liTop := t1.spTop_Designer + t1.spBottom_Designer;
      end;
    end;
    t.spTop_Designer := liTop;
    t.spHeight_Designer := 18;
    FDesignerForm.SendBandsToDown;
    FDesignerForm.Page.UpdateBandsPageRect;
    FDesignerForm.RedrawPage;
    t.Selected := True;
    FDesignerForm.SelNum := 1;
  end;

  FDesignerForm.Modified := True;
  FDesignerForm.SendBandsToDown;
  FDesignerForm.FWorkSpace.Draw(FDesignerForm.TopSelected, RM_ClipRgn);
  FDesignerForm.SelectionChanged(True);
  FDesignerForm.ShowPosition;
  FDesignerForm.AddUndoAction(acInsert);
end;

procedure TRMToolbarComponent.OnOB1ClickEvent(Sender: TObject);
begin
  FBtnNoSelect.Down := True;
  FDesignerForm.ObjRepeat := False;
end;

procedure TRMToolbarComponent.RefreshControls;
var
  i: Integer;
  liControl: TControl;
  liNowTop: Integer;
begin
  FBusy := True;
  liNowTop := FBtnUp.Top + FBtnUp.Height;
  for i := 3 to ControlCount - 1 do
  begin
    liControl := Controls[i];
    if i < FControlIndex then
      liControl.Visible := False
    else if liNowTop + ButtonWidth < FBtnDown.Top then
    begin
      liControl.Visible := True;
      liControl.Top := liNowTop;
      Inc(liNowTop, ButtonWidth);
    end
    else
      liControl.Visible := False;
  end;

  FBtnUp.Enabled := FControlIndex > 3;
  FBtnDown.Enabled := not Controls[ControlCount - 1].Visible;
  FBusy := False;
end;

procedure TRMToolbarComponent.OnResizeEvent(Sender: TObject);
begin
  FBtnDown.Top := Self.Height - FBtnDown.Height;
  if not FBusy then
    RefreshControls;
end;

procedure TRMToolbarComponent.OnBtnUpClickEvent(Sender: TObject);
begin
  if FControlIndex > 3 then
  begin
    Dec(FControlIndex);
    if not FBusy then
      RefreshControls;
  end;
end;

procedure TRMToolbarComponent.OnBtnDownClickEvent(Sender: TObject);
begin
  if FControlIndex < ControlCount then
  begin
    Inc(FControlIndex);
    if not FBusy then
      RefreshControls;
  end;
end;

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TRMWorkSpace }

constructor TRMWorkSpace.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Parent := AOwner as TWinControl;
  BevelInner := bvNone;
  BevelOuter := bvNone;
  Color := clWhite;
  BorderStyle := bsNone;

  PageForm := nil;

  OnMouseDown := OnMouseDownEvent;
  OnMouseUp := OnMouseUpEvent;
  OnMouseMove := OnMouseMoveEvent;
  OnDblClick := OnDoubleClickEvent;
  OnDragOver := DoDragOver;
  OnDragDrop := DoDragDrop;
end;

destructor TRMWorkSpace.Destroy;
begin
  inherited;
end;

procedure TRMWorkSpace.Init;
begin
  FDragFlag := False;
  FMouseButtonDown := False;
  FDoubleClickFlag := False;
  FObjectsSelecting := False;
  Cursor := crDefault;
  FCursorType := ctNone;
end;

procedure TRMWorkSpace.SetPage;
var
  lWidth, lHeight: Integer;
  x1, y1, x2, y2: Integer;
begin
  if (FDesignerForm = nil) or (FDesignerForm.Page = nil) then Exit;

  if FDesignerForm.Page is TRMDialogPage then
  begin
    Align := alClient;
  end
  else
  begin
    lWidth := Round(TRMReportPage(FDesignerForm.Page).PrinterInfo.PageWidth * FDesignerForm.Factor / 100);
    lHeight := Round(TRMReportPage(FDesignerForm.Page).PrinterInfo.PageHeight * FDesignerForm.Factor / 100);
		if FDesignerForm.FUnlimitedHeight then
    	lHeight := lHeight * 3;

    Align := alNone;

    x1 := Round(TRMReportPage(FDesignerForm.Page).spMarginLeft * FDesignerForm.Factor / 100);
    y1 := Round(TRMReportPage(FDesignerForm.Page).spMarginTop * FDesignerForm.Factor / 100);
    x2 := lWidth - x1 - Round(TRMReportPage(FDesignerForm.Page).spMarginRight * FDesignerForm.Factor / 100);
    y2 := lHeight - y1 - Round(TRMReportPage(FDesignerForm.Page).spMarginBottom * FDesignerForm.Factor / 100);
    //Color := FDesignerForm.WorkSpaceColor;
    SetBounds(x1, y1, x2, y2);
  end;
end;

procedure TRMWorkSpace.Paint;
begin
  FDesignerForm.SetRulerOffset;
  FDesignerForm.RedrawPage;
end;

procedure TRMWorkSpace.RoundCoord(var x, y: Integer);
begin
  with FDesignerForm do
  begin
    if GridAlign then
    begin
      x := x div GridSize * GridSize;
      y := y div GridSize * GridSize;
    end;
  end;
end;

procedure TRMWorkSpace.NormalizeRect(var r: TRect);
var
  i: Integer;
begin
  with r do
  begin
    if Left > Right then begin i := Left;
      Left := Right;
      Right := i
    end;
    if Top > Bottom then begin i := Top;
      Top := Bottom;
      Bottom := i
    end;
  end;
end;

procedure TRMWorkSpace.NormalizeCoord(t: TRMView);
begin
  if t.spWidth_Designer < 0 then
  begin
    t.spWidth_Designer := -t.spWidth_Designer;
    t.spLeft_Designer := t.spLeft_Designer - t.spWidth_Designer;
  end;
  if t.spHeight_Designer < 0 then
  begin
    t.spHeight_Designer := -t.spHeight_Designer;
    t.spTop_Designer := t.spTop_Designer - t.spHeight_Designer;
  end;
end;

procedure TRMWorkSpace.GetMultipleSelected;
var
  i, j, k: Integer;
  t: TRMView;
begin
  j := 0;
  k := 0;
  FLeftTop := Point(10000, 10000);
  FRightBottom := -1;
  RM_SelectedManyObject := False;
  if FDesignerForm.SelNum > 1 then {find right-bottom element}
  begin
    for i := 0 to FDesignerForm.PageObjects.Count - 1 do
    begin
      t := FDesignerForm.PageObjects[i];
      if t.Selected then
      begin
        THackView(t).OriginalRect := Rect(t.spLeft_Designer, t.spTop_Designer, t.spWidth_Designer, t.spHeight_Designer);
        if (t.spLeft_Designer + t.spWidth_Designer > j) or ((t.spLeft_Designer + t.spWidth_Designer = j) and (t.spTop_Designer + t.spHeight_Designer > k)) then
        begin
          j := t.spLeft_Designer + t.spWidth_Designer;
          k := t.spTop_Designer + t.spHeight_Designer;
          FRightBottom := i;
        end;
        if t.spLeft_Designer < FLeftTop.x then FLeftTop.x := t.spLeft_Designer;
        if t.spTop_Designer < FLeftTop.y then FLeftTop.y := t.spTop_Designer;
      end;
    end;

    if FRightBottom >= 0 then
    begin
      t := FDesignerForm.PageObjects[FRightBottom];
      RM_OldRect := Rect(FLeftTop.x, FLeftTop.y, t.spLeft_Designer + t.spWidth_Designer, t.spTop_Designer + t.spHeight_Designer);
      RM_OldRect1 := RM_OldRect;
    end;
    RM_SelectedManyObject := True;
  end;
end;

procedure TRMWorkSpace.OnMouseDownEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
  f, DontChange, v: Boolean;
  t: TRMView;
  Rgn: HRGN;
  p: TPoint;
begin
  FBandMoved := False;
  if FDoubleClickFlag then
  begin
    FDoubleClickFlag := False;
    Exit;
  end;
  DrawPage(dmSelection);
  FMouseButtonDown := True;
  DontChange := False;
  if Button = mbLeft then
  begin
    if (ssCtrl in Shift) or (Cursor = crCross) then
    begin
      FObjectsSelecting := True;
      if Cursor = crCross then
      begin
//        if FDesignerForm.Page is TRMReportPage then
          DrawFocusRect(RM_OldRect);
        RoundCoord(x, y);
        RM_OldRect1 := RM_OldRect;
      end;
      RM_OldRect := Rect(x, y, x, y);
      FDesignerForm.UnselectAll;
      FDesignerForm.SelNum := 0;
      FRightBottom := -1;
      RM_SelectedManyObject := False;
      FDesignerForm.FirstSelected := nil;
      Exit;
    end;
  end;

  if Cursor = crDefault then
  begin
    f := False;
    for i := FDesignerForm.PageObjects.Count - 1 downto 0 do
    begin
      t := FDesignerForm.PageObjects[i];
      Rgn := t.GetClipRgn(rmrtNormal);
      v := PtInRegion(Rgn, X, Y);
      DeleteObject(Rgn);
      if v then
      begin
        if ssShift in Shift then
        begin
          t.Selected := not t.Selected;
          if t.Selected then Inc(FDesignerForm.SelNum) else Dec(FDesignerForm.SelNum);
        end
        else
        begin
          if not t.Selected then
          begin
            FDesignerForm.UnselectAll;
            FDesignerForm.SelNum := 1;
            t.Selected := True;
          end
          else DontChange := True;
        end;
        if FDesignerForm.SelNum = 0 then FDesignerForm.FirstSelected := nil
        else if FDesignerForm.SelNum = 1 then FDesignerForm.FirstSelected := t
        else if FDesignerForm.FirstSelected <> nil then
          if not FDesignerForm.FirstSelected.Selected then FDesignerForm.FirstSelected := nil;

⌨️ 快捷键说明

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