2. Prßce se seznamy
  1. Mnoho r∙zn²ch aplikacφ C++ Builderu pot°ebuje pracovat se seznamem znakov²ch °et∞zc∙. Tyto seznamy jsou prvky v okn∞ seznamu nebo kombinovanΘho okna, °ßdky textu v komponent∞ Memo, seznam podporovan²ch pφsem, apod. P°esto╛e aplikace pou╛φvajφ tyto seznamy r∙zn²m zp∙sobem, C++ Builder poskytuje spoleΦnΘ rozhranφ prost°ednictvφm objektu nazvanΘho seznam °et∞zc∙. Seznam °et∞zc∙ pou╛φvßme i prost°ednictvφm Inspektora objekt∙. Vlastnost seznamu °et∞zc∙ se zde zobrazuje hodnotou TStrings ve sloupci hodnot. Kdy╛ zde dvojit∞ klikneme je zobrazen Editor seznamu °et∞zc∙, ve kterΘm m∙╛eme editovat, p°idßvat nebo ru╣it °ßdky.

  2. K zji╣t∞nφ poΦtu °et∞zc∙ v seznamu pou╛φvßme vlastnost Count. Je to vlastnost urΦenß pouze pro Φtenφ. Jeliko╛ indexy pou╛φvanΘ v seznamu °et∞zc∙ zaΦφnajφ od nuly, je hodnota Count o jedniΦku v∞t╣φ ne╛ index poslednφho °et∞zce v seznamu. Nap°. aplikace m∙╛e zjistit, kolik r∙zn²ch pφsem je aktußln∞ podporovßno obrazovkou, p°eΦtenφm vlastnosti Count objektu seznamu pφsem (seznam jmen v╣ech podporovan²ch pφsem), tj. Screen->Fonts->Count. Seznam °et∞zc∙ mß indexovanou vlastnost nazvanou Strings, kterou si m∙╛eme p°edstavit jako seznam °et∞zc∙. Nap°. prvnφ °et∞zec v seznamu je Strings[0]. ╪et∞zce do seznamu lze p°idßvat dv∞ma zp∙soby. Jednß se o p°idßnφ na konec seznamu a vlo╛enφ do seznamu na urΦen² index. K p°idßnφ °et∞zce na konec seznamu volßme metodu seznamu Add p°idßvajφcφ parametr jako nov² °et∞zec. K vlo╛enφ °et∞zce do seznamu volßme metodu Insert. Mß dva parametry: index na kter² chceme °et∞zec vlo╛it a vklßdan² °et∞zec.
    Vytvo°te aplikaci obsahujφcφ komponentu Memo a tlaΦφtko. P°i stisku tlaΦφtka zapi╣te do komponenty Memo jmΘna v╣ech obrazovkou podporovan²ch pφsem.
  3. Se seznamem °et∞zc∙ m∙╛eme provßd∞t je╣t∞ °adu dal╣φch operacφ. ╚asto pot°ebujeme zjistit pozici (index) °et∞zce v seznamu (nebo zjistit existenci °et∞zce). K lokalizaci °et∞zce v seznamu pou╛φvßme metodu seznamu IndexOf. Metoda p°ebφrß °et∞zec jako sv∙j parametr a vracφ index nalezenΘho °et∞zce nebo -1 nenφ-li °et∞zec nalezen. Tato metoda pracuje pouze s kompletnφmi °et∞zci (parametr se musφ cel² p°esn∞ shodovat s cel²m °et∞zcem v seznamu). Nap°. nßsledujφcφ p°φkaz zji╣╗uje zda soubor WIN.INI je v seznamu soubor∙ v komponent∞ FileListBox:

  4. if (FileListBox1->Items->IndexOf("WIN.INI") > -1) ...
    ╪et∞zec v seznamu m∙╛eme p°esunout na jinou pozici. K p°esunu °et∞zce v seznamu volßme metodu seznamu Move, kterß mß dva parametry: souΦasn² index prvku a index, na kter² prvek chceme p°esunout. Pro zru╣enφ °et∞zce v seznamu volßme metodu seznamu Delete a p°edßme ji index ru╣enΘho °et∞zce. Jestli╛e index ru╣enΘho °et∞zce neznßme, pou╛ijeme metodu IndexOf k  jeho zji╣t∞nφ. Nap°. p°φkazy, kterΘ p°idßme do na╣φ p°edchozφ aplikace m∙╛eme ze seznamu pφsem odstranit pφsmo Curier New:
    if (Memo1->Lines->IndexOf("Courier New") > -1)
      Memo1->Lines->Delete(Memo1->Lines->IndexOf("Courier New"));
    Kopφrovßnφ kompletnφho seznamu °et∞zc∙ z jednoho seznamu do jinΘho, provedeme p°i°azenφm zdrojovΘho seznamu cφlovΘmu seznamu. Nap°.
    Memo1->Lines = ListBox1->Items;
    Tφm p°epφ╣eme °et∞zce cφlovΘho seznamu. Jestli╛e chceme p°idat seznam °et∞zc∙ na konec jinΘho seznamu, volßme metodu AddStrings seznamu, ke kterΘmu p°idßvßme a jako parametr p°edßme seznam °et∞zc∙, kter² chceme p°idat. Nap°.
    Memo1->AddStrings(ListBox1->Items);
    Kdy╛ kopφrujeme °et∞zce mezi lokßlnφmi prom∞nn²mi, pou╛φvßme k zabrßn∞nφ neoΦekßvan²m v²sledk∙m metodu Assign t°φdy TString. Jestli╛e jednodu╣e p°i°adφme jeden °et∞zec jinΘmu pomocφ lokßlnφ prom∞nnΘ, pak prom∞nnß nenφ kopie °et∞zce a p∙vodnφ objekt °et∞zce je ztracen. Nßsledujφcφ p°φklad ukazuje chybn² a sprßvn² zp∙sob kopφrovßnφ °et∞zc∙ pomocφ lokßlnφch prom∞nn²ch:
    TFont *f = new TFont();
    f = Form1->Font;            // chybnΘ
    f->Assign(Form1->Font);     // sprßvnΘ
    Dopl≥te p°edchozφ aplikaci o komponentu ListBox, do kterΘ p°i stisku dal╣φho tlaΦφtka p°ekopφrujete v╣echny °et∞zce z komponenty Memo, kterΘ obsahujφ ve svΘm textu CE.
  5. Pomocφ cyklu lze prochßzet jednotliv²mi °et∞zci seznamu. Do p°edchozφ aplikace p°idejte dal╣φ tlaΦφtko, jeho╛ stiskem provedeme p°evod °et∞zc∙ v komponent∞ Memo na velkß pφsmena. Pro p°evod °et∞zce na velkß pφsmena lze pou╛φt metodu UpperCase t°φdy AnsiString.
  6. ProcviΦovßnφ pou╛φvßnφ seznam∙ °et∞zc∙ budeme provßd∞t v aplikaci, kterß bude vytvß°et anglickΘ v∞ty. Nejprve si ukß╛eme aplikaci bez pou╛itφ seznam∙. ZaΦneme novou aplikaci. K hornφmu okraji formulß°e umφstφme komponentu Label, ve kterΘ budeme vypisovat vytvß°enΘ v∞ty. Na zb²vajφcφ plochu formulß°e umφstφme vedle sebe t°i komponenty GroupBox a zm∞nφme jejich Caption na ?Prvnφ objekt, ?,Umφst∞nφ a ?Druh² objekt. Na lev?. GroupBox (s titulkem Prvnφ objekt) vlo╛φme nad sebe 4 voliΦe s texty: ?The book, ?,The pen, ?,The pencil a ?The chair. Prost°edn?. GroupBox bude obsahovat 3 voliΦe s texty: ?on, ?,under a ?near. Prav?. GroupBox bude obsahovat voliΦe s texty: ?the table, ?,the big box, ?,the carpet a ?the computer. V╣echny t°i hornφ voliΦ?. V╣echny t°i hornφ Label zv∞t╣φme pφsmo a jeho Caption zm∞nφme na ?The book is on the table.. Tento text budeme ovlßdat voliΦi. V╣echny voliΦe budou mφt stejnou obsluhu udß?. OnClick. Obsluha bude tvo°ena p°φkazy:

  7. AnsiString Veta;
    int I;
    for (I = 0; I < GroupBox1->ControlCount; I++)
      if (((TRadioButton*)GroupBox1->Controls[I])->Checked)
        Veta=Veta+((TRadioButton*)GroupBox1->Controls[I])->Caption;
    Veta = Veta + " is ";
    for (I = 0; I < GroupBox2->ControlCount; I++)
      if (((TRadioButton*)GroupBox2->Controls[I])->Checked)
        Veta=Veta+((TRadioButton*)GroupBox2->Controls[I])->Caption;
    Veta = Veta + " ";
    for (I = 0; I < GroupBox3->ControlCount; I++)
      if (((TRadioButton*)GroupBox3->Controls[I])->Checked)
        Veta=Veta+((TRadioButton*)GroupBox3->Controls[I])->Caption;
    Label1->Caption = Veta + ".";
    Aplikace je hotova, m∙╛eme ji vyzkou╣et.
  8. Zm∞≥te p°edchozφ aplikaci tak, ╛e krajnφ komponenty GroupBox nahradφte komponentami ListBox. Umo╛nφ nßm to pou╛itφ vφce slov. Do obou komponent vlo╛φme tato slova: big box, book, carpet, chair, computer, desk, floor, pen, pencil, small box, sofa a table (m∙╛eme je vlo╛it pouze do jednΘ komponenty a v obsluze OnCreate formulß°e p°ekopφrovat tento seznam do druhΘho seznamu). Aby se zlep╣ila pou╛itelnost nastavφme u obou komponent ListBox vlastnost Sorted na true. Slova jsou uvedena bez Φlen∙. Dopl≥ujte je p°i vytvß°enφ v∞ty. Vybran² prvek v seznamu je urΦen hodnotou vlastnosti ItemIndex. Prove∩te tuto zm∞nu aplikace sami.
  9. V aplikaci provedeme dal╣φ zm∞nu. VybranΘ slovo v prvnφm seznamu odstranφme z druhΘho seznamu a slovo vybranΘ v druhΘm seznamu odstranφme z prvnφho seznamu. Po zm∞n∞ v²b∞ru v n∞kterΘm seznamu op∞t odstran∞nΘ slovo do seznamu vrßtφme. Je nutno si tedy odstran∞nß slova zapamatovat. Do soukromΘ Φßsti deklarace formulß°e vlo╛φme polo╛ky (pro zapamatovßnφ odstran∞n²ch slov):

  10. AnsiString String1, String2;
    Dal╣φ problΘm, kter² musφme vy°e╣it je ten, ╛e na zaΦßtku nenφ v ╛ßdnΘ komponent∞ ListBox vybrßna polo╛ka. V obsluze OnCreate formulß°e tedy vlo╛φme do polo╛ky String1, resp. String2 °et∞zec book, resp. table (odpovφdß to p∙vodn∞ zobrazenΘ v∞t∞), tato slova zru╣φme v p°φslu╣n²ch seznamech (String1 v ListBox2 a String2 v Listbox1) a v seznamech je vybereme. V aplikaci dßle umo╛nφme p°idßvßnφ dal╣φch slov. Na formulß° umφstφme editaΦnφ ovladaΦ a tlaΦφtko s textem P°idej. Po stisku tlaΦφtka zjistφme, zda editaΦnφ ovladaΦ nenφ prßzdn² nebo zda neobsahuje slovo, kterΘ je ji╛ obsa╛eno v n∞kterΘm seznamu a pokud tyto podmφnky jsou spln∞ny, pak obsah editaΦnφho ovladaΦe vlo╛φme do obou seznam∙ (po vlo╛enφ musφme op∞t vybrat pou╛itß slova ve v∞t∞; tzn. nalΘzt v ka╛dΘm seznamu pou╛itΘ slovo a vybrat je). P°i nevhodnΘm obsahu editaΦnφho ovladaΦe zobrazte okno zprßv s oznßmenφm chyby. Vytvo°te tuto aplikaci sami.
  11. Seznam °et∞zc∙ lze snadno ulo╛it do textovΘho souboru (SaveToFile) a op∞t jej zavΘst nebo jej zavΘst do jinΘho seznamu (LoadFromFile). Jako parametr u t∞chto metod se pou╛φvß jmΘno souboru. Nap°. nßsledujφcφ k≤d zavßdφ soubor C:\WinNT\Win.Ini do komponenty Memo a vytvß°φ zßlo╛nφ kopii souboru Win.BAK:

  12. AnsiString FileName = "C:\\WinNT\\Win.Ini";
    Memo1->Lines->LoadFromFile(FileName);
    Memo1->Lines->SaveToFile(ChangeFileExt(FileName, ".BAK"));
    Upravte p°edchozφ aplikaci tak, aby slova pou╛itß v seznamu byla p°i spu╣t∞nφ aplikace naΦtena z textovΘho souboru slova.txt, vytvo°ena kopie tohoto souboru (slova.old) a p°i uzav°enφ aplikace (nap°. v obsluze udßlosti OnDestroy formulß°e) op∞t zapsßna do slova.txt (do seznamu jsme mohli n∞jakΘ slovo p°idat). Vytvo°te takΘ pot°ebn² textov² soubor. Aplikaci vyzkou╣ejte.
  13. Na╣i aplikaci nynφ zm∞nφme takto: V prvnφm seznamu umo╛nφme vφcenßsobn² v²b∞r (nebudeme takΘ ji╛ odstra≥ovat pou╛itß slova ze seznam∙). Vφcenßsobn² v²b∞r umo╛nφme nastavenφm vlastnosti MultiSelect na true. VybranΘ prvky nynφ zjistφme testovßnφm pole Selected. Nap°. zji╣t∞nφ poΦtu vybran²ch polo╛ek provedeme p°φkazy:

  14. int PocetVybr = 0;
    for (int I = 0; I < ListBox1->Items->Count; I++)
      if (ListBox1->Selected[I]) PocetVybr++;
    Tuto zm∞nu prove∩te sami. Sna╛te se, aby vytvß°enΘ v∞ty vypadaly takto: The book is ..., The book, and the computer are .... The book, the computer, and the pen are .... Uv∞domte si, ╛e v seznamu nemusφ b²t vybrßn ╛ßdn² prvek (v tomto p°φpad∞ vytvo°te v∞tu zaΦφnajφcφ Nothing is ...).
  15. V dal╣φ aplikaci se podrobn∞ji seznßmφme s komponentou ComboBox (tato komponenta zabφrß mΘn∞ mφsta ne╛ ListBox). Vlastnostφ Style m∙╛eme m∞nit chovßnφ kombinovanΘho ovladaΦe. Jsou zde tyto mo╛nosti: csDropDown (umo╛≥uje p°φmou editaci a na po╛ßdßnφ zobrazuje seznam), csDropDownList (neumo╛≥uje editaci, pouze v²b∞r ze seznamu), csSimple (umo╛≥uje p°φmou editaci a seznam zobrazen nenφ), csOwnerDrawFixed a csOwnerDrawVariable (seznamy s u╛ivatelsky definovan²mi zobrazenφmi).

  16. V nßsledujφcφ aplikaci si ukß╛eme pou╛itφ prvnφch t°φ z t∞chto styl∙. ZaΦneme s v²vojem novΘ aplikace. Na formulß° umφstφme t°i komponenty ComboBox a tlaΦφtko s textem P°idej. Do seznamu °et∞zc∙ ka╛dΘ komponenty ComboBox vlo╛φme asi 20 jmen a nastavφme jejich vlastnosti Sorted na true. U prvnφho kombinovanΘho ovladaΦe nastavφme vlastnost Style na csDropDown. Vytvo°φme je╣t∞ obsluhu udßlosti OnClick tlaΦφtka P°idej:
    if ((ComboBox1->Text!="")&&(ComboBox1->Items->IndexOf(ComboBox1->Text)<0))
      ComboBox1->Items->Add(ComboBox1->Text);
    Jestli╛e u╛ivatel stiskne tlaΦφtko, pak text zadan² do kombinovanΘho ovladaΦe (je-li n∞jak²) je p°idßn do seznamu, samoz°ejm∞ za p°edpokladu, ╛e tam ji╛ nenφ.
    U druhΘho kombinovanΘho ovladaΦe nastavφme vlastnost Style na csDropDownList. Nep°i°adφme mu ╛ßdnou obsluhu udßlosti. Pou╛ijeme jej pro experimentovßnφ s automatick²mi vyhledßvacφmi technikami. Stiskneme-li klßvesu s n∞jak²m pφsmenem, bude vybrßn prvnφ °et∞zec v seznamu, zaΦφnajφcφ tφmto pφsmenem. Stiskem klßves se ╣ipkou nahoru nebo dol∙ se m∙╛eme v seznamu pohybovat bez nutnosti jej otev°φt. Tyto postupy lze pou╛φt i u ostatnφch kombinovan²ch ovladaΦ∙.
    T°etφ kombinovan² ovladaΦ (vlastnost Style nastavφme na csSimple) p°idß do seznamu nov² prvek p°i stisku klßvesy Enter. Vytvo°φme pro n∞j tuto obsluhu udßlosti OnKeyPress (stisknutφ klßvesy):
    if (Key == VK_RETURN)
      if((ComboBox3->Text!="")&&(ComboBox3->Items->IndexOf(ComboBox3->Text)<0))
        ComboBox3->Items->Add(ComboBox3->Text);
    Tφm je v²voj tΘto aplikace dokonΦen. Vyzkou╣φme chovßnφ jednotliv²ch kombinovan²ch ovladaΦ∙.
  17. ╚asto seznam °et∞zc∙ pou╛φvßme jako souΦßst n∞jakΘ komponenty a nemusφme tedy vytvß°et seznam sami. M∙╛eme ale takΘ vytvo°it seznam °et∞zc∙, kter² nenφ p°i°azen ╛ßdnΘ komponent∞. Pokud vytvo°φme sv∙j vlastnφ seznam, nesmφme zapomenout po ukonΦenφ prßce s nφm, jej op∞t uvolnit. Existujφ dva r∙znΘ zp∙soby pou╛φvßnφ seznamu: seznam, kter² aplikace v jednΘ metod∞ vytvo°φ, pou╛ije a zru╣φ a seznam, kter² aplikace vytvß°φ, pou╛φvß p°i b∞hu a zru╣φ jej p°ed sv²m ukonΦenφm.

  18. Pokud seznam °et∞zc∙ pot°ebujeme pouze v jednΘ metod∞, pak jej m∙╛eme vytvo°it, pou╛φt a zru╣it na jednom mφst∞. Je to bezpeΦn² zp∙sob pou╛φvßnφ objektu seznamu °et∞zc∙. Proto╛e objekt seznamu °et∞zc∙ alokuje pam∞╗ pro samotn² seznam a jeho °et∞zce, je d∙le╛itΘ chrßn∞nφ alokace pomocφ bloku try..catch k zaji╣t∞nφ, ╛e objekt uvolnφ svoji pam∞╗ i kdy╛ vznikne v²jimka. Implementace krßtkodobΘho seznamu tedy vypadß takto: Vytvo°φme objekt seznamu °et∞zc∙, v Φßsti try bloku try..catch jej pou╛φvßme a v Φßsti catch a po celΘm bloku jej uvolnφme. Nßsledujφcφ obsluha udßlosti reaguje na stisknutφ tlaΦφtka vytvo°enφm seznamu °et∞zc∙, jeho pou╛itφm a zru╣enφm:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TStrings *TempList = new TStringList(); // vytvo°enφ objektu seznamu
      try
      {
        // pou╛itφ seznamu °et∞zc∙
      }
      catch (...)
      {
        delete TempList; // zru╣enφ objektu seznamu
        throw;           // obnovenφ v²jimky
      }
      delete TempList; // zru╣enφ objektu seznamu, kdy╛ v²jimka nenastala
    }
  19. Jestli╛e seznam °et∞zc∙ pot°ebujeme kdykoliv p°i b∞hu aplikace, je nutno jej vytvo°it ihned po spu╣t∞nφ aplikace a uvolnit jej p°ed ukonΦenφm aplikace. To vy°e╣φme takto: Do t°φdy hlavnφho formulß°e aplikace p°idßme polo╛ku typu TStringList, v konstruktoru hlavnφho formulß°e vytvo°φme objekt seznamu °et∞zc∙, k deklaraci t°φdy hlavnφho formulß°e p°idßme destruktor a v tomto destruktoru seznam °et∞zc∙ uvolnφme (p°ed zastavenφm aplikace).

  20. V nßsledujφcφ aplikaci se pokusφme vytvo°it seznam se sou°adnicemi kliknutφ my╣i a na zßv∞r aplikace tento seznam zapφ╣eme do souboru. ZaΦneme v²vojem novΘ aplikace. Formulß° z∙stane prßzdn². Jako ve°ejnou polo╛ku formulß°e p°idßme:
    TStringList *SeznamKliknuti;
    Konstruktor formulß°e bude tvo°ena p°φkazem:
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
      SeznamKliknuti = new TStringList();
    }
    Obsluha OnMouseDown bude p°idßvat informace o kliknutφ do seznamu:
    SeznamKliknuti->Add("Kliknutφ na " + IntToStr(X) + ", " + IntToStr(Y));
    Zb²vß je╣t∞ vytvo°it destruktor formulß°e. Deklaraci destruktoru musφme p°idat do ve°ejnΘ Φßsti deklarace t°φdy formulß°e a tento destruktor bude tvo°en p°φkazy:
    __fastcall TForm1::~TForm1()
    {
      SeznamKliknuti->SaveToFile(ChangeFileExt(Application->ExeName,".LOG"));
      delete SeznamKliknuti;
    }
    Zde zapφ╣eme seznam do souboru. JmΘno tohoto souboru bude vytvo°eno ze jmΘna aplikace, ve kterΘm p°φponu zm∞nφme na LOG (pokud nep°ejmenujeme aplikaci, pak to bude soubor PROJECT1.LOG). V destruktoru takΘ seznam uvolnφme. Tφm je aplikace hotova. Vyzkou╣ejte ji a pokuste se zjistit jak pracuje.
  21. Mimo seznamu °et∞zc∙ ulo╛en²ch ve vlastnosti Strings m∙╛e seznam obsahovat takΘ seznam objekt∙ (p°esn∞ji °eΦeno seznam ukazatel∙ na objekty), kterΘ jsou ulo╛eny ve vlastnosti Objects. Vlastnost Objects je takΘ indexovanß, je to indexovan² seznam objekt∙. Jestli╛e pou╛φvßme °et∞zce v seznamu, nemusφme mφt takΘ objekty; seznam ned∞lß nic s objekty, pokud k nim specificky nep°istupujeme. C++ Builder pouze dr╛φ informaci o objektu a my s nφ pracujeme. N∞kterΘ seznamy °et∞zc∙ p°idanΘ objekty ignorujφ (proto╛e pro n∞ nemajφ v²znam). Nap°. seznam °et∞zc∙ v komponent∞ Memo neuklßdß p°idanΘ objekty. P°esto╛e vlastnosti Objects m∙╛eme p°i°adit libovoln² typ objektu, Φasto pou╛φvßme bitovΘ mapy. D∙le╛itΘ je zapamatovat si, ╛e °et∞zec a objekt tvo°φ pßr. Pro ka╛d² °et∞zec je p°i°azen objekt; implicitn∞ objekt je NULL. Seznam °et∞zc∙ nevlastnφ p°i°azenΘ objekty, tzn. uvoln∞nφ objektu seznamu neuvol≥uje objekty p°i°azenΘ °et∞zc∙m.

  22. Prßci s objekty provßdφme obdobn∞, jako prßci s °et∞zci. Nap°. k jednotliv²m objekt∙m p°istupujeme indexacφ vlastnosti Objects a to stejn∞ jako u vlastnosti Strings. Pro p°idßnφ, vlo╛enφ a lokalizaci objektu pou╛φvßme metody AddObject, InsertObject a IndexOfObject. Metody Delete, Clear a Move pracujφ s prvkem seznamu jako s celkem, tzn. zru╣enφ prvku ru╣φ jak °et∞zec, tak i odpovφdajφcφ odkaz na objekt. Metody LoadFromFile a SaveToFile operujφ pouze s °et∞zci, nebo╗ pracujφ s textov²mi soubory. Pro p°i°azenφ objektu k existujφcφmu °et∞zci p°i°adφme objekt vlastnosti Objects se stejn²m indexem. Nap°. jestli╛e seznam °et∞zc∙ jmΘna Ovoce obsahuje °et∞zec jablko a chceme mu p°i°adit objekt bitovΘ mapy nazvan² JablkoBitmap pou╛ijeme nßsledujφcφ p°φkaz:
    Ovoce->Objects[Ovoce->IndexOf("jablko")] = JablkoBitmap;
    Objekt m∙╛eme takΘ p°idat souΦasn∞ s °et∞zcem. Nap°.
    Ovoce->AddObject("jablko", JablkoBitmap);
    Nelze ale p°idat objekt bez odpovφdajφcφho °et∞zce.
  23. Pokuste se vytvo°it aplikaci, ve kterΘ budete zobrazovat obrßzky bitov²ch map. Zadßte jmΘno souboru bitovΘ mapy, zobrazφte ji a budeme moci zadat zobrazenφ dal╣φ bitovΘ mapy. SouΦasn∞ budete vytvß°et seznam jmen soubor∙ zobrazen²ch bitov²ch map a samotn²ch objekt∙ bitov²ch map (m∙╛eme jej pova╛ovat za seznam historie) a volbou v tomto seznamu op∞t zobrazte p°φslu╣nou bitovou mapu (bez op∞tovnΘho naΦφtßnφ ze souboru). Pozor, ka╛dou bitovou mapu musφme naΦφst na jinΘ mφsto v pam∞ti (vytvo°it pro nφ nov² objekt Image).
2. Prßce se seznamy