<?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; Programowanie</title>
	<atom:link href="http://www.bbproject.net/category/programowanie/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>Co to jest Sender w procedurach zdarzeń?</title>
		<link>http://www.bbproject.net/2010/06/co-to-jest-sender-w-procedurach-zdarzen/</link>
		<comments>http://www.bbproject.net/2010/06/co-to-jest-sender-w-procedurach-zdarzen/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 03:22:06 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[sender]]></category>
		<category><![CDATA[zdarzenie]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=380</guid>
		<description><![CDATA[Mały wpis dla początkujących programistów Delphi. Co to jest i do czego służy parametr Sender, występujący niemal zawsze przy procedurach zdarzeń (np.: naciśnięcia przycisku)? W skrócie, jest to wskaźnik na obiekt który wywołuje dane zdarzenie. Jeśli widzimy to w zdarzeniu OnClick przycisku, to jest to właśnie wskaźnik na ten przycisk (oczywiście trzeba go rzutować na [...]]]></description>
			<content:encoded><![CDATA[<p>Mały wpis dla początkujących programistów Delphi. Co to jest i do czego służy parametr <em>Sender</em>, występujący niemal zawsze przy procedurach zdarzeń (np.: naciśnięcia przycisku)?</p>
<p>W skrócie, jest to wskaźnik na obiekt który wywołuje dane zdarzenie. Jeśli widzimy to w zdarzeniu <em>OnClick</em> przycisku, to jest to właśnie wskaźnik na ten przycisk (oczywiście trzeba go rzutować na <em>TButton</em> aby odnieść się do jego własności).</p>
<p><span id="more-380"></span>Ktoś może zapytać, po co mi coś takiego, skoro dobrze wiem które zdarzenie przypisane jest któremu przyciskowi? Ano po to, że istnieje możliwość przypisania tego samego zdarzenia kilku obiektom, a nie tylko jednemu.</p>
<p>Weźmy prosty przykład, mam na formie 3 przyciski o różnych etykietach. Załóżmy że chcę, po kliknięciu w każdy z nich, aby na belce okna wyświetlała się etykieta tego klikniętego. W tradycyjnym podejściu należało by oprogramować 3 zdarzenia kliknięcia. My zrobimy to w jednym, wykorzystując parametr <em>Sender</em>, oraz przypisując owe zdarzenie do wszystkich przycisków:</p>
<pre class="brush: delphi">procedure TForm1.ButtonClick(Sender: TObject);
begin
  Caption := TButton(Sender).Caption;
end;
</pre>
<p>I to już wszystko! Przy pierwszym przycisku utworzyłem nowy event (zmieniając nieco jego nazwę), przy kolejnych wybrałem go z rozwijanej listy dla zdarzenia <em>OnClick</em>. Szybko, łatwo i bez zbędnego kodu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/06/co-to-jest-sender-w-procedurach-zdarzen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Magiczne stałe PHP</title>
		<link>http://www.bbproject.net/2010/06/magiczne-stale-php/</link>
		<comments>http://www.bbproject.net/2010/06/magiczne-stale-php/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 08:55:09 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[magiczne]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[stała]]></category>
		<category><![CDATA[stałe]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=370</guid>
		<description><![CDATA[Stałe noszące miano „magicznych” w języku PHP to zbiór stałych które posiadają przedefiniowaną i niezmienną wartość, jednak jest ona określona jedynie w obrębie wykonywania danego skryptu. Oznacza to że w przypadku innego pliku wartości poszczególnych stałych będą inne. Mało tego, niektóre z nich mogą zmieniać swą zawartość w zależności od miejsca wywołania (np.: wew. funkcji [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-371" title="Magiczny kapelusz" src="http://www.bbproject.net/wp-content/uploads/2010/06/magic_hat-160x160.png" alt="" width="160" height="160" />Stałe noszące miano „magicznych” w języku PHP to zbiór stałych które posiadają przedefiniowaną i niezmienną wartość, jednak jest ona określona jedynie w obrębie wykonywania danego skryptu.</p>
<p>Oznacza to że w przypadku innego pliku wartości poszczególnych stałych będą inne. Mało tego, niektóre z nich mogą zmieniać swą zawartość w zależności od miejsca wywołania (np.: wew. funkcji czy metody klasy).</p>
<p>Owe „magic constans” są jednak bardzo przydatne w programowaniu w PHP i każdy powinien je znać, aby niepotrzebnie nie wynajdywać od nowa przysłowiowego koła. Zapraszam do zapoznania się z nimi.</p>
<p><span id="more-370"></span>Dla każdej poniższej stałej, został dołączony przykład użycia wraz z wynikiem wykonania danego kodu.</p>
<h4>__LINE__</h4>
<p>Zawiera numer linii pliku skryptu, w której została użyta ta stała.</p>
<pre class="brush: php">echo __LINE__;</pre>
<pre>2</pre>
<h4>__FILE__</h4>
<p>Przechowuje bezwzględną ścieżkę do pliku skryptu który jest wykonywany.</p>
<pre class="brush: php">echo __FILE__;</pre>
<pre>G:\Server\www\~dev\magicconstants.php</pre>
<h4>__DIR__</h4>
<p>Przechowuje bezwzględną ścieżkę do folderu skryptu który jest wykonywany (bez slasha na końcu jeśli nie jest to folder główny &#8211; root). Stała ta dostępna jest począwszy od wersji PHP 5.3.0.</p>
<pre class="brush: php">echo __DIR__;</pre>
<pre>G:\Server\www\~dev</pre>
<h4>__FUNCTION__</h4>
<p>Nazwa funkcji w której użyta została stała.</p>
<pre class="brush: php">function test_function()
{
  return __FUNCTION__;
}
echo test_function();</pre>
<pre>test_function</pre>
<h4>__CLASS__, __METHOD__</h4>
<p>Pierwsza z stałym zwraca nazwę klasy obiektu w którym została użyta. Druga natomiast, dodaje do tego ciągu dodatkowo nazwę wywołanej metody owej klasy.</p>
<pre class="brush: php">class test_obj
{
  public function test_class()
  {
    return __CLASS__;
  }
  public function test_method()
  {
    return __METHOD__;
  }
}
$test_obj = new test_obj();
echo $test_obj-&gt;test_class()."\n";
echo $test_obj-&gt;test_method();</pre>
<pre>test_obj
test_obj::test_method</pre>
<h4>__NAMESPACE__</h4>
<p>Nazwa aktualnej przestrzeni nazw &#8211; jednej z głównej nowości w PHP 5.3.0.</p>
<pre class="brush: php">namespace test_namespace;
echo __NAMESPACE__;</pre>
<pre>test_namespace</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/06/magiczne-stale-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Podświetlanie składni PHP</title>
		<link>http://www.bbproject.net/2010/06/podswietlanie-skladni-php/</link>
		<comments>http://www.bbproject.net/2010/06/podswietlanie-skladni-php/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 08:23:00 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[highlight]]></category>
		<category><![CDATA[highlight_file]]></category>
		<category><![CDATA[highlight_string]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[składnia]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=368</guid>
		<description><![CDATA[Szybki wpis pod tytułem, jak podświetlić składnię języka PHP w samym PHP. Sprawa jest dziecinnie prosta, i sprowadza się do użycia jednej z dwóch wbudowanych funkcji samego języka: mixed highlight_string  (  string $str  [,  bool $return = false  ] ) &#8230;lub: mixed highlight_file  (  string $filename  [,  bool $return = false  ] ) Pierwsza koloruje [...]]]></description>
			<content:encoded><![CDATA[<p>Szybki wpis pod tytułem, jak podświetlić składnię języka PHP w samym PHP. Sprawa jest dziecinnie prosta, i sprowadza się do użycia jednej z dwóch wbudowanych funkcji samego języka:</p>
<pre>mixed <a href="http://pl2.php.net/manual/en/function.highlight-string.php"><strong>highlight_string</strong></a>  (  string $str  [,  bool $return = false  ] )</pre>
<p>&#8230;lub:</p>
<pre>mixed <a href="http://pl2.php.net/manual/en/function.highlight-file.php"><strong>highlight_file</strong></a>  (  string $filename  [,  bool $return = false  ] )</pre>
<p>Pierwsza koloruje i wyróżnia składnię w zadanym ciągu znaków, druga z kolei w podanym pliku. Prosty przykład demonstrujący działanie:</p>
<pre class="brush: php">&lt;?php
  $var = 'Ten skrypt PHP podswietla skladnie samego siebie';
  $num = 1024;
  highlight_file(__FILE__);
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/06/podswietlanie-skladni-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moje najdziwniejsze programy</title>
		<link>http://www.bbproject.net/2010/06/moje-najdziwniejsze-programy/</link>
		<comments>http://www.bbproject.net/2010/06/moje-najdziwniejsze-programy/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 10:46:28 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Projekty]]></category>
		<category><![CDATA[edytor]]></category>
		<category><![CDATA[gra]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[modyfikacja]]></category>
		<category><![CDATA[poziom]]></category>
		<category><![CDATA[program]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=356</guid>
		<description><![CDATA[Z programowaniem, jak z każdą inną twórczością, jedne rzeczy wychodzą lepiej, inne gorzej, jeszcze inne lądują w koszu nie ujrzawszy nigdy światła dziennego. Chciałbym się dziś z Wami podzielić moimi najdziwniejszymi programami jakie udało mi się stworzyć a które z różnych względów nie zostały nigdzie opublikowane, bądź znikły z uwagi na ich wiek. Główna przyczyna [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-367 alignright" title="Samo zniszczenie" src="http://www.bbproject.net/wp-content/uploads/2010/05/selfdestruct-160x141.jpg" alt="" width="160" height="141" />Z programowaniem, jak z każdą inną twórczością, jedne rzeczy wychodzą lepiej, inne gorzej, jeszcze inne lądują w koszu nie ujrzawszy nigdy światła dziennego.</p>
<p>Chciałbym się dziś z Wami podzielić moimi najdziwniejszymi programami jakie udało mi się stworzyć a które z różnych względów nie zostały nigdzie opublikowane, bądź znikły z uwagi na ich wiek. Główna przyczyna tego stanu rzeczy? Bardzo wąska specjalizacja bądź też typowo prywatny cel stworzenia czegoś, co ułatwia mi codzienną pracę przy komputerze.</p>
<p>Zapnijcie zatem pasy i nie próbujcie tego w domu <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_wink.png' alt=';)' class='wp-smiley' /> .</p>
<p><span id="more-356"></span></p>
<h4>Bot Routes Editor</h4>
<p>Zdecydowany lider, niedościgniony wzór i autorytet w dziedzinie najbardziej specjalizowanej aplikacji jaka wyszła spod mojej ręki. Cóż to takiego?</p>
<p>Bot Routes Editor to narzędzie służące do optymalizacji i naprawiania konfiguracji ścieżek botów dla moda (!) do gry Soldier of Fortune II.</p>
<p style="text-align: center;"><a href="http://www.bbproject.net/wp-content/uploads/2010/05/bre_01.png"><img class="alignnone size-medium wp-image-361" title="Bot Routes Editor" src="http://www.bbproject.net/wp-content/uploads/2010/05/bre_01-256x216.png" alt="" width="256" height="216" /></a> <a href="http://www.bbproject.net/wp-content/uploads/2010/05/bre_02.png"><img class="alignnone size-medium wp-image-362" title="Bot Routes Editor" src="http://www.bbproject.net/wp-content/uploads/2010/05/bre_02-256x216.png" alt="" width="256" height="216" /></a></p>
<p>Swego czasu byłem zapalonym fanem tej gry. Wraz z przyjacielem bardzo często korzystaliśmy z pewnego moda który dodawał obsługę CPU w grach multiplayer. Aby boty mogły działać należało stworzyć im tzw. ścieżki. Jako że przykładałem się do tego aż za bardzo, mod ten nie wytrzymywał ilości punktów i po prostu się wieszał. I tutaj z pomocą przychodził mój program, który analizował oraz wyszukiwał zbędne punktu, usuwał je, łączył odpowiednio ścieżki i zapisywał poprawiony plik.</p>
<p>Prawdopodobieństwo że komuś innemu przydała by się ta aplikacja było niemal zerowe.</p>
<h4>TGAStudio</h4>
<p>Kolejny program związany z grą i jej edycją. Tym razem sprawa tyczy się gry Tomb Raider, a konkretnie czasów w których zaczęły pojawiać się pierwsze nieoficjalne edytory do tejże gry, wraz z aplikacją Room Edit &#8211; oficjalnym edytorem dostarczonym wraz z premierą Tomb Raider Chronicles (piąta część gry).</p>
<p>Do czego służy TGAStudio? Wbrew pozorom nie do tworzenia poziomów do Tomb Raider&#8217;a. Jego zadaniem jest ułatwienie kompletowania zestawu tekstur który następnie wykorzystuje się w edytorze leveli.</p>
<p style="text-align: center;"><a href="http://www.bbproject.net/wp-content/uploads/2010/05/tgastudio_01.png"><img class="alignnone size-medium wp-image-363" title="TGAStudio" src="http://www.bbproject.net/wp-content/uploads/2010/05/tgastudio_01-256x292.png" alt="" width="256" height="292" /></a> <a href="http://www.bbproject.net/wp-content/uploads/2010/05/tgastudio_02.png"><img class="alignnone size-medium wp-image-364" title="TGAStudio" src="http://www.bbproject.net/wp-content/uploads/2010/05/tgastudio_02-256x292.png" alt="" width="256" height="292" /></a></p>
<p>Program umożliwia nie tylko zwykłe kopiowanie pojedynczych tekstur między dwoma ich pakietami, ale również potrafi wyciągać je bezpośrednio z etapów gry. Do dyspozycji użytkownika oddane zostało kilkadziesiąt efektów graficznych oraz narzędzi do korekcji grafiki.</p>
<p>W latach swojej świetności (rok 2002) posiadał całkiem spore grono użytkowników zarówno w Polsce jak i na świecie, gdzie społeczność skupiona wokoło tworzenia poziomów była bardzo rozwinięta.</p>
<h4>Analizator WLAN</h4>
<p>Aplikacja której zadaniem było „podpinanie” się do programu zarządzającego kartą sieci bezprzewodowej i wyciąganie aktualnej siły sygnału.</p>
<p style="text-align: center;"><a href="http://www.bbproject.net/wp-content/uploads/2010/05/awlan_01.png"><img class="alignnone size-medium wp-image-365" title="Analizator WLAN" src="http://www.bbproject.net/wp-content/uploads/2010/05/awlan_01-256x155.png" alt="" width="256" height="155" /></a> <a href="http://www.bbproject.net/wp-content/uploads/2010/05/awlan_02.png"><img class="alignnone size-medium wp-image-366" title="Analizator WLAN" src="http://www.bbproject.net/wp-content/uploads/2010/05/awlan_02-256x155.png" alt="" width="256" height="155" /></a></p>
<p style="text-align: center;">
<p>Analizator WLAN przedstawiał siłę sygnału w postaci ładnego wykresu, ale co najważniejsze, umożliwiał ustawienie alarmu dźwiękowego w sytuacji w której poziom sygnału wzrastał powyżej określonej wartości (plus ew. warunek czasu przejścia pakietu). Po co to? Używałem go podczas manewrowania z anteną sieci ad-hoc. Jako że antena była w znacznej odległości od komputera (na dachu), nie byłem w stanie optycznie stwierdzić kiedy „trafiłem” w punkt odbioru <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_smile.png' alt=':)' class='wp-smiley' /> . Stąd też pomysł na taką aplikację.</p>
<p>Aplikacja obsługiwała kilka, najpopularniejszych na owe czasy, programów narzędziowych do kart WLAN.</p>
<h4>Podsumowanie</h4>
<p>To nie koniec, był jeszcze inne twory, jak program do optymalizacji rozmiaru poziomów do gry Tomb Raider, konwerter leveli Tomb Raider do Soldier of Fortune II a na edytorze zapisanych stanów gry skończywszy.</p>
<p>Większość kręciła się wokoło modyfikacji takiej czy innej gry. Zapał programistyczny przekłada się na inne dziedziny, stąd też moje duże zainteresowanie tworzeniem etapów czy przeróżnych modyfikacji a w związku z tym narzędzi wspomagających.</p>
<p>W każdej jednak sytuacji sprawdziło się powiedzenie: „potrzeba matką wynalazków” <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_smile.png' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/06/moje-najdziwniejsze-programy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optymalizacja działań matematycznych w Delphi</title>
		<link>http://www.bbproject.net/2010/06/optymalizacja-dzialan-matematycznych-w-delphi/</link>
		<comments>http://www.bbproject.net/2010/06/optymalizacja-dzialan-matematycznych-w-delphi/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 05:29:36 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<category><![CDATA[potęgowanie]]></category>
		<category><![CDATA[power]]></category>
		<category><![CDATA[sqr]]></category>
		<category><![CDATA[sqrt]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=353</guid>
		<description><![CDATA[Mnożenie, potęgowanie, pierwiastkowanie, wszystkie te operacje trwają ułamek sekundy na obecnych maszynach, ułamek sekundy do czasu gdy nie musimy wykonać tysięcy czy miliony iteracji danego działania. W takiej sytuacji odpowiedni dobór użytych funkcji może mieć duży wpływ na czas trwania całej operacji. W tym wpisie pokaże jakich błędów unikać pisząc w Delphi skomplikowane działania, aby [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-354 alignleft" title="Sqrt" src="http://www.bbproject.net/wp-content/uploads/2010/05/sqrt-160x87.png" alt="" width="160" height="87" />Mnożenie, potęgowanie, pierwiastkowanie, wszystkie te operacje trwają ułamek sekundy na obecnych maszynach, ułamek sekundy do czasu gdy nie musimy wykonać tysięcy czy miliony iteracji danego działania. W takiej sytuacji odpowiedni dobór użytych funkcji może mieć duży wpływ na czas trwania całej operacji.</p>
<p>W tym wpisie pokaże jakich błędów unikać pisząc w Delphi skomplikowane działania, aby nie marnować czasu użytkownika końcowego naszej aplikacji. Do dzieła!</p>
<p><span id="more-353"></span></p>
<h4>Stałe</h4>
<p>Zacznijmy od rzeczy najprostszej, wykluczania operacji których wynik jest zawsze taki sam. Głupota? Prosty przykład, obliczenia w których występuje liczba PI podniesiona do kwadratu. Wartość tego wyrażenia jest zawsze taka sama, gdyż PI wynosi zawsze tyle samo.</p>
<pre class="brush: delphi">procedure TForm1.Button1Click(Sender: TObject);
var
  k: Double;
begin
  k := GetTickCount * Sqr(PI) + 4;
end;</pre>
<p>W takiej sytuacji zamiast podnosić 3,14 za każdym razem do kwadratu, najlepiej wyliczyć sobie tą wartość chociażby na systemowym kalkulatorze i zadeklarować nową stałą. Rzecz jasna, jak wcześniej wspomniałem, ma to sens tylko gdy wykonujemy naprawdę dużo obliczeń &#8211; inaczej jest to sztuka dla sztuki.</p>
<pre class="brush: delphi">procedure TForm1.Button1Click(Sender: TObject);
const
  PI_2 = 9.8696044010893586188344909998762;
var
  k: Double;
begin
  k := GetTickCount * PI_2 + 4;
end;
</pre>
<h4>Unikanie dzielenia</h4>
<p>Swego czasu, wyczytałem iż lepiej jest przykładowo mnożyć razy 0,5 niż dzielić przez 2. Próbowałem potwierdzić to różnymi testami, ale za każdym razem dostawałem identyczny wynik. Strzelam że obecne procesory lepiej sobie radzą z dzieleniem w stosunku do mnożenia liczb zmiennoprzecinkowych niż kiedyś.</p>
<p>Dlatego też porada ta nie ma dzisiaj większego sensu, ale warto o niej pamiętać.</p>
<h4>Power, Sqr, Sqrt</h4>
<p>Funkcja <em>Power</em>, analogicznie do swojej nazwy kryje w sobie dużą moc <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_wink.png' alt=';)' class='wp-smiley' /> , nie mniej, należy się jej wystrzegać jak ognia. <em>Power</em> przyjmuje 2 argumenty, pierwszym jest liczba którą chcemy podnieść do potęgi, a drugim wykładnik potęgi.</p>
<p>Daje to ogromne możliwości z uwagi na fakt iż jest to liczba zmiennoprzecinkowa. Nie mniej, w sytuacji w której podnosimy liczbę do potęgi drugiej, bądź wyciągamy pierwiastek stopnia drugiego bezwzględnie stosujmy funkcje <em>Sqr</em> oraz <em>Sqrt</em>. Pierwiastek 4 stopnia? Zagnieżdżone dwie funkcję <em>Sqrt</em> będą na pewno szybsze niż jeden <em>Power</em>.</p>
<p>Oto małe porównanie szybkości wykonywania się poszczególnych operacji:</p>
<table>
<tbody>
<tr>
<th>Funkcja</th>
<th>Czas wykonania</th>
</tr>
<tr>
<td>Sqr(x)</td>
<td>0,0547ms</td>
</tr>
<tr>
<td>Sqrt(x)</td>
<td>0,6396ms</td>
</tr>
<tr>
<td>Power(x, 2)</td>
<td>0,8642ms</td>
</tr>
<tr>
<td>Power(x, 0.5)</td>
<td>3,9702ms</td>
</tr>
</tbody>
</table>
<p>I na koniec wynik testu z pierwiastkiem czwartego stopnia:</p>
<table>
<tbody>
<tr>
<th>Funkcja</th>
<th>Czas wykonania</th>
</tr>
<tr>
<td>Sqrt(Sqrt(x))</td>
<td>1,7472ms</td>
</tr>
<tr>
<td>Power(x, 0.25)</td>
<td>4,5896ms</td>
</tr>
</tbody>
</table>
<h4>Podsumowanie</h4>
<p>Liczę że te kilka porad pozwoli Wam na optymalizację wielokrotnie wykonywanych działań matematycznych w Delphi. Oczywiście należy też pamiętać o doprowadzeniu danego równania do jak najprostszej postaci przed przystąpieniem do implementacji w programie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/06/optymalizacja-dzialan-matematycznych-w-delphi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Facebook&#8217;owy model promocji gier</title>
		<link>http://www.bbproject.net/2010/05/facebookowy-model-promocji-gier/</link>
		<comments>http://www.bbproject.net/2010/05/facebookowy-model-promocji-gier/#comments</comments>
		<pubDate>Wed, 26 May 2010 11:41:50 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Rozrywka]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[farmville]]></category>
		<category><![CDATA[gra]]></category>
		<category><![CDATA[promocja]]></category>
		<category><![CDATA[social city]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=348</guid>
		<description><![CDATA[Ostatnimi czasy kieruje swoje moce twórcze bardziej w kierunku aplikacji a niżeli gier, nie mniej chciałbym przedstawić, a w zasadzie opisać, bardzo ciekawy model promocji gier jaki zastosowano w portalu społecznościowym Facebook. Starając się latami wypromować swój projekt Enemy Flag, po tym co zobaczyłem na 2 przykładowych grach w tym portalu, przeszła mi przez głowę [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-349" title="FarmVille" src="http://www.bbproject.net/wp-content/uploads/2010/05/farmville_logo-160x60.jpg" alt="" width="160" height="60" />Ostatnimi czasy kieruje swoje moce twórcze bardziej w kierunku aplikacji a niżeli gier, nie mniej chciałbym przedstawić, a w zasadzie opisać, bardzo ciekawy model promocji gier jaki zastosowano w portalu społecznościowym <a href="http://www.facebook.com">Facebook</a>.</p>
<p>Starając się latami wypromować swój projekt <a href="http://www.enemyflag.net">Enemy Flag</a>, po tym co zobaczyłem na 2 przykładowych grach w tym portalu, przeszła mi przez głowę tylko jedna myśl: „czemu wcześniej na to nie wpadłem?”.</p>
<p><span id="more-348"></span>Założenie jest bardzo proste, <strong>pozyskiwanie nowych graczy jest warunkiem do rozwoju w rozgrywce</strong>. Weźmy na przykładzie bardzo popularnego FarmVille czy Social City. W celu powiększenia swojego terytorium, musimy posiadać „sąsiadów”, których werbujemy wysyłając zaproszenia do znajomych na Facebook&#8217;u. Czyż to nie jest genialne?</p>
<p style="text-align: center;"><a href="http://www.bbproject.net/wp-content/uploads/2010/05/farmville.jpg"><img class="alignnone size-large wp-image-350" title="FarmVille" src="http://www.bbproject.net/wp-content/uploads/2010/05/farmville-512x404.jpg" alt="" width="512" height="404" /></a><br />
<em>FarmVille</em></p>
<p>Drugim czynnikiem, podnoszącym zyski autorów gry, jest wirtualna, dodatkowa waluta którą zdobywamy za każdy następny poziom jaki osiągniemy, bądź kupując za żywą gotówkę. Osobiście nie przepadam za tego typu rozwiązaniami, gdyż prawdę mówiąc sprowadza się to do sytuacji w której gracz z kasą po prostu zyskuje przewagę. Mechanizm ten wiąże się z w/w sposobem pozyskiwania sąsiadów. Powiększenie terenu gry następuje albo przy pomocy werbowania nowych graczy lub zakupu jej za wirtualną walutę &#8211; autorzy gry zyskują albo korzyści finansowe, albo nowych graczy.</p>
<p style="text-align: center;"><a href="http://www.bbproject.net/wp-content/uploads/2010/05/socialcity.jpg"><img class="alignnone size-large wp-image-351" title="Social City" src="http://www.bbproject.net/wp-content/uploads/2010/05/socialcity-512x437.jpg" alt="" width="512" height="437" /></a><br />
<em>Social City</em></p>
<p>Zastosowanie tego typu mechanizmu (z umiarem) ma całkiem wymierne korzyści zarówno dla twórcy gry, jak i samych graczy. Rzecz jasna aby to wszystko się kręciło, gra musi się podobać, inaczej możemy zapomnieć o polecaniu jej przez graczy.</p>
<p>Paradoksalnie, sam ten wpis jest spełnieniem jednej z woli twórców obu gier <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_wink.png' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/05/facebookowy-model-promocji-gier/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Czym różni się TTabControl od TPageControl?</title>
		<link>http://www.bbproject.net/2010/05/czym-rozni-sie-ttabcontrol-od-tpagecontrol/</link>
		<comments>http://www.bbproject.net/2010/05/czym-rozni-sie-ttabcontrol-od-tpagecontrol/#comments</comments>
		<pubDate>Sat, 22 May 2010 19:42:20 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[komponent]]></category>
		<category><![CDATA[tpagecontrol]]></category>
		<category><![CDATA[ttabcontrol]]></category>
		<category><![CDATA[zakładki]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=340</guid>
		<description><![CDATA[Oba są komponentami do tworzenia zakładek w środowisku Delphi. Czym się różnią? Zasadą organizacji treści i związanym z tym zastosowaniem. TTabControl to komponent w którym operujemy na samych zakładkach, z kolei TPageControl zarządza całymi stronami wraz z przypisaną do nich zawartością. W TTabControl cała umieszczona zawartość na komponencie jest wspólna dla wszystkich zakładek. Po co [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-344" title="Delphi - Komponenty Win32" src="http://www.bbproject.net/wp-content/uploads/2010/05/delphi_win32_components.png" alt="" width="239" height="111" />Oba są komponentami do tworzenia zakładek w środowisku Delphi. Czym się różnią? Zasadą organizacji treści i związanym z tym zastosowaniem.</p>
<p><strong><em>TTabControl</em></strong> to komponent w którym operujemy na samych zakładkach, z kolei <strong><em>TPageControl</em></strong> zarządza całymi stronami wraz z przypisaną do nich zawartością.</p>
<p>W <em>TTabControl</em> cała umieszczona zawartość na komponencie jest<strong> wspólna dla wszystkich zakładek</strong>. Po co nam coś takiego? Otóż w sytuacji w której zmieniają się jedynie dane między zakładkami a nie cały układ komponentów. Załóżmy że mamy naniesiony na owym komponencie wykres wraz z kilkoma przyciskami do jego zarządzania. Na każdej zakładce chcemy zatem mieć te same elementy a zmieniać jedynie zawartość wykresu i akcję przycisków. Możemy to uczynić przy pomocy zdarzenia <em>OnChange</em>.</p>
<p><span id="more-340"></span>Dodatkowo, w bardzo łatwy sposób możemy dynamicznie (lub na etapie projektowania) zmieniać ilość zakładek dzięki właściwości <em>Tabs</em> będącej typu <em>TStrings</em>.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-341" title="TTabControl - edycja zakładek" src="http://www.bbproject.net/wp-content/uploads/2010/04/ttabcontrol_tabs.png" alt="" width="445" height="315" /></p>
<p>W opozycji do w/w komponentu, <em>TPageControl</em> posiada <strong>unikalną zawartość każdej zakładki</strong>. Jest to wygodne w sytuacji w której chcemy umieścić różne komponenty na każdej stronie.</p>
<p>Kolejne zakładki dodajemy w równie łatwy sposób na etapie projektowania. Są one w odróżnieniu od <em>TPageControl</em> osobnymi komponentami klasy <em>TTabSheet</em> a nie jedynie wpisem na liście.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-342" title="TPageControl - dodawanie zakładki" src="http://www.bbproject.net/wp-content/uploads/2010/04/tpagecontrol_tabs.png" alt="" width="303" height="207" /></p>
<p>Komponent ten stosujemy wszędzie tam gdzie każda strona ma inną zawartość, np.: kategorie opcji programu.</p>
<p>Liczę że ten mały poradnik pomoże wszystkich początkującym programistom dostrzec różnicę między tymi komponentami i wybrać ten właściwy, którego w danej sytuacji potrzebują.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/05/czym-rozni-sie-ttabcontrol-od-tpagecontrol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>myTinyTodo</title>
		<link>http://www.bbproject.net/2010/05/mytinytodo/</link>
		<comments>http://www.bbproject.net/2010/05/mytinytodo/#comments</comments>
		<pubDate>Tue, 18 May 2010 08:04:29 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Recenzje]]></category>
		<category><![CDATA[lista zadań]]></category>
		<category><![CDATA[mytinytodo]]></category>
		<category><![CDATA[todo]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=357</guid>
		<description><![CDATA[Dzisiaj propozycja skryptu dla ludzi szukających prostej i funkcjonalnej listy TODO, którzy nie potrzebują narzędzi aż tak rozbudowanych jak chociażby Trac. Prawdę mówiąc długo szukałem czegoś takiego, aż w końcu natrafiłem na myTinyTodo. Jest to prosta, przejrzysta i łatwa w obsłudze lista rzeczy do zrobienia, możliwa do wykorzystania zarówno przez programistów jak i przez każdą [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-359 alignright" title="TODO" src="http://www.bbproject.net/wp-content/uploads/2010/05/todo-160x170.jpg" alt="" width="160" height="170" />Dzisiaj propozycja skryptu dla ludzi szukających prostej i funkcjonalnej <strong>listy TODO</strong>, którzy nie potrzebują narzędzi aż tak rozbudowanych jak chociażby <a href="http://trac.edgewall.org">Trac</a>.</p>
<p>Prawdę mówiąc długo szukałem czegoś takiego, aż w końcu natrafiłem na <strong><a href="http://www.mytinytodo.net">myTinyTodo</a></strong>. Jest to prosta, przejrzysta i łatwa w obsłudze lista rzeczy do zrobienia, możliwa do wykorzystania zarówno przez programistów jak i przez każdą inną osobę tworzącą jakieś dzieło (na haftowaniu obrusów skończywszy).</p>
<p>To tyle słowem wstępu, zapraszam do krótkiej recenzji tego malutkiego, acz potężnego wynalazku.</p>
<p><span id="more-357"></span>Zacznijmy od początku, czyli drobnej reklamy ze strony autora myTinyTodo, co oferuje nam owy skrypt:</p>
<ul>
<li>wielokrotne listy</li>
<li>notatki do zadań</li>
<li>tagi (i chmurę tagów)</li>
<li>określanie daty (dowolny format)</li>
<li>priorytety</li>
<li>sortowanie metodą przeciągnij i upuść</li>
<li>wyszukiwanie</li>
<li>ochrona hasłem</li>
<li>inteligentną składnię podczas dodawania nowych zadań</li>
<li>przyjazne wydrukom style CSS</li>
<li>style dla urządzeń przenośnych</li>
</ul>
<p>I rzeczywiście, myTinyTodo oferuje to wszystko. Dodatkowo, cały mechanizm działa bez ani jednego przeładowania strony &#8211; całość przy pomocy techniki <strong>AJAX</strong>.</p>
<p style="text-align: center;"><a href="http://www.bbproject.net/wp-content/uploads/2010/05/mytinytodo.png"><img class="alignnone size-large wp-image-358" title="myTinyTodo" src="http://www.bbproject.net/wp-content/uploads/2010/05/mytinytodo-512x309.png" alt="" width="512" height="309" /></a></p>
<p>Zadania przechowywane są w bazie <strong>SQLite</strong>, dzięki czemu nie musimy instalować bazy MySQL jeśli uruchamiamy skrypt na lokalnym serwerze. Aczkolwiek, obsługa MySQL&#8217;a jest również dodana i jeśli chcemy możemy w ten sposób przetrzymywać dane z list.</p>
<p>Jedyne do czego można by się przyczepić, to ochrona hasłem &#8211; niestety jest tylko jedno hasło które daje dostęp do całego serwisu. Nie mamy możliwości stworzenia kilku (np.: tylko do odczytu) z różnymi poziomami uprawnień w sytuacji gdy przy projekcie pracuje więcej osób.</p>
<p>Moje ogólne wrażenia na temat myTinyTodo są bardzo pozytywne &#8211; jest to odpowiednia aplikacja dla osób szukających małych ale skutecznych rozwiązań w zakresie zarządzania zadaniami. Najnowszą wersję możemy pobrać ze <a href="http://www.mytinytodo.net">strony autora</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/05/mytinytodo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
		<item>
		<title>Operator trójargumentowy w Delphi</title>
		<link>http://www.bbproject.net/2010/04/operator-trojargumentowy-w-delphi/</link>
		<comments>http://www.bbproject.net/2010/04/operator-trojargumentowy-w-delphi/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 12:46:35 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[instrukcja warunkowa]]></category>
		<category><![CDATA[operator]]></category>
		<category><![CDATA[overload]]></category>
		<category><![CDATA[przeciążenie]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=212</guid>
		<description><![CDATA[W PHP funkcjonuje coś takiego jak operator trójargumentowy. Jest to składnia języka, pozwalająca na zastąpienie pojedynczego bloku if&#8230;else w bardziej przejrzysty sposób: warunek ? jeśli_prawda : jeśli_fałsz Przykładowo: $zmienna = $k &#62;= 0 ? 'dodatnie' : 'ujemne'; &#8230;odpowiada konstrukcji: if ($k &#62;= 0) {   $zmienna = 'dodatnie'; } else {   $zmienna = 'ujemne'; [...]]]></description>
			<content:encoded><![CDATA[<p>W PHP funkcjonuje coś takiego jak operator trójargumentowy. Jest to składnia języka, pozwalająca na zastąpienie pojedynczego bloku <em>if&#8230;else</em> w bardziej przejrzysty sposób:</p>
<pre>warunek ? jeśli_prawda : jeśli_fałsz</pre>
<p>Przykładowo:</p>
<pre class="brush: php">$zmienna = $k &gt;= 0 ? 'dodatnie' : 'ujemne';</pre>
<p>&#8230;odpowiada konstrukcji:</p>
<pre class="brush: php">if ($k &gt;= 0)
{
  $zmienna = 'dodatnie';
}
else
{
  $zmienna = 'ujemne';
}</pre>
<p>Jak widać uproszczenie jest znaczne. Object Pascal (Delphi) nie posiada niestety operatora trójargumentowego. W tym wpisie pokażę jak zastąpić tą funkcjonalność przy pomocy prostej funkcji i jej <a href="http://pl.wikipedia.org/wiki/Przeci%C4%85%C5%BCanie_funkcji">przeciążenia</a>.</p>
<p><span id="more-212"></span>Zasadniczo, naszym zadaniem będzie stworzenie funkcji o 3 argumentach, która będzie odpowiednikiem operatora trójargumentowego. Jako iż nie jest to skomplikowane zadanie, przystąpmy do działania:</p>
<pre class="brush: delphi">function IfThen(Condition: Boolean; const TrueValue: String; const FalseValue: String): String;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;</pre>
<p>Funkcję tę nazwałem <em>IfThen</em>, gdyż jest to w zasadzie skrót konstrukcji <em>if&#8230;then&#8230;else</em>. Pierwszym parametrem jest warunek, kolejnym zwracana wartość w przypadku spełnienia owego warunku i ostatnim, wartość w przypadku fałszu.</p>
<p>Jak możemy zauważyć, funkcja dedykowana jest jedynie dla argumentów będących ciągiem znaków. Korzystając z dyrektywy <em>overload</em>, stwórzmy przeciążone funkcje dostosowane do wielu różnych typów zmiennych. Całość, umieściłem od razu w osobnym module w celu łatwiejszego, późniejszego wykorzystania napisanych funkcji.</p>
<pre class="brush: delphi">unit TripleOperator;

interface

function IfThen(Condition: Boolean; TrueValue, FalseValue: Byte): Byte; overload;
function IfThen(Condition: Boolean; TrueValue, FalseValue: Integer): Integer; overload;
function IfThen(Condition: Boolean; TrueValue, FalseValue: Single): Single; overload;
function IfThen(Condition: Boolean; TrueValue, FalseValue: Double): Double; overload;
function IfThen(Condition: Boolean; const TrueValue: String; const FalseValue: String): String; overload;

implementation

function IfThen(Condition: Boolean; TrueValue, FalseValue: Byte): Byte;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

function IfThen(Condition: Boolean; TrueValue, FalseValue: Integer): Integer;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

function IfThen(Condition: Boolean; TrueValue, FalseValue: Single): Single;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

function IfThen(Condition: Boolean; TrueValue, FalseValue: Double): Double;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

function IfThen(Condition: Boolean; const TrueValue: String; const FalseValue: String): String;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

end.
</pre>
<p style="text-align: right;">Pobierz <a href="http://www.bbproject.net/wp-content/uploads/2010/01/triple_operator.zip">TripleOperator.pas</a>.</p>
<p>Tym sposobem, zrealizowaliśmy operator trójargumentowy w Delphi dla kilku typów zmiennych. Jak widać, bardzo łatwo można dodać kolejne. Przykładowe użycie funkcji <em>IfThen</em>:</p>
<pre class="brush: delphi">procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := IfThen(Top &lt;= 200, 'okno jest nisko', 'okno jest wysoko');
end;</pre>
<p>Niestety są pewne kruczki w stosunku do wersji w PHP. Po pierwsze, jest to funkcja a nie składnia języka &#8211; ciut mniejsza wydajność. Po drugie, w przypadku spełnienia warunku, oba argumenty muszą zostać przekazane do funkcji, a nie tylko ten odpowiedzialny za prawdę. Innymi słowy, jeśli argumentami są wyniki działań innych funkcji, to bez względu na wynik parametru <em>Condition</em>, i tak obie zostaną wykonane, mimo że zwrócona zostanie tylko jedna z nich. Nie posiada tego mankamentu konstrukcja <em>if&#8230;then&#8230;else</em>, gdzie po wykonaniu pierwszej instrukcji, blok <em>else</em> w ogóle nie jest analizowany. W zależności od wykorzystania, może to nie mieć znaczenia lub mieć bardzo duże. Przykładowo:</p>
<pre class="brush: delphi">Count := IfThen(i = 0, 8, 8 div i);</pre>
<p>Taki przypadek, w sytuacji gdy zmienna <em>i</em> przyjmuje wartość 0, spowoduje niestety błąd.</p>
<p>Wszystko więc zależy od zastosowania, nie mniej, w większości przypadków skraca nam to ilość kodu jaki musielibyśmy napisać tradycyjnie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/04/operator-trojargumentowy-w-delphi/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

