Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 549

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Мой вопрос касается компонента TPanel и его свойства Canvas.
Когда я пытаюсь скопировать изображение из TImage так

MyRect:=Rect(0,0,100,80);
ImgRect:=Rect(80,100,180,180);
Panel1.Brush.Bitmap.Canvas.CopyRect(MyRect,Image1.Picture.Bitmap.Canvas,ImgRect);

компилятор почему то ругается, когда создаю новый тип, где прописываю свойство canvas как public компилятор не ругается, но программа работает не корректно, т.к. если добавить кнопку и всавить в обработчик события кнопки OnClick код из Form1Create() то картинка копируется.
(привожу код в приложении)

Возможно кто нибудь знает путь решения этой проблемы.

Приложение:
  1. {{code}}
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8. Dialogs, ExtCtrls, jpeg, StdCtrls;
  9.  
  10. type
  11. TForm1 = class(TForm)
  12. Image1: TImage;
  13. procedure FormCreate(Sender: TObject);
  14. private
  15. { Private declarations }
  16. public
  17. { Public declarations }
  18. end;
  19.  
  20. type TMyPanel = class(TPanel)
  21. protected
  22. property Canvas;
  23. End;
  24.  
  25.  
  26. var
  27. Form1: TForm1;
  28. Panel: TMyPanel;
  29.  
  30. implementation
  31.  
  32. {$R *.dfm}
  33.  
  34. procedure TForm1.FormCreate(Sender: TObject); // Ñîçäàåì ôîðìó
  35. var
  36. MyRect,ImgRect: TRect;
  37. begin
  38. MyRect:=Rect(0,0,100,80);
  39. ImgRect:=Rect(80,100,180,180);
  40. Panel:=TMyPanel.Create(Self);
  41. Panel.Width:=185;
  42. Panel.Height:=137;
  43. Panel.Parent:=Self;
  44. Panel.SetBounds(0,0,Panel.Width,Panel.Height);
  45.  
  46. Panel.Canvas.CopyRect(Panel.ClientRect,Image1.Picture.Bitmap.Canvas,Panel.BoundsRect);
  47.  
  48. end;
  49.  
  50. end.
  51.  
  52. {{/code}}


SOA Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 31 августа 2010, 15:10
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 31 августа 2010, 21:21; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 31 августа 2010, 15:36 [#1]:

Понятно, что и в FormCreate картинка копируется, но при перерисовке (при показе формы) затирается. Если поставить кнопку, картинка копируется, но если теперь форму затащить за пределый экрана, а потом снова вытащить на центр, она опять сотрётся. Такой же эффект будет при перекрывании панели любыми чужими окнами.
Кроме выноса свойства Canvas в видимую область, нужно ещё перекрывать метод TPanel.Paint(), где снова отрисовывать всю графику.

Вопрос: нафига козе баян? Может всё сделать попроще? Зачем всё это?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 31 августа 2010, 17:03 [#2]:

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, StdCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
type TMyPanel = class(TPanel)
private
FSrcCanvas: TCanvas;
protected
property Canvas;
procedure Paint();Override;
property SrcCanvas:TCanvas read FSrcCanvas write FSrcCanvas;
End;
 
var
  Form1: TForm1;
  Panel: TMyPanel;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var
i1,i2: Integer;
c: TColor;
r,g,b:byte;
rgn: HRgn;
begin
Panel:=TMyPanel.Create(Self);
Panel.FSrcCanvas:=Image1.Picture.Bitmap.Canvas;
Panel.Width:=185;
Panel.Height:=137;
Panel.Parent:=Self;
Panel.SetBounds(0,0,Panel.Width,Panel.Height);
 
Panel.Canvas.CopyRect(Panel.ClientRect,Image1.Picture.Bitmap.Canvas,Panel.BoundsRect);
 
end;
 
Procedure TMyPanel.Paint();
Begin
Canvas.CopyRect(Panel.ClientRect,SrcCanvas,Panel.BoundsRect);
End;

Действительно так работает.
Спасибо.
min@y™

min@y™ (статус: Доктор наук), 31 августа 2010, 17:12 [#3]:

Цитата (SOA):

Действительно так работает. Спасибо.

Почему не ответил на мои вопросы?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 31 августа 2010, 17:46 [#4]:

Потому что TPanel должно использоваться и проще, например с помощью TImage сделать не получится.(По условиям проекта)
>Зачем все это?
программу пишу :)))
min@y™

min@y™ (статус: Доктор наук), 31 августа 2010, 21:21 [#5]:

Ога, всё очень понятно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.03 сек.