TImage, TBitmap, Tpaintbox : что лучше?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
IonIvan
незнакомец
Сообщения: 8
Зарегистрирован: 15.03.2011 18:00:00

TImage, TBitmap, Tpaintbox : что лучше?

Сообщение IonIvan »

Суть такова:
делаю(можно сказать уже сделал) программу, которая строит некие графики,
причём надо так, чтобы было видно, как строится рисунок и скорость этого построения
управляется при помощи ползунка (в рисующем цикле стоит sleep(n), где n = 10 - показания ползунка).
Сначала сделал на Tpaintbox.canvas -- быстро, но не сохраняет содержимое при свертывании/изменении размера формы.
Сейчас всё рисует на TImage.picture.bitmap.canvas -- существенно медленнее, но нет проблем описаных выше.
Будет ли рисовать быстрее на TBitmap, или не стоит переделывать? Если есть другие более быстрые поверхности для отрисовки, скажите.
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Re: TImage, TBitmap, Tpaintbox : что лучше?

Сообщение EmeraldMan »

На мой взгляд, лучше оставить PaintBox.
Сохранять значения пикселей в буфере при первой отрисовке и при необходимости перерисовывать содержимое из этого буфера.
PaintBox, пожалуй, самая быстрая.
IonIvan
незнакомец
Сообщения: 8
Зарегистрирован: 15.03.2011 18:00:00

Re: TImage, TBitmap, Tpaintbox : что лучше?

Сообщение IonIvan »

EmeraldMan писал(а):Сохранять значения пикселей в буфере при первой отрисовке и при необходимости перерисовывать содержимое из этого буфера.


Ммм. Пытался. Попиксельно чтоли в буффер запиливать?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Re: TImage, TBitmap, Tpaintbox : что лучше?

Сообщение Mr.Smart »

Пишите в Bitmap, а потом выводите на канву при OnPaint.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Re: TImage, TBitmap, Tpaintbox : что лучше?

Сообщение stikriz »

А Вы при перерисовке в связи с изменившимися размерами не выполняйте слип, выполняйте только при изменении значений ползунка или когда первый раз рисуете. И будет быстро, и нет проблем.
IonIvan
незнакомец
Сообщения: 8
Зарегистрирован: 15.03.2011 18:00:00

Re: TImage, TBitmap, Tpaintbox : что лучше?

Сообщение IonIvan »

Рисунок пропадает не только при изменении размера, но и при приостановлении отрисовки.
Т.е. на форме есть кнопка 'ПАУЗЭ'. При ее нажатии рисующий цикл останавливается и загорается кнопка 'РЕСЮМ' и 'СТОП'.
'СТОП' означает, что при следующем нажатии 'ДРО' график будет отрисован с самого начала.
'РЕСЮМ' - продолжение отрисовки с того места, где остановились.
Так вот: я нажимаю 'РЕСЮМ' и все проходит как надо, за исключением того, что предыдущая часть графика пропадает.
Понятно, что ее можно нарисовать снова без слипа, но может быть есть более 'прямой' метод?
--------------------------------------
Ещё.
Как называется event формы типа 'unminimize' (разветнуть).
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: TImage, TBitmap, Tpaintbox : что лучше?

Сообщение Maxizar »

IonIvan писал(а):Ещё.
Как называется event формы типа 'unminimize' (разветнуть).


Форму нельзя свернуть ее можно либо скрыть Hide или вообще закрыть Close, либо показать show. А вот приложение можно свернуть на панель (меню пуска).

Код: Выделить всё

Application.Restore;    //Востановить свернутое приложение
Application.Minimize;  //Минимизировать (свернуть)
IonIvan
незнакомец
Сообщения: 8
Зарегистрирован: 15.03.2011 18:00:00

Re: TImage, TBitmap, Tpaintbox : что лучше?

Сообщение IonIvan »

Maxizar писал(а):Application.Restore; //Востановить свернутое приложение
Application.Minimize; //Минимизировать (свернуть)

А как повесить какое либо действие на это?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: TImage, TBitmap, Tpaintbox : что лучше?

Сообщение Maxizar »

Форма, при нажатии кнопки, назначаем события... события - это процедуры типа TNotifyEvent, Где

Код: Выделить всё

  TNotifyEvent = procedure(Sender: TObject) of object;

Это значит, чтобы Application.OnRestore присвоить значение нужно иметь переменую типа TNotifyEvent. Значит мы должны создать процедуры я сделал так:

Код: Выделить всё

     procedure OnRest(Sender: TObject);
     procedure OnMin(Sender: TObject);

Тут уже в конце процедуры писать of object; не нужно.

После их нужно описать, и присвоить определенному полю. Присваивать нужно адреса процедур вот так:

Код: Выделить всё

   //Назначаем действия
   Application.OnRestore:=@OnRest;
   Application.OnMinimize:=@OnMin;

Код всей формы:

Код: Выделить всё

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
     procedure OnRest(Sender: TObject);
     procedure OnMin(Sender: TObject);
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
   //Назначаем действия
   Application.OnRestore:=@OnRest;
   Application.OnMinimize:=@OnMin;
end;

procedure TForm1.OnRest(Sender: TObject);
begin
  Caption:='';
end;

procedure TForm1.OnMin(Sender: TObject);
begin
  Button1.Caption:='';
end;

end.



Более подробно можно прочитать в любом ХОРОШЕМ учебнике по Делфи.
Ответить