Cum se face o listă de tbitmap

Imaginile vor fi încărcate în OnCreate ().
Prin intermediul funcției LoadImage ("name_1", "data / image_1.bmp");
Ie numele și calea.

Pentru a primi este necesar prin funcția GetImage (Nume: șir): TBitmap;
Ie numit TBitmap.

Până acum văd doar o astfel de soluție:


tip
# xA0; TItem = înregistrare
# xA0; # xA0; # xA0; nume: șir;
# xA0; # xA0; # xA0; Bitmap: TBitmap;
# xA0; sfârșitul;

Item.Name:= Nume;
Articol.Bitmap: = TBitmap;
Item.Bitmap.LoadFromFile ();

Singurul dezavantaj al foilor de lucru (care conțin un link spre bitmap) este pierderea Giedhendle-ului. Acest defect este privat de ImamjList, dar păstrează imagini de aceeași dimensiune, acesta este defectul său.
Depinde mult de condițiile specifice ale problemei. Puteți scrie propriul dvs. ImajList, cu blackjack. O pânză, o masă de deplasări și dimensiuni, o metodă de obținere.

Dar, în general, este de preferat StringList.

Da, imagini de dimensiuni diferite.


> Dar în cazul general, desigur, StringList este de preferat.

Până acum am făcut-o prin el.


> Singurul dezavantaj al SheetsObjects (care conține un link spre bitmap) -> pierderea giedhendle.

E ca și cum? Unde este pierdut?

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

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

Iată clasa, nu știu ce să fac în cazul unei excepții în AddImage () când se încarcă o imagine:


tip
# xA0; TListImages = clasă
# xA0; # xA0; constructor Creare ();
# xA0; # xA0; destructor # xA0; Destroy (); suprascrie;
# xA0; privat
# xA0; # xA0; FList: TStringList;
# xA0; public
# xA0; # xA0; procedura AddImage (const Numele: string; const NumeleNumar: șir);
# xA0; funcția # xA0; # xA0; GetImage (const Numele: șir): TBitmap;
# xA0; sfârșitul;

constructor TListImages.Create ();
începe
# xA0; moștenit;
# xA0; FList: = TStringList.Create ();
se încheie;

destructor TListImages.Destroy ();
începe
# xA0; FreeAndNil (FList);
# xA0; moștenit;
se încheie;

procedura TListImages.AddImage (const Numele: string; const NumeleName: string);
var
# xA0; Bitmap: TBitmap;
începe
# xA0; Bitmap: = TBitmap.Create ();
# xA0; încercați
# xA0; # xA0; Bitmap.LoadFromFile (NumeFile);
# xA0; # xA0; Bitmap.PixelFormat: = pf32bit;

# xA0; # xA0; FList.AddObject (Nume, Bitmap);
# xA0; cu excepția
# xA0; # xA0; FreeAndNil (Bitmap);
# xA0; sfârșitul;
se încheie;

funcția TListImages.GetImage (const Numele: șir): TBitmap;
var
# xA0; Idx: LongInt;
începe
# xA0; dacă (FList.Find (Nume, Idx))
# xA0; apoi rezultatul: = (FList.Objects [Idx] ca TBitmap)
# xA0; altceva Rezultat: = nil;
se încheie;

procedura TForm1.Button1Click (expeditor: TObject);
var
# xA0; ListImages: TListImage;
# xA0; Bitmap: # xA0; # xA0; TBitmap;
începe
# xA0; ListImages: = TListImages.Create ();
# xA0; încercați
# xA0; # xA0; ListImages.AddImage ("image_1", "1.bmp");

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

# xA0; # xA0; dacă (asignat (Bitmap))
# xA0; # xA0; apoi Canvas.Draw (25, 25, Bitmap)
# xA0; # xA0; altfel ShowMessage ("Eroare");
# xA0; în cele din urmă
# xA0; # xA0; FreeAndNil (listaImage);
# xA0; sfârșitul;
se încheie;

În metoda Adăugați, distrugeți bitmapul descărcat și acesta nu mai există. Ia cartofii departe.
În destructor adăugați curățarea imaginilor bitmap (în îngheț pentru fiecare).
Da, metoda adăugată ar trebui să returneze bitmap și, pe lângă aceasta, să verifice deja cu acest nume și să o returneze dacă este.

