Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];

Вниз

Архитектура в CAD-системе. Изображения.   Найти похожие ветки 

 
Псарь   (2011-08-04 04:16) [0]

Делаю скромный редактор по перетаскиванию и прочему манип. с объектами-картинками.
Основной класс объекта манипуляций:


type
 TDisplayObj = class
   constructor Create(X, Y: LongInt);
 private
   FX, FY  : LongInt;
   FW, FH  : LongWord;
   FIsHit  : boolean;
   FAlpha  : byte;
   FIsBlend: boolean;

   FPtDrag : TPoint;
   FIsDrag : boolean;
 protected
   procedure SetEffect(Bmp: TBitmap);
   procedure Draw(AContext: TContext; Bmp: TBitmap);
   procedure OnMouseDown(X, Y: LongInt);
   procedure OnMouseMove(X, Y: LongInt);
   procedure OnMouseUp  (X, Y: LongInt);
 public
   function  GetBounce: TRect;
   procedure Aligned(Align: LongWord);
   function  HitTest(X, Y: LongInt): boolean; overload;
   function  HitTest(const R: TRect): boolean; overload;
   property  PosX:    LongInt read FX       write FX;
   property  PosY:    LongInt read FY       write FY;
   property  Alpha:   byte    read FAlpha   write FAlpha;
   property  IsBlend: boolean read FIsBlend write FIsBlend;
 end;


Очевидно, что хранить в каждой таком объекте (коих десятки и сотни) TBitmap - не выгодно по памяти.
Следовательно он должен подаваться снаружи.
Сделал ассоциативный массив, кидается TBitmap и назначается имя.
Зная имя, получаем изображение и рисуем.

Но тут гложат меня сомнения, как правильно сделать:
1) Хранить в каждом TDisplayObj строку - ключ к TBitmap?
   или вынести ее в метод Draw?
2) Как задавать высоту и ширину объекта? Т.е.
   ГДЕ задавать? В конструкторе по ключу имени? Или
   в том же Draw? Но ведь метод GetBounce может понадобиться и без Драв.
3) Все время получать и искать в массиве по ключи при рисовании - медленно может выйти. Лучше хранить уже готовые НАЙДЕННЫЕ ТБитмапы.
Но как правильно все организовать?

зы. Троллей прошу идти в баню.


 
Псарь   (2011-08-04 04:16) [1]

TContext - расширенный TCanvas, если чо


 
Sapersky   (2011-08-04 06:58) [2]

В TBitmap используется механизм разделения картинок. При копировании через TBitmap.Assign в новом объекте создаётся ссылка на картинку, сама картинка не копируется. При этом ведётся подсчёт ссылок и всё корректно уничтожается по мере надобности.
Можно и просто копировать переменную TBitmap присвоением, при этом она работает как обычный указатель - занимает 4 байта и указывает на "чужие" данные. Но проблемы с уничтожением (уничтожили объект в одном месте, все прочие указатели "испортились") придётся решать вручную.


 
Псарь   (2011-08-04 07:57) [3]


>  Sapersky   (04.08.11 06:58) [2]


Вы уверены?
Почему тогда при уничтожении Bmp1, Bmp2 все равно рисуется?
Или я что не понимаю.



var
 Bmp1, Bmp2: TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Bmp1:= TBitmap.Create;
 Bmp2:= TBitmap.Create;

 Bmp1.LoadFromFile("C:\image\LazerTank.bmp");
 Bmp2.Assign(Bmp1);
end;

procedure TForm1.Timer1Timer(Sender: TObject); // Интервал 1.
begin
 If Bmp2.Empty then Caption:= "NULL"
 else begin
   Caption:= "True";
   Canvas.Draw(10, 10, Bmp2);
 end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 FreeAndNil(Bmp1);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Bmp1.Free;
 Bmp2.Free;
end;


 
Ega23 ©   (2011-08-04 10:23) [4]


>  TDisplayObj = class
>    constructor Create(X, Y: LongInt);


Зачем конструктор publised?


 
brother ©   (2011-08-04 10:36) [5]

> If Bmp2.Empty then Caption:= "NULL"

а так:
If Bmp2 = nil then Caption:= "NULL"
?


 
DiamondShark ©   (2011-08-04 11:18) [6]


> Псарь   (04.08.11 07:57) [3]
> Почему тогда при уничтожении Bmp1, Bmp2 все равно рисуется?

Потому что
>  При этом ведётся подсчёт ссылок и всё корректно уничтожается
> по мере надобности.


 
Псарь   (2011-08-05 12:37) [7]


> Ega23 ©   (04.08.11 10:23) [4]


> Зачем конструктор publised?


Он будет вроде как в публик?


> brother ©   (04.08.11 10:36) [5]
>
> > If Bmp2.Empty then Caption:= "NULL"
>
> а так:
> If Bmp2 = nil then Caption:= "NULL"
> ?


При чем тут это?
Мы же не уничтожаем Bmp2. Он всегда будет валидным.
А вот изображение в нем под вопросом.


> DiamondShark ©   (04.08.11 11:18) [6]


Значит, когда уничтожили Bmp1, то изображение в нем перенеслось
в Bmp2?
Если так, то сделаю каждому TDisplayObject"у по TBitmap.


 
Jeer ©   (2011-08-05 15:19) [8]


> Значит, когда уничтожили Bmp1, то изображение в нем перенеслось
> в Bmp2?


Если сделано по толковому, то никто не гоняет биты и байты туда-сюда.
Валидный указатель остается во втором живом объекте и этого (+ контроль ссылок) достаточно от мемликов.


 
Sapersky   (2011-08-06 19:08) [9]

Значит, когда уничтожили Bmp1, то изображение в нем перенеслось
в Bmp2?


Изображения вообще не хранятся в TBitmap, они хранятся во внутреннем контейнере TBitmapImage.
При выполнении Assign двум или более TBitmap"ам назначается один TBitmapImage, при этом TBitmapImage хранит кол-во владельцев (счётчик ссылок). При уничтожении TBitmap счётчик ссылок уменьшается, и TBitmapImage уничтожается только тогда, когда он равен 0, т.е. больше нет владельцев.
И кстати, исходники всего этого открыты (хотя для новичка, возможно, выглядят пугающе).


 
Псарь   (2011-08-07 09:13) [10]


>  Sapersky   (06.08.11 19:08) [9]


Большущее Вам спасибо. =)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
15-1312316995
Юрий
2011-08-03 00:29
2011.11.27
С днем рождения ! 3 августа 2011 среда


1-1274184511
Леонид Федьков
2010-05-18 16:08
2011.11.27
Работа с собственными службами


2-1312652888
Gu
2011-08-06 21:48
2011.11.27
Динамический массив


15-1311974952
Германн
2011-07-30 01:29
2011.11.27
TRegisry.


15-1312461790
Сергей М.
2011-08-04 16:43
2011.11.27
Теперь понятно почему Скайп иной раз изрядно поглючивает)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский