为什么在Delphi中位图的传输是逆序的?

为什么在Delphi中位图的传输是逆序的?,delphi,Delphi,单击按钮时,图像应从richedit1传输到richedit2,并按顺序显示,它们以相反的方式显示。如何修复它?下面是代码 procedure TForm1.Button1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); InsertBitmapToRE(RichEd

单击按钮时,图像应从richedit1传输到richedit2,并按顺序显示,它们以相反的方式显示。如何修复它?下面是代码

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    InsertBitmapToRE(RichEdit1.Handle, Image1.Picture.Bitmap.Handle);
  end;
end;

Function MAP_LOGHIM_TO_PIX(Const Val: Integer; Const Log: Integer): Integer;
Const
  HIMETRIC_PER_INCH=2540;
Begin
  Result:=MulDiv(Val, Log, HIMETRIC_PER_INCH);
End;

Function MAP_LOGHIMPT_TO_PT(Const Val: TPoint; Const Handle: HWND = 0): TPoint;
Var
  DC: HDC;
Begin
  DC:=GetDC(Handle);
  Result.X:=MAP_LOGHIM_TO_PIX(Val.X, GetDeviceCaps(DC, LOGPIXELSX));
  Result.Y:=MAP_LOGHIM_TO_PIX(Val.Y, GetDeviceCaps(DC, LOGPIXELSY));
  ReleaseDC(Handle, DC);
End;

procedure TForm1.Button2Click(Sender: TObject);
Var
  IREO: IRichEditOle;
  OleClientSite: IOleClientSite;
  ReObject: TReObject;
  I: Integer;
  ViewObject2: IViewObject2;
  Rc: TRect;
  Path:String;
  bmp:TBitmap;
  Pt: TPoint;
begin
  Path:='C:\temp\richedit\';
  SendMessage(RichEdit1.Handle, EM_GETOLEINTERFACE, 0, Longint(@IREO));
  IREO.GetClientSite(OleClientSite);
  For I:=IREO.GetObjectCount-1 Downto 0 Do
  Begin
    ZeroMemory(@ReObject, SizeOf(ReObject));
    ReObject.cbStruct:=SizeOf(ReObject);
    If Succeeded(IREO.GetObject(I, ReObject, $00000001)) Then
    If Succeeded(ReObject.poleobj.QueryInterface(IViewObject2, ViewObject2)) Then
    Begin
      ViewObject2.GetExtent(DVASPECT_CONTENT, -1, Nil, Pt);
      Pt:=MAP_LOGHIMPT_TO_PT(Pt, RichEdit1.Handle);
      bmp:=TBitmap.Create;
      Bmp.Height := Pt.Y;
      Bmp.Width := Pt.X;
      SetRect(Rc, 0, 0, Bmp.Width, Bmp.Height);
      OleDraw(ReObject.poleobj, DVASPECT_CONTENT, bmp.Canvas.Handle, Rc);
      bmp.SaveToFile(Path+'Img'+IntToStr(I+1)+'.bmp');
      InsertBitmapToRE(RichEdit2.Handle, bmp.Handle);
    End
    Else
      ShowMessage('Error: Can''t get IViewObject2');
  End;
end;
截图


在for循环中使用
向下到0
是有效的,但反向计数并不总是可取的。这种情况是因为您使用循环变量作为索引,并且需要特定的处理顺序


对于I:=0到IREO.GetObjectCount-1 Do
对于I:=IREO.GetObjectCount-1到0 Do
并在
GetObject()
中使用
I
将按保留顺序检索对象。@Brian感谢您的输入!请以“答案”的形式回答,因为这似乎可以解决问题。@Tigerjz32,我知道这是一个离题,但如果您能够更改问题的标题,请尽量改进相关代码的格式。从该字符串开始:bmp.SaveToFile(.我可以自己做,但SO的系统告诉我有很多代码,所以我无法编辑。谢谢。@Lex34,不幸的是,我对Delphi不太熟悉,无法编辑代码语法。我希望其他社区成员能够帮助我,如果他们更了解的话。我更改了标题,因为我理解这个问题,并想e它可供未来用户访问。另一方面,你应该在SO中使用内置的图像上载。读者不喜欢人们使用第三方网站进行类似的事情,尤其是使用你提供的URL。据我们所知,点击它可能会感染病毒。它可以工作,如果我需要与pi一起显示文本当我点击按钮时,ctures?屏幕截图显示图像已传输,但文本不在那里。我如何用图片传输文本?@Lex34:这是另一个问题,所以你应该作为新问题来问。@RudyVelthuis:我需要问一个新问题才能得到答案?他的问题与效率有什么关系?@Lex34:如果你想知道如何将文字与图片一起显示,你应该问一个新问题。实际上,当前的问题是关于图像的反转。