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

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

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

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

Сообщение IonIvan » 13.04.2011 20:34:54

Суть такова:
делаю(можно сказать уже сделал) программу, которая строит некие графики,
причём надо так, чтобы было видно, как строится рисунок и скорость этого построения
управляется при помощи ползунка (в рисующем цикле стоит sleep(n), где n = 10 - показания ползунка).
Сначала сделал на Tpaintbox.canvas -- быстро, но не сохраняет содержимое при свертывании/изменении размера формы.
Сейчас всё рисует на TImage.picture.bitmap.canvas -- существенно медленнее, но нет проблем описаных выше.
Будет ли рисовать быстрее на TBitmap, или не стоит переделывать? Если есть другие более быстрые поверхности для отрисовки, скажите.
IonIvan
незнакомец
 
Сообщения: 8
Зарегистрирован: 15.03.2011 19:00:00

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

Сообщение EmeraldMan » 13.04.2011 22:16:15

На мой взгляд, лучше оставить PaintBox.
Сохранять значения пикселей в буфере при первой отрисовке и при необходимости перерисовывать содержимое из этого буфера.
PaintBox, пожалуй, самая быстрая.
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

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

Сообщение IonIvan » 15.04.2011 21:00:26

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


Ммм. Пытался. Попиксельно чтоли в буффер запиливать?
IonIvan
незнакомец
 
Сообщения: 8
Зарегистрирован: 15.03.2011 19:00:00

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

Сообщение Mr.Smart » 15.04.2011 21:07:38

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

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

Сообщение stikriz » 16.04.2011 08:57:07

А Вы при перерисовке в связи с изменившимися размерами не выполняйте слип, выполняйте только при изменении значений ползунка или когда первый раз рисуете. И будет быстро, и нет проблем.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

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

Сообщение IonIvan » 17.04.2011 15:16:05

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

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

Сообщение Maxizar » 17.04.2011 15:50:55

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


Форму нельзя свернуть ее можно либо скрыть Hide или вообще закрыть Close, либо показать show. А вот приложение можно свернуть на панель (меню пуска).
Код: Выделить всё
Application.Restore;    //Востановить свернутое приложение
Application.Minimize;  //Минимизировать (свернуть)
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение IonIvan » 17.04.2011 16:58:15

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

А как повесить какое либо действие на это?
IonIvan
незнакомец
 
Сообщения: 8
Зарегистрирован: 15.03.2011 19:00:00

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

Сообщение Maxizar » 17.04.2011 17:32:35

Форма, при нажатии кнопки, назначаем события... события - это процедуры типа 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.



Более подробно можно прочитать в любом ХОРОШЕМ учебнике по Делфи.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

Рейтинг@Mail.ru