[ Pobierz całość w formacie PDF ]
.Jeżeli nazwa zakwalifikowana zostanie do dodania jej do listy, wraz z nią dodawany jest do tejże listy (jako element właściwości Objects[]) obiekt klasy TShellFileListItem, zawierający m.in.indeks ikony (w liście utworzonej na wydruku 7.50) odpowiadającej tej nazwie; umożliwi to późniejsze opatrywanie wypisywanych nazw stosownymi ikonami.Obiekt TShellFileListItem zawiera także kopię parametru wywołania metody AddItem().Kopia ta może zostać wykorzystana do przyszłych rozszerzeń komponentu, np.dla wyświetlenia menu kontekstowego związanego z daną nazwą.UWAGA ODNOŚNIE USTERKI (2)Może właśnie za pomocą wspomnianej kopii uda się naprawić usterkę nr 2; kopia ta zawiera prawdopodobnie pełną nazwę wraz z rozszerzeniem, co można wnioskować po takim fragmencie wydruku 9.51 (w oryginale - str 374): SHGetFileInfo((char*)pidl,.);i wobec tego być może w metodzie DblCLick() fragment:AnsiString str = Items->Strings[ii];ShellExecute(Handle, "open", str.c_str(), 0,0,SW_SHOWDEFAULT);można by zastąpić takim fragmentem:TShellFileListItem *thisSHI = reinterpret cast<TShellFileListItem* >(Items->Objects[ii]);LPITEMIDLIST thisPIDL = thisSHI->pidl;ShellExecute(Handle, "open", (char*)thisPIDL, 0, 0, SW_SHOWDEFAULT);Proszę znawców C++Buildera o zastanowienie się nad tym.Aby przechowywane pod właściwością Objects[] pomocnicze obiekty TShellFileListItem zostały zwolnione w momencie destrukcji listy, konieczne jest przedefiniowanie jej metody DeleteString():Wydruk 7.52.Zwalnianie pozycji listyvoid __fastcall TSHFileListBox::DeleteString(int Index){// pobierz wskaźnik do obiektu pomocniczego i zwolnij ten obiektTShellFileListItem *ShellItem = reinterpret_cast<TShellFileListItem*>(Items->Objects[Index]);delete ShellItem;ShellItem = NULL;// usuń tekst związany z pozycjąItems->Delete(Index);}Wspomnieliśmy przed chwilą, iż wynik zwracany przez metodę AddItem() równy jest szerokości dodawanej do listy pozycji (lub zeru, gdy pozycja nie zostanie dodana).Fakt ten wykorzystywany jest w metodzie ReadFileNames() odpowiedzialnej za skompletowanie listy - po wykonaniu poniższego fragmentu tej metody zmienna l zawiera szerokość najszerszej pozycji, co wykorzystywane jest później do rozstrzygnięcia, czy listę należy wyposażyć w poziomy pasek przewijania:Wydruk 7.53.Obliczanie szerokości zajmowanej przez pozycje listyULONG celt = 1;ULONG Fetched = 0;ppenumIDList->Next(celt, &rgelt, &Fetched);hExtent = 0;while(Fetched > 0){// dodaj pozycję do listyint l = AddItem(rgelt);if(l > hExtent){hExtent = l;}ppenumIDList->Next(celt, &rgelt, &Fetched);}Obliczona szerokość zwiększana jest o dwupikselowy margines, a jeżeli właściwość ShowGlyphs ma wartość true - również o 18 pikseli na ikonę i jej odstęp od tekstu.Tak obliczona wartość przekazywana jest do listy pod postacią komunikatu LB_SETHORIZONTALEXTENT - jeżeli będzie ona większa od szerokości okna listy, u jej dolnej krawędzi automatycznie pojawi się pasek przewijania:Wydruk 7.54.Wyposażenie listy w poziomy pasek przewijaniavoid __fastcall TSHFileListBox::DoHorizontalScrollBar(int he){// dodaj minimalny margineshe += 2;// jeżeli mają być widoczne ikony, dodaj 16 pikseli na ikonę// i 2 piksele na jej odstęp od tekstuif(ShowGlyphs)he += 18;// wyślij komunikat, który w razie potrzeby ustanowi// poziomy pasek przewijaniaPerform(LB_SETHORIZONTALEXTENT, he, 0);}Na tym kończy się repertuar nowych możliwości naszego komponentu.Poniżej przedstawiamy kompletny kod jego modułu źródłowego - znajduje się on również na dołączonej do książki płycie CD-ROM.W związku z opisanymi usterkami poniższe listingi mogą ulec zmianom, należy je więc zweryfikować przed składemWydruk 7.55.SHFileListBox.h - plik nagłówkowy komponentu TSHFileListBox//---------------------------------------------------------------------------#ifndef SHFileListBoxH#define SHFileListBoxH//---------------------------------------------------------------------------#include <SysUtils.hpp>#include <Controls.hpp>#include <Classes.hpp>#include <Forms.hpp>#include <FileCtrl.hpp>#include <StdCtrls.hpp>#include <ShlObj [ Pobierz całość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl matkasanepid.xlx.pl
.Jeżeli nazwa zakwalifikowana zostanie do dodania jej do listy, wraz z nią dodawany jest do tejże listy (jako element właściwości Objects[]) obiekt klasy TShellFileListItem, zawierający m.in.indeks ikony (w liście utworzonej na wydruku 7.50) odpowiadającej tej nazwie; umożliwi to późniejsze opatrywanie wypisywanych nazw stosownymi ikonami.Obiekt TShellFileListItem zawiera także kopię parametru wywołania metody AddItem().Kopia ta może zostać wykorzystana do przyszłych rozszerzeń komponentu, np.dla wyświetlenia menu kontekstowego związanego z daną nazwą.UWAGA ODNOŚNIE USTERKI (2)Może właśnie za pomocą wspomnianej kopii uda się naprawić usterkę nr 2; kopia ta zawiera prawdopodobnie pełną nazwę wraz z rozszerzeniem, co można wnioskować po takim fragmencie wydruku 9.51 (w oryginale - str 374): SHGetFileInfo((char*)pidl,.);i wobec tego być może w metodzie DblCLick() fragment:AnsiString str = Items->Strings[ii];ShellExecute(Handle, "open", str.c_str(), 0,0,SW_SHOWDEFAULT);można by zastąpić takim fragmentem:TShellFileListItem *thisSHI = reinterpret cast<TShellFileListItem* >(Items->Objects[ii]);LPITEMIDLIST thisPIDL = thisSHI->pidl;ShellExecute(Handle, "open", (char*)thisPIDL, 0, 0, SW_SHOWDEFAULT);Proszę znawców C++Buildera o zastanowienie się nad tym.Aby przechowywane pod właściwością Objects[] pomocnicze obiekty TShellFileListItem zostały zwolnione w momencie destrukcji listy, konieczne jest przedefiniowanie jej metody DeleteString():Wydruk 7.52.Zwalnianie pozycji listyvoid __fastcall TSHFileListBox::DeleteString(int Index){// pobierz wskaźnik do obiektu pomocniczego i zwolnij ten obiektTShellFileListItem *ShellItem = reinterpret_cast<TShellFileListItem*>(Items->Objects[Index]);delete ShellItem;ShellItem = NULL;// usuń tekst związany z pozycjąItems->Delete(Index);}Wspomnieliśmy przed chwilą, iż wynik zwracany przez metodę AddItem() równy jest szerokości dodawanej do listy pozycji (lub zeru, gdy pozycja nie zostanie dodana).Fakt ten wykorzystywany jest w metodzie ReadFileNames() odpowiedzialnej za skompletowanie listy - po wykonaniu poniższego fragmentu tej metody zmienna l zawiera szerokość najszerszej pozycji, co wykorzystywane jest później do rozstrzygnięcia, czy listę należy wyposażyć w poziomy pasek przewijania:Wydruk 7.53.Obliczanie szerokości zajmowanej przez pozycje listyULONG celt = 1;ULONG Fetched = 0;ppenumIDList->Next(celt, &rgelt, &Fetched);hExtent = 0;while(Fetched > 0){// dodaj pozycję do listyint l = AddItem(rgelt);if(l > hExtent){hExtent = l;}ppenumIDList->Next(celt, &rgelt, &Fetched);}Obliczona szerokość zwiększana jest o dwupikselowy margines, a jeżeli właściwość ShowGlyphs ma wartość true - również o 18 pikseli na ikonę i jej odstęp od tekstu.Tak obliczona wartość przekazywana jest do listy pod postacią komunikatu LB_SETHORIZONTALEXTENT - jeżeli będzie ona większa od szerokości okna listy, u jej dolnej krawędzi automatycznie pojawi się pasek przewijania:Wydruk 7.54.Wyposażenie listy w poziomy pasek przewijaniavoid __fastcall TSHFileListBox::DoHorizontalScrollBar(int he){// dodaj minimalny margineshe += 2;// jeżeli mają być widoczne ikony, dodaj 16 pikseli na ikonę// i 2 piksele na jej odstęp od tekstuif(ShowGlyphs)he += 18;// wyślij komunikat, który w razie potrzeby ustanowi// poziomy pasek przewijaniaPerform(LB_SETHORIZONTALEXTENT, he, 0);}Na tym kończy się repertuar nowych możliwości naszego komponentu.Poniżej przedstawiamy kompletny kod jego modułu źródłowego - znajduje się on również na dołączonej do książki płycie CD-ROM.W związku z opisanymi usterkami poniższe listingi mogą ulec zmianom, należy je więc zweryfikować przed składemWydruk 7.55.SHFileListBox.h - plik nagłówkowy komponentu TSHFileListBox//---------------------------------------------------------------------------#ifndef SHFileListBoxH#define SHFileListBoxH//---------------------------------------------------------------------------#include <SysUtils.hpp>#include <Controls.hpp>#include <Classes.hpp>#include <Forms.hpp>#include <FileCtrl.hpp>#include <StdCtrls.hpp>#include <ShlObj [ Pobierz całość w formacie PDF ]