A tbitmap listájának elkészítése

A képek betöltődnek az OnCreate () -ben.
A LoadImage ("name_1", "data / image_1.bmp") funkció segítségével;
Ie neve és elérési útja.

A fogadáshoz szükséges a GetImage (Name: string) funkció: TBitmap;






Ie úgynevezett TBitmap.

Eddig csak egy ilyen megoldást látok:


típus
# xA0; TItem = rekord
# xA0; # xA0; # xA0; Név: string;
# xA0; # xA0; # xA0; Bitmap: TBitmap;
# xA0; vége;

Elem.Name:= Név;
Item.Bitmap: = TBitmap;
Item.Bitmap.LoadFromFile ();

A munkalapok egyetlen hátránya (amely a bitképre mutató linket tartalmaz) a Giedhendle elvesztése. Ezt a hibát az ImamjList megfosztja, de ugyanolyan méretű képeket tart, ez az ő hibája.
Nagyon függ a probléma sajátos körülményeitől. Tudod írni a saját, a blackjack. Egy vászon, egy elmozdulási és dimenziós táblázat, egy megszerzési módszer.

Az általános esetben természetesen a StringList is előnyös.

Igen, különböző méretű képek.


> Az általános esetben természetesen a StringList is előnyös.

Eddig végeztem rajta.


> A SheetsObjects egyetlen hátránya (amely tartalmaz egy hivatkozást a bitképre) -> a giedhendle elvesztése.

Olyan, mint? Hol van?

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

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

Itt van az osztály, nem tudom, mit kell tennie egy kivétel esetén az AddImage () alatt a kép betöltésekor:


típus
# xA0; TListImages = osztály
# xA0; # xA0; konstruktor Create ();
# xA0; # xA0; destructor # xA0; Destroy (); felülbírálhatja;
# xA0; privát
# xA0; # xA0; FList: TStringList;
# xA0; nyilvános
# xA0; # xA0; eljárás AddImage (const Név: string; const Fájlnév: string);
# xA0; # xA0; függvény # xA0; GetImage (const Név: karakterlánc): TBitmap;
# xA0; vége;

konstruktor TListImages.Create ();
kezdődik
# xA0 örökölt;
# xA0; FList: = TStringList.Create ();
végén;

destructor TListImages.Destroy ();
kezdődik
# xA0; FreeAndNil (FList);
# xA0 örökölt;
végén;

eljárás TListImages.AddImage (const Név: string; const Fájlnév: string);
var
# xA0; Bitmap: TBitmap;
kezdődik
# xA0; Bitmap: = TBitmap.Create ();
# xA0; próbáld ki
# xA0; # xA0; Bitmap.LoadFromFile (fájlnév);
# xA0; # xA0; Bitmap.PixelFormat: = pf32bit;

# xA0; # xA0; FList.AddObject (név, bitmap);
# xA0; kivéve
# xA0; # xA0; FreeAndNil (Bitmap);
# xA0; vége;
végén;

TListImages.GetImage funkció (const Name: string): TBitmap;
var
# xA0; Idx: LongInt;
kezdődik
# xA0; ha (FList.Find (Név, Idx))
# xA0, majd Eredmény: = (FList.Objects [Idx] mint TBitmap)
# xA0; else Eredmény: = null;






végén;

eljárás TForm1.Button1Kattintson (Feladó: TObject);
var
# xA0; ListImages: TListImages;
# xA0; Bitmap: # xA0; # xA0; TBitmap;
kezdődik
# xA0; ListImages: = TListImages.Create ();
# xA0; próbáld ki
# xA0; # xA0; ListImages.AddImage ("image_1", "1.bmp");

# xA0; # xA0; Bitmap: = ListImages.GetImage ("image_1");

# xA0; # xA0; ha (Assigned (Bitmap))
# xA0; # xA0, majd Canvas.Draw (25, 25, Bitmap)
# xA0; # xA0; egyéb ShowMessage ("Error");
# xA0, végül
# xA0; # xA0; FreeAndNil (ListImages);
# xA0; vége;
végén;

A Hozzáadás módban megsemmisíti a letöltött bitképet, és már nincs ott. Vegye ki a krumplit.
A megsemmisítőben adja hozzá a bitmapok tisztítását (mindegyik fagyasztásnál).
Igen, a hozzáadott metódusnak vissza kell adnia a bitképet, és azon kívül, hogy ellenőrizze már ilyen nevet, és visszaadja, ha van ilyen.

