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 + -
显示快捷键?