<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BBProject.net &#187; alpha</title>
	<atom:link href="http://www.bbproject.net/tag/alpha/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bbproject.net</link>
	<description>Programowanie, webmastering, informatyka</description>
	<lastBuildDate>Tue, 01 Mar 2011 20:35:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>32-bitowe ikony w Delphi</title>
		<link>http://www.bbproject.net/2010/05/32-bitowe-ikony-w-delphi/</link>
		<comments>http://www.bbproject.net/2010/05/32-bitowe-ikony-w-delphi/#comments</comments>
		<pubDate>Tue, 04 May 2010 09:20:19 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[32bit]]></category>
		<category><![CDATA[alpha]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[ikona]]></category>
		<category><![CDATA[timagelist]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=326</guid>
		<description><![CDATA[O ile nowsze edycje środowiska RAD jakim jest Delphi, posiadają pełne wsparcie dla 32-bitowych ikon czy nawet plików PNG, o tyle w starszych edycjach ich użycie jest mocno ograniczone. Jedyną opcją wykorzystania ikony z kanałem alpha jest wstawienie komponentu TImage i załadowanie do niego pliku ikony. Co jeśli chcemy użyć przeźroczystego obrazka w menu, pasku [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-327 alignright" title="Delphi - Form1" src="http://www.bbproject.net/wp-content/uploads/2010/05/delphi_form-160x132.png" alt="" width="160" height="132" />O ile nowsze edycje środowiska RAD jakim jest Delphi, posiadają pełne wsparcie dla 32-bitowych ikon czy nawet plików PNG, o tyle w starszych edycjach ich użycie jest mocno ograniczone.</p>
<p>Jedyną opcją wykorzystania ikony z kanałem alpha jest wstawienie komponentu <em>TImage</em> i załadowanie do niego pliku ikony. Co jeśli chcemy użyć przeźroczystego obrazka w menu, pasku narzędzi czy zakładce? Tutaj jedynym komponentem który nam to umożliwia jest <em>TImageList</em>, który niestety gubi informacje o kolorach powyżej 24 bitów.</p>
<p>W tym wpisie pokaże jak sobie z tym poradzić i mimo to użyć ładnych plików ikon w naszych aplikacjach.</p>
<p><span id="more-326"></span>Rozwiązanie z racji stosowania pewnego tricku ma pewną wadę. Wszystkie zasoby do <em>TImageList</em> musimy ładować w trakcie działania aplikacji a nie na etapie projektowania &#8211; innymi słowy, musimy osobno do pliku wykonywalnego dołączać pliki ikon których użyjemy.</p>
<p><img class="alignright size-full wp-image-328" title="ImageIndex" src="http://www.bbproject.net/wp-content/uploads/2010/05/imageindex.png" alt="" width="238" height="98" />Drugą niewygodą, która jest następstwem pierwszej, jest fakt że przypisując konkretnemu elementowi <em>ImageIndex</em> musimy wpisać go nie widząc załadowanej ikony &#8211; wymusza to nas nas ładowanie ikon zawsze w tej samej kolejności i trzymania pozycji danego obrazka zawsze pod tym samym numerkiem.</p>
<p style="text-align: center;">
<p>Są to pewne wady który uprzykrzają proces pisania programu, ale jak to mówią, coś za coś.</p>
<p>Przejdźmy zatem do czynów. Mając umieszczony na formie <em>TImageList</em> musimy go dostosować do przyjmowania 32-bitowych ikon. Skorzystajmy z tej oto procedury:</p>
<pre class="brush: delphi">procedure ConvertTo32BitImageList(ImageList: TImageList);
const
  MASK: array[Boolean] of Longint = (0, ILC_MASK);
var
  templist: TImageList;
begin
  if Assigned(ImageList) then
  begin
    templist := TImageList.Create(nil);
    try
      templist.Assign(ImageList);
      with ImageList do
      begin
        Handle := ImageList_Create(Width, Height, ILC_COLOR32 or MASK[Masked], 0, AllocBy);
        if not HandleAllocated then
          raise EInvalidOperation.Create(SInvalidImageList);
      end;
      Imagelist.AddImages(templist);
    finally
      FreeAndNil(templist);
    end;
  end;
end;</pre>
<p>Po skonwertowaniu listy obrazów (pustej), możemy zacząć dodawać nasze zasoby. Dla ułatwienia możemy skorzystać z tej procedury:</p>
<pre class="brush: delphi">procedure AddIconTo32BitImageList(ImageList: TImageList; const FileName: String);
var
  icon: TIcon;
  stream: TFileStream;
begin
  icon := TIcon.Create;
  stream := TFileStream.Create(FileName, fmOpenRead);
  icon.LoadFromStream(stream);
  ImageList.AddIcon(icon);
  icon.Free;
  stream.Free;
end;</pre>
<p>Jak widać, powyższa procedura przyjmuje 2 parametry, komponent <em>TImageList</em> oraz ścieżkę do ikony którą chcemy dodać. Należy pamiętać o tym aby skonfigurować odpowiednio listę obrazów do naszych potrzeb &#8211; ustawić wymiar ikon.</p>
<p>Przykładowe użycie powyższej metody:</p>
<pre class="brush: delphi">procedure TForm1.FormCreate(Sender: TObject);
begin
  ImageList1.Clear;
  ConvertTo32BitImageList(ImageList1);
  AddIconTo32BitImageList(ImageList1, 'data\open.ico');
  AddIconTo32BitImageList(ImageList1, 'data\save.ico');
  AddIconTo32BitImageList(ImageList1, 'data\exit.ico');
end;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/05/32-bitowe-ikony-w-delphi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

