Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

И опять создание 10000 картинок в run-time...это убийство   Найти похожие ветки 

 
Злая Маринка   (2003-05-17 19:46) [0]

Совсем не давно я создала тут пост про создание
картинок в run-time...
Задача в следующем:

1. 1ая форма основная, там располагается TscroollBox, куча кнопок
2. по нажатию кнопки выскакивает 2ая форма с настройками, где необходимо выбрать размер HDD и размер одного блока (кластера, т.е. в будущем одной картинки). По нажатии на кнопку «принять» форма закрывается и в Tscroolbox создается число картинок…число такое «(размер HDD (Мб)* 1024 (переводим в КБ)) / размер блока = число картинок… максимальный объем HDD = 1024(МБ), максимальный размер блоков = 128 (Кб)….т.е. (1024*1024)/128=8192…т.е. опять же МИНИМУМ 8192 картинок…Создавать для каждой картинке свой IMAGE в run-time это ясно и понятно убийство…
3. в посте были такие советы:

*****************************************
Palladin © (13.05.03 20:21)
я бы рекомендовал создавать объекты не все, а только те которые видимые, не использовать для этого scollbox а использовать TPanel и TScrollBar, на событии OnScroll которого написать смену файлов с изображениями у объектов, для чего создать массив 1..10000 с именами этих файлов. куда проще и меньше ресурсов будет кушает и работать буде на ура...

****************************************
Да, создавать видимые картинке будет проще…но если известно что картинок 10000 штук, как сделать такой большой TscroolBar заранее?
Да и дело может даже не в этом а в том что если картинки создавать по 100 штук с паузами, то это дело не улучшит ОЗУ дохнет…

***************

Следующий совет:

***************

Arch-vile © (13.05.03 23:05)
2Palladin
может ей разъяснить поподробнее надо было?
2Злая Маринка
Итак, разъяснение (как понял я):
1. это не огромедный массив объектов, а одна картина.
2. мы знаем параметры картинки, знаем сколько картинок в ряду, поэтому можем посчитать координаты нужной картинки в ряду огромной картины.
3. вот так и обращаемся с ней, с большой картиной и координатами маленьких картинок в ней.

Комп умирает по причине нехватки памяти. Если винда из NT"шной линии, смотреть Task Manager"ом. Если из 9х - Starter"ами всякими. Просто представь, сколько нужно памяти для такого кол-ва картинок.
Но для одной огромной тоже может понадобиться нехило ОЗУшки, поэтому логично будет сделать по совету Palladin"a "я бы рекомендовал создавать объекты не все, а только те которые видимые". В данном случае - картина на область видимости. а масенькие картинки по ней перемещать. ИМХО, может получиться быстрее, чем с созданием-убиванием. Но я в этом не уверен

**************************

Например картинок 10000 штук и что мы грузим за место 10000 всего одну где 10000,
а если нужно не 10000, а 356 штук?
И как обращаться через координаты? Совет я думаю хороший, только нужен простой пример!!! Прошу!!!
Не могу понять….если можно то все с примерами!!!
**************************

Следующий совет:

**************************

Palladin © (13.05.03 23:22)
проблема в том что автор поста хочет организовать что то на подобие Norton SpeedDisk

там карта диска рисуется на DC, сами данные по диску естественно совсем в другой структуре хранятся

координаты TRect 556 региона вычисляются при помощи div и mod
и после прекрасно на них или BitBlt из легенды, или вообще в ручную TextOut...
легенда - библиотека рисунков

**************************

Тоже классно, но как??? Я ничего не поняла!!!
Если можно то с примерами…..


 
Злая Маринка   (2003-05-17 19:47) [1]

И вот на последок то что было…создавался огромный массив картинок ….



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, Menus, StdCtrls, CheckLst, ImgList, Spin,
OleCtrls, Chartfx3, VCFI;

type
TForm1 = class(TForm)
StatusBar1: TStatusBar;
MainMenu1: TMainMenu;
N1: TMenuItem;
Button2: TButton;
SpinEdit1: TSpinEdit;
GroupBox1: TGroupBox;
ScrollBox1: TScrollBox;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
GroupBox2: TGroupBox;
ListBox1: TListBox;
GroupBox3: TGroupBox;
Button3: TButton;
Button4: TButton;
GroupBox4: TGroupBox;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
qa,ass,w,vin,bin: integer;
btn : array[1..500000] of Timage;

implementation

uses unit2,unit3;
{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);

begin
btn[5].Picture.LoadFromFile("c:\2.bmp");
btn[55].Picture.LoadFromFile("c:\2.bmp");
btn[6].Picture.LoadFromFile("c:\2.bmp");
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
w:=0;
ass:=0;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
with Tform2.Create(Self) do
try
showmodal;
finally
Free;
end;

end;

procedure TForm1.Button9Click(Sender: TObject);
begin
with Tform3.Create(Self) do
try
showmodal;
finally
Free;
end;

end;

end.


+++++++++++++++



unit Unit2;

interface

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

type
TForm2 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Bevel1: TBevel;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
if (edit1.text<>"") and (edit2.text<>"0") then
begin
form1.ListBox1.Items.Add(edit1.text);
close;
end
else showmessage("Ia oeacaii eiy eee ?acia? oaeea!");

end;

end.



++++++++++++++++=


unit Unit3;

interface

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

type
TForm3 = class(TForm)
Label1: TLabel;
Label2: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Bevel1: TBevel;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;

qa,ass,w,vin,bin: integer;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm3.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
num : extended;
sss: string;
ddd: integer;
begin
num:=spinedit1.Value*1024/spinedit2.Value;
sss:=floatTostr(num);
ddd:=strToint(sss);
for qa:=0 to ddd do begin
btn[1+w]:=Timage.Create(form1);
btn[1+w].Picture.LoadFromFile("c:\1.bmp");
btn[1+w].Height:=10;
btn[1+w].Width:=10;
btn[1+w].Parent := form1.scrollbox1;
btn[1+w].left:=vin;
if btn[1+w].left>230 then
begin
ass:=ass+1;
btn[1+w].left:=0;
end;

btn[1+w].top:=ass*10;

vin:=btn[1+w].left+10;
w:=w+1;
end;
if spinedit1.value>1024 then
begin
spinedit1.value:=1024;
showmessage("?acia? aenea ia aie?ai i?eauoaou 1024(mb)");
end;

if spinedit2.value>128 then
begin
spinedit2.value:=128;
showmessage("?acia? aeiea ia aie?ai i?eauoaou 128(kb)");
end;

end;
end.


Прошу помочь!!!!
Пожалуйста! Если я не сдам к понедельнику меня отчислят!!!!!


 
Palladin ©   (2003-05-17 20:37) [2]

а может и правильно сделают? :)

разьясняю последний совет поподробней:
1 создаешь список объектов TImage - который перечисляет все уникальные картинки - это будет библиотека....
2 создаешь один большой TImage - на котором у тебя будет все отображатся
3 читаешь данные которые нужно отобразить и в зависимости от них рисуешь на большой картине нужные маленькие из библиотеки...

как определить координаты например 543ей ячейки:

Y:=(543 div ColsInRow)*YSize
X:=(543 mod ColsInRow)*XSize


ColsInRow - сколько блоков умещается в ширину
YSize,XSize - размеры картинок

библиотека рисунков организуется, например, при помощи TList


var
ImgLibrary:TList;

for i:=1 to 10 do
begin
ImgLibrary.Add(TBitmap.Create);
TBitmap(ImgLibrary[ImgLibrary.Count-1]).LoadFromFile(inttostr(i)+".bmp");
end;


установка размеров основого TImage (сам TImage можно поместить в scrollbox и мышкой)


Image1.Width:=TBitmap(ImgLibrary.Objects[0]).Width*300;
Image1.Height:=TBitmap(ImgLibrary.Objects[0]).Height*300;

предполагается, что все Bitmap у тебя одинакого размера, в результате получится изображение 300x300 кусков

ну и наконецто вывод самих bitmap на image1


procedure SetBitmap(p_Image:TImage;p_nIdx,p_nBitmapID:integer);
var
X,Y:integer;
begin
Y:=(p_nIdx div 300)*TBitmap(ImgLibrary[0]).Height;
X:=(p_nIdx mod 300)*TBitmap(ImgLibrary[0]).Width;
p_Image.Canvas.Draw(X,Y,TBitmap(ImgLibrary[p_nBitmapID]));
end;


собирай из этих кусков приложение.
хотя конечно правильней лучьше в ручную рисовать, наверно быстрей будет...



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

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
4-95163
mazepa
2003-04-02 14:51
2003.05.29
readfile


1-94847
Ler
2003-05-19 17:27
2003.05.29
Как скопировать непустую директорию, т.е. со всем ее содержимым?


1-94877
Grey_g
2003-05-17 10:30
2003.05.29
DateTime


14-95052
F1 plz
2003-05-08 02:30
2003.05.29
Интегралы


8-94969
AngelSaint
2002-12-20 09:45
2003.05.29
Как программировать Sound Blaster