Как перетащить отчет в ppviewer? - PullRequest
0 голосов
/ 23 июня 2011

Кто-нибудь знает, как перетащить отчет в TppViewer? (Delphi 7) Я пытаюсь использовать событие dagdrop и dragover ppviewer, но не получилось, кто-нибудь может помочь?

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 голосов
/ 23 июня 2011

В этом ответе предполагается, что вы пытаетесь прокрутить отчет перетаскиванием.

TReportPreviewer - это Form

ReportViewer - это ppViewer

Dragging - это Boolean

SaveX, SaveY Integer

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 вместо перемещения положения полосы прокрутки, но, похоже,сбросить по какой-то причине.

0 голосов
/ 23 июня 2011

Вы пытаетесь перетащить файл отчета в программу просмотра?если так пристрастно по следующему совету:

Это можно сделать с помощью следующего кода:

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;
...