Ez olyan, mint? Hol van?

Most, kalapács, meg kell magyaráznom a hibát. Az önképzéshez olvassa el a Google GDI-címét

Megszűnik, ha a LoadFromFile () alatt kivétel történt
Nem értem, hogyan kell ezt csinálni.


> A megsemmisítőben adja hozzá a bitképek tisztítását (mindegyik fagyasztásnál).


> Igen, a hozzáadott módszernek vissza kell adnia a bitképet, és ellenőriznie kell
> Van már ilyen névvel és visszaadja, ha van ilyen.

Nem hiszem, hogy szükségem lesz rá.


> A GDI kezeléseinek bemutatása

A listánkban hol lesz a szivárgás?
Végül is a FreeAndNil () nevű


> A mi listánkban hol lesz szivárgás?

Ez nem szivárgás. Egyszerűen a GDi.Handel egy értékes erőforrás, amely 8-10 ezerre korlátozódik. Mindent felhasználni a formában. És amikor létrehozza a TBitmap-et, akkor elfogy.
Ha a lista nagyobb, mint 8-10 ezer, akkor a program nem fog megfelelően működni.

Nem hiszem, hogy sok bitképre lenne szükség.


Ez nem szivárgás. Egyszerűen a GDi.Handel egy értékes erőforrás, amely 8-10 ezerre korlátozódik.

Bitmap.Dormant - a "használat" után - kiadja a GDI leíróját - a következő "szükségig".

Haha általában tárolni egy heap bitképeket? A Gdi-val való lehívás? Ha kicsi jobb megtartani egy bitmap, és kivágták a bitre, ha a nagy általános tárolni a lemezen, és szükség szerint merítse, ha a lemez lassan töltődik be, akkor letöltheti őket előre listáját patakok és csak egy hajó a légy a bitmap.

> A Gdivel való lehívás?

És mi sok GDI-erőforrás húzza az 1 TBitmap-ot?
Elméletileg ez egy HBITMAP és DIB szakasz, nem sok lehet.

konstruktor TListImages.Create ();
kezdődik
# xA0 örökölt;
# xA0; FList # xA0; # xA0; # xA0; # xA0; # xA0; : = TStringList.Create ();
# xA0; FList.Duplicates: = dupError;
# xA0; FList.Sorted # xA0; # xA0 ;: Igaz;
végén;

destructor TListImages.Destroy ();
var
# xA0; i: # xA0; # xA0; # xA0; LongInt;
# xA0; Bitmap: TBitmap;
kezdődik
# xA0; az i: = 0-hoz FList.Count - 1 do // Ez itt helyes? FList maga nem fogja tisztázni a linkeket?
# xA0; kezdődik
# xA0; # xA0; Bitmap: = (FList.Objects [i] mint TBitmap);
# xA0; # xA0; FreeAndNil (Bitmap);
# xA0; vége;

függvény TListImages.AddImage (const Név: string; const Fájlnév: string): logikai;
var
# xA0; Bitmap: TBitmap;
kezdődik
# xA0; Bitmap: = TBitmap.Create ();
# xA0; próbáld ki
# xA0; # xA0; Bitmap.LoadFromFile (fájlnév);
# xA0; kivéve # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; // A helyes megoldás a kivétel kezelésére?
# xA0; # xA0; FreeAndNil (Bitmap);
# xA0; vége;

# xA0, ha Eredmény akkor
# xA0; kezdődik
# xA0; # xA0; FList.AddObject (név, bitmap);

TListImages.GetImage funkció (const Name: string): TBitmap;
var
# xA0; Idx: LongInt;
kezdődik
# xA0; ha (FList.Find (Név, Idx))
# xA0, majd Eredmény: = (FList.Objects [Idx] mint TBitmap)
# xA0; else Eredmény: = null;
végén;


> / / Ez a helyes megoldás a kivétel kezelésére?

Nos, hogy mondjam el. Formálisan minden rendben van, de nem fog tudni, miért nincs betöltve a bitkép. A FreeAndNil (Bitmap) után érdemes lehet; Emelés hozzáadása?




Kapcsolódó cikkek