Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > TPaintBox в TImage


Автор: okamor71 14.11.2006, 18:15
Помогите, а то горю надо содержимое с TPaintBox скопировать в TImage

Автор: Alexeis 14.11.2006, 18:42
image1.Canvas.CopyRect(PaintBox1.ClientRect, PaintBox1.Canvas, PaintBox1.ClientRect);

Автор: okamor71 14.11.2006, 18:49
Ругается:
  Can only modify an image if it contains a bitmap.

Добавлено @ 18:55 
правда потом я этот TImage передаю в функцию

Код

function Square(Image: TImage):integer;
var
  x, y, i: integer;
begin
  i:=0;
  with Image.Canvas do begin
     y:=0;
     repeat
       x:=0;
       repeat
         if Image.Canvas.Pixels[x,y]=clBlack then
           inc(i);
         inc(x);
       until x>Image.Width;
       inc(y);
     until y>Image.Height;
  end;
  result:=i;
end;

Автор: Alexeis 14.11.2006, 19:03
Цитата(okamor71 @  14.11.2006,  18:49 Найти цитируемый пост)
Ругается:
  Can only modify an image if it contains a bitmap.

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

okamor71, попробуй на чистом проекте, я думаю проблема на другом участке кода.

Автор: okamor71 14.11.2006, 19:09
alexeis1, функция у меня в dll-ке, конекчусь к ней 

Код

function Square(Image: TImage): integer; external 'Diplom_lib.dll';


после чего вызываю

Код


tst: integer;

.....

  tst:=Square(Image2);


Автор: Alexeis 14.11.2006, 20:34
Цитата(okamor71 @  14.11.2006,  19:09 Найти цитируемый пост)
функция у меня в dll-ке, конекчусь к ней 

А ну тогда ясно. С дллкой уже были подобные проблемы. Возможно теряется графический дескриптор. Советую после передачи имаги вызвать. 
Image1.Invalidate();
а затем 
application.processmessages();

Первая функция укажет, что текущее изображение не действительно и требует перерисовки, а вторая заставит принудительно обработать все сообщения, в том числе и сообщение о перерисовке, и соответственно должен будет получен новый графический дескриптор.

Автор: okamor71 14.11.2006, 20:35
alexeis1, весь прикол состоит в том что если использовать ее через библиотеку то кроем матом, а если в модуле то все нормально, и где копать немогу понять, в библиотеке только одна эта функция

Добавлено @ 20:46 
alexeis1, не рабатает  smile 

Автор: Alexeis 14.11.2006, 23:16
Из-за каких-то проблем с RTI, неправильно функционируют объекты VCL, но есть возможность передавать хендл виндового объекта например так.
Вот так выглядит проект
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function dosmf(bmp : hBitmap) : Integer; external 'dllka.dll';

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.Bitmap.Width := 200;
  Image1.Picture.Bitmap.Height := 200;
  Image1.Picture.Bitmap.Canvas.Brush.Color := clGreen;
  Image1.Picture.Bitmap.Canvas.FillRect(Rect(0, 0, 100, 100));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(dosmf(Image1.Picture.Bitmap.Handle))) ;
end;

end.


Видно что параметр bmp : hBitmap

А вот так выглядит дллка

Код

library dllka;

uses
  FastShareMem, Windows, Classes, Graphics, ExtCtrls, Forms;

function dosmf(bmp : hBitmap) : Integer;
var
  tmp : TBitmap;
begin
  tmp        := TBitmap.Create;
  tmp.Handle := bmp;
  Result     := tmp.Canvas.Pixels[10, 10];
end;

exports dosmf;

begin

end.


Т.е. делфячий объект пересоздаем, но виндовый только устанавливаем.
tmp.Handle := bmp;

Автор: Alexeis 15.11.2006, 11:29
После внимательного изучения вопроса, а пришел к выводу, о том, что данная проблема относится скорее к области системного программирования, а потому, для решения данного вопроса создана тема в разделе Delphi: WinAPI и системное программирование http://forum.vingrad.ru/index.php?act=ST&f=85&t=121685&unread=1

Автор: Snowy 15.11.2006, 12:48
Нужно в dll передавать не TImage, а HDC.
И уже на него делать BitBlt.

Добавлено @ 12:49 
HDC брать в Image1.Picture.Bitmap.Canvas.Handle

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)