Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.021 c
7-95149
Dmit
2003-03-30 17:38
2003.05.29
PrintScreen


1-94946
Fenix_
2003-05-17 03:26
2003.05.29
байт знака числа


3-94738
Alexandr3
2003-05-08 21:41
2003.05.29
Убрать запрос пароля для Парадоксовской таблицы


6-94982
VIB
2003-03-29 16:12
2003.05.29
MAC-Adress


14-95076
Nick Denry
2003-05-10 00:30
2003.05.29
Насколько реально написать свою ОС?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский