如何在ppviewer中拖动报告?

时间:2011-06-23 02:25:02

标签: delphi components delphi-7

任何人都知道如何在TppViewer中拖动报告? (Delphi 7)我尝试使用ppviewer的dagdrop事件和dragover事件但是失败了,任何人都可以帮忙吗?

procedure Tfrm1.ppviewer1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  inherited;
  Accept := Source IS TppViewer;
end;

procedure Tfrm1.ppviewer1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
  inherited;
  if Source is TppViewer then begin
    TppViewer(Source).Left := X;
    TppViewer(Source).Top := Y;
  end;
end;

2 个答案:

答案 0 :(得分:0)

您是否尝试将报告文件拖入查看器?如果对以下建议如此偏见:

您可以使用以下代码实现此目的:

procedure TMainForm.FormCreate(Sender: TObject);
begin
   //Tell Windows that the Report Viewer accepts files
   ShellAPI.DragAcceptFiles(ppViewer1.Handle,True);
   Application.OnMessage   := ApplicationMessage;
end;    

procedure TMainForm.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin    
    if (Msg.hwnd = ppViewer1.Handle) and (Msg.message = WM_DROPFILES) then
    begin
        Handled := ReportFileDrop(Msg);
    end;
end;

function TMainForm.ReportFileDrop(var Msg: TMsg):Boolean ;
 var
    numFiles : longInt;
    buffer : array[0..MAX_PATH] of char;
    l_file:String;
    l_filemsg:TWMDROPFILES;
 begin
    Result := False;

    //Convert the TMsg into a TWMDROPFILES record 
    l_filemsg.Msg    := Msg.message;
    l_filemsg.Drop   := Msg.wParam;
    l_filemsg.Unused := Msg.lParam;
    l_filemsg.Result := 0;

    numFiles := DragQueryFile(l_filemsg.Drop, $FFFFFFFF, nil, 0) ;
    if numFiles > 1 then
    begin
      ShowMessage('You can drop only one file at a time!') ;
    end
    else
    begin
      try
          DragQueryFile(l_filemsg.Drop, 0, @buffer, sizeof(buffer)) ;
          l_file := buffer;

          //Only try and load the report if the file has the correct extension
          if (Length(l_file) > 0) and (ExtractFileExt(LowerCase(l_file)) = '.rtm') then
          begin
             //Load the Report
             Result := True;
          end;
      except
          //Handle errors
      end;
    end;
 end;

答案 1 :(得分:0)

此答案假设您尝试通过拖动滚动报告。

TReportPreviewerForm

ReportViewerppViewer

DraggingBoolean

SaveX, SaveYInteger

procedure TReportPreviewer.ReportViewerMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Dragging := true;
  SaveX := X;
  SaveY := Y;
end;

procedure TReportPreviewer.ReportViewerMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if Dragging then
  begin
    if ReportViewer.ScrollBox.Visible then
      ReportViewer.ScrollBox.HorzScrollBar.Position := ReportViewer.ScrollBox.HorzScrollBar.Position - (X - SaveX);
    if ReportViewer.ScrollBox.Visible then
      ReportViewer.ScrollBox.VertScrollBar.Position := ReportViewer.ScrollBox.VertScrollBar.Position - (Y - SaveY);
    SaveX := X;
    SaveY := Y;
  end;
end;

procedure TReportPreviewer.ReportViewerMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Dragging := false;
end;

我尝试使用ScrollBy而不是移动滚动条位置,但似乎因某种原因而重置。