> E ca și cum? Unde este pierdut?

Pentru moment, ciocan, trebuie să explic eroarea. Pentru auto-educație, citiți mânerul Google GDI

Este distrus dacă s-a produs o excepție în timpul LoadFromFile ()
Nu îmi este clar cum să fac asta.


> În destructor adăugați curățarea imaginilor bitmap (în îngheț pentru fiecare).


> Da, adăugați metoda trebuie să returneze bitmap și, de asemenea, verificați
> Există deja acest nume și îl returnați dacă există unul.

Nu cred că o să am nevoie de ea.


> Demonstrarea capătului mânerelor GDI

În lista noastră unde va fi scurgeri?
La urma urmei, este apelat FreeAndNil ()


> În lista noastră unde va fi scurs?

Aceasta nu este o scurgere. Pur și simplu GDi.Handel este o resursă valoroasă, este limitată la 8-10 mii. Folosit pentru a desena totul pe formular. Și când creați TBitmap este consumat.
Dacă lista este mai mare de 8-10 mii, atunci programul nu va putea să funcționeze corect.

Nu cred că sunt necesare multe imagini.


> Nu este o scurgere. Pur și simplu GDi.Handel este o resursă valoroasă, este limitată la 8-10 mii.

Un Bitmap.Dormant - după "utilizare" - eliberează descriptorul GDI - până la următoarea "nevoie".

Haha, în general, pentru a stoca o grămadă de bitmap-uri? Este cu tragerea la sorti pe Gdi? Dacă acestea sunt mici este mai bine să păstreze un bitmap și taie biții pe care doriți, în cazul în mare magazin general de pe disc, și după cum este necesar pentru a cufunda, în cazul în care discul pentru a încărca încet, apoi le descărcați în prealabil o listă de fluxuri și doar o singură navă pe zbor în bitmap.

> Este cu tragerea la sorti pe Gdi?

Și ceea ce multe resurse GDI trage 1 TBitmap?
În teorie, aceasta este o secțiune HBITMAP și DIB, nu ar trebui să fie prea mult.

constructor TListImages.Create ();
începe
# xA0; moștenit;
# xA0; FList # xA0; # xA0; # xA0; # xA0; # xA0; : = TStringList.Create ();
# xA0; FList.Duplicates: = dupError;
# xA0; FList.Sorted # xA0; # xA0 ;: = Adevărat;
se încheie;

destructor TListImages.Destroy ();
var
# xA0; i: # xA0; # xA0; # xA0; LongInt;
# xA0; Bitmap: TBitmap;
începe
# xA0; pentru i: = 0 la FList.Count - 1 do // Este corect aici? FListul în sine nu va șterge legăturile?
# xA0; începeți
# xA0; # xA0; Bitmap: = (FList.Objects [i] ca TBitmap);
# xA0; # xA0; FreeAndNil (Bitmap);
# xA0; sfârșitul;

funcția TListImages.AddImage (const Numele: string; const NumeleName: string): boolean;
var
# xA0; Bitmap: TBitmap;
începe
# xA0; Bitmap: = TBitmap.Create ();
# xA0; încercați
# xA0; # xA0; Bitmap.LoadFromFile (NumeFile);
# xA0; cu excepția # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; // Este modul potrivit de a face față excepției?
# xA0; # xA0; FreeAndNil (Bitmap);
# xA0; sfârșitul;

# xA0; dacă rezultatul este atunci
# xA0; începeți
# xA0; # xA0; FList.AddObject (Nume, Bitmap);

funcția TListImages.GetImage (const Numele: șir): TBitmap;
var
# xA0; Idx: LongInt;
începe
# xA0; dacă (FList.Find (Nume, Idx))
# xA0; apoi rezultatul: = (FList.Objects [Idx] ca TBitmap)
# xA0; altceva Rezultat: = nil;
se încheie;


> // Este modalitatea corectă de a face față excepției?

Ei bine, cum să-ți spun. În mod formal, totul este corect, dar nu veți ști de ce bitmap-ul nu este încărcat. Poate fi meritat după FreeAndNil (Bitmap); Pentru a adăuga o majorare?

Articole similare