ПредишенСледващото

Boot изображения ще бъдат OnCreate ().
След LoadImage функция ( "NAME_1", "данни / image_1.bmp");
Т.е. името и пътя.

Получаване е необходимо, чрез функция GetImage (Име: низ): TBitmap;
Т.е. наречен TBitmap.

Досега аз виждам само това решение:


тип
# XA0; TItem = запис
# XA0; # XA0; # XA0; Име: низ;
# XA0; # XA0; # XA0; Bitmap: TBitmap;
# XA0; край;

Item.Name:= име;
Item.Bitmap: = TBitmap;
Item.Bitmap.LoadFromFile ();

Единственият недостатък ListovObektov (съдържащ позоваване на растерни) - gdihendla загуба. Този дефицит лишени ImadzhList, но той продължава да снимки на един и същ размер, липсата на него.
Много зависи от специфичните условия на проблема. И вие можете да напишете вашето ImadzhList с блекджек. Едно платно, маса на компенсации и размери, начин на приготвяне.

Но като цяло, разбира се StringList предпочитане.

Да, изображения с различни размери.


> Но като цяло, разбира се StringList предпочитане.

Докато съм направил чрез него.


> Единственият недостатък ListovObektov (съдържащ позоваване на растерни) -> загуба gdihendla.

Как е? В кое място той загуби?

# XA0;
# XA0; Bitmap: TBitmap;
# XA0; Bitmap.LoadFromFile ();

# XA0; S: TStringList;
# XA0; S.AddObject ( "1", Bitmap);

Тук съм направил класа, не знам какво да правя в случай на изключение в AddImage () при изтеглянето на изображението:


тип
# XA0; TListImages = клас
# XA0; # XA0; конструктор Създаване ();
# XA0; # XA0; деструктор # XA0; унищожи (); отменят;
# XA0; частен
# XA0; # XA0; FList: TStringList;
# XA0; обществен
# XA0; # XA0; процедура AddImage (Конст Име: низ; Конст FileName: низ);
# XA0; # XA0; функция # XA0; GetImage (Конст Име: низ): TBitmap;
# XA0; край;

конструктор TListImages.Create ();
започвам
# XA0; наследствено;
# XA0; FList: = TStringList.Create ();
приключи;

деструктор TListImages.Destroy ();
започвам
# XA0; FreeAndNil (FList);
# XA0; наследствено;
приключи;

процедура TListImages.AddImage (Конст Име: низ; Конст FileName: низ);
Var
# XA0; Bitmap: TBitmap;
започвам
# XA0; Bitmap: = TBitmap.Create ();
# XA0; опитате
# XA0; # XA0; Bitmap.LoadFromFile (FileName);
# XA0; # XA0; Bitmap.PixelFormat: = pf32bit;

# XA0; # XA0; FList.AddObject (име, Bitmap);
# XA0 изключение
# XA0; # XA0; FreeAndNil (Bitmap);
# XA0; край;
приключи;

функционира TListImages.GetImage (Конст Име: низ): TBitmap;
Var
# XA0; Idx: LongInt;
започвам
# XA0; ако (FList.Find (име, Idx))
# XA0; след това Резултат: = (FList.Objects [Idx] като TBitmap)
# XA0; друго Резултат: = нула;
приключи;

процедура TForm1.Button1Click (Sender: TObject);
Var
# XA0; ListImages: TListImages;
# XA0; Bitmap: # XA0; # XA0; TBitmap;
започвам
# XA0; ListImages: = TListImages.Create ();
# XA0; опитате
# XA0; # XA0; ListImages.AddImage ( "IMAGE_1", "1.bmp");

# XA0; # XA0; Bitmap: = ListImages.GetImage ( "IMAGE_1");

# XA0; # XA0; ако (целеви (Bitmap))
# XA0; # XA0; след това Canvas.Draw (25, 25, Bitmap)
# XA0; # XA0; друго ShowMessage ( "Грешка");
# XA0; накрая
# XA0; # XA0; FreeAndNil (ListImages);
# XA0; край;
приключи;

Методът за добавяне на ви унищожи зареден растерна графика и да го няма. Вземете картофки.
В деструктора добавят растерни пречистване (налични за всеки цикъл).
Да IMHO добавите метод трябва да връща на растерна графика, а също и за да се провери дали има вече с това име, и да го върне, ако има.

> Това е как? В кое място той загуби?

Докато Hammer, счупи ми обясни. За себе си чете в Google GDI дръжка

Той унищожен, ако по изключение се случва по време на LoadFromFile ()
Това просто не е ясно за мен, дали е правилното нещо да направя.


> В деструктора добавят растерни пречистване (налични за всеки цикъл).


> Да, IMHO, добавете начин трябва да връща на растерна графика, а също така да се провери
> Има ли вече с това име, и да го върне, ако има.

Не мисля, че имам нужда от него.


> Край Демонстрация HDI Хендли

В нашия списък от където течът е?
В крайна сметка, се нарича FreeAndNil ()


> В нашия списък от където течът е?

Това не е теч. Просто GDi.Handel ценен ресурс е ограничен до 8-10 хиляди. Използва се за събиране на цялото във формуляра. И когато създавате TBitmap тя се изразходва.
Ако списъкът е голям 8-10 хиляди души, а след това програмата няма да работи коректно.

Не мисля, че толкова много се нуждаят растерни изображения.


> Това не е теч. Просто GDi.Handel ценен ресурс е ограничен до 8-10 хиляди.

А Bitmap.Dormant - след "употреба" - освобождаване на дръжката GDI - до следващото "необходимостта".

Какво за цяло да запази един куп растерни изображения? Това е усложнение на GDI? Ако те са малки, е по-добре да се поддържа една растерна графика и изрежете битовете, които искате, ако голямата смесения магазин на диск, и ако е необходимо да се потопи, ако на диска, за да заредите бавно, а след това да ги изтеглите предварително списък на потоци и само един кораб в движение в растерна графика.

> Това е с струни GDI?

Това, което много GDI ресурси дърпа 1 TBitmap?
В идеята е една HBITMAP и DIB сечение, не много трябва да бъде.

конструктор TListImages.Create ();
започвам
# XA0; наследствено;
# XA0; FList # XA0; # XA0; # XA0; # XA0; # XA0; : = TStringList.Create ();
# XA0; FList.Duplicates: = dupError;
# XA0; FList.Sorted # XA0; # XA0 ;: = True;
приключи;

деструктор TListImages.Destroy ();
Var
# XA0; I: # XA0; # XA0; # XA0; LongInt;
# XA0; Bitmap: TBitmap;
започвам
# XA0, защото аз: = 0 до FList.Count - 1 направя // ако се прави тук, е вярно? Сам FList изчиства връзки?
# XA0; започне
# XA0; # XA0; Bitmap: = (FList.Objects [I] като TBitmap);
# XA0; # XA0; FreeAndNil (Bitmap);
# XA0; край;

функция TListImages.AddImage (Конст Име: низ; Конст FileName: низ): Булева;
Var
# XA0; Bitmap: TBitmap;
започвам
# XA0; Bitmap: = TBitmap.Create ();
# XA0; опитате
# XA0; # XA0; Bitmap.LoadFromFile (FileName);
# XA0 изключение # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; // правилно с изключение така?
# XA0; # XA0; FreeAndNil (Bitmap);
# XA0; край;

# XA0; ако Резултат след това
# XA0; започне
# XA0; # XA0; FList.AddObject (име, Bitmap);

функционира TListImages.GetImage (Конст Име: низ): TBitmap;
Var
# XA0; Idx: LongInt;
започвам
# XA0; ако (FList.Find (име, Idx))
# XA0; след това Резултат: = (FList.Objects [Idx] като TBitmap)
# XA0; друго Резултат: = нула;
приключи;


> // правилно с изключение така?

Е, както казвате. Формално, всичко е наред, но защо не се зареждат растерни няма да знае. Може би си заслужава, след FreeAndNil (Bitmap); добави повишение?

Свързани статии

Подкрепете проекта - споделете линка, благодаря!