Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизИ опять создание 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c