tag:blogger.com,1999:blog-59539127285429460822024-03-13T11:25:28.737+01:00Delphi NewsUnknownnoreply@blogger.comBlogger28125tag:blogger.com,1999:blog-5953912728542946082.post-11115446450780999332011-02-17T12:54:00.016+01:002011-02-19T01:11:34.910+01:00This is Sparta!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-uJMmtT9zQQM/TV7OLsc5YMI/AAAAAAAAAlQ/Adx_eRNQ_M0/s1600/sparta_logo_on.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 128px; height: 128px;" src="http://4.bp.blogspot.com/-uJMmtT9zQQM/TV7OLsc5YMI/AAAAAAAAAlQ/Adx_eRNQ_M0/s320/sparta_logo_on.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5575120089037496514" /></a>Na wstępie chciałem podziękować za zainteresowanie projektem kilku osobom, które mnie zmotywowały do ujawnienia poniższych informacji :). Wpis proszę traktować jako ciekawostkę, w najbliższym czasie (co najmniej do wakacji) nie planuję żadnych aktualizacji, wpisów ani akcji informacyjnych o Sparcie. Muszę się w pełni skoncentrować na prowadzonym projekcie (<a href="http://mort-game.com">mort-game.com</a>) i pisaniem pod niego komponentów GCL i usprawnianiem narzędzi, a takie artykuły, prezentacje i tworzenie filmów pochłania spore ilości czasu. Poza prowadzonym projektem, jeśli, nie uda się nawiązać współpracy z Embarcadero i tak nie ma sensu publikowanie jakichkolwiek technicznych informacji, albowiem sukces/ewentualne wypuszczenie na rynek Sparty zależy od likwidacji kilku kluczowych błędów w kompilatorze i ograniczeń IDE (sytuacją niedopuszczalną byłoby dla mnie wypuszczenie do użytku samego prototypu, czy niekompletnego i wadliwego środowiska). <br /><br /><span style="font-weight:bold;">Kiedyś miałem sen. Śniłem o środowisku programistycznym Delphi dedykowanym dla programowania gier. Silniki to za mało. Chciałem czegoś więcej, przez ostatnią dekadę liczyłem na to, że Borland/Codegear/Embarcadero zrobi krok w tym kierunku. Niestety, w życiu często bywa tak, że mamy tylko to co zrobimy sobie sami :)</span><br /><br />Zrzut z IDE powinien wyjaśnić mniej więcej, o czym będę pisał w dalszej części wpisu:<br /><br /><a href="http://img513.imageshack.us/img513/238/newlife.jpg">http://img513.imageshack.us/img513/238/newlife.jpg</a> <br /><br />Na początek krótkie zestawienie najważniejszych elementów oferowanych przez Spartę:<br /><br />*Brak VCL (! jednak można go podłączyć jako hosta). <br />*3D (OpenGL) w RAD Studio. <br />*GCL (Graphics/Game Component Library) w miejsce VCL (nie jest to nakładka na VCL czy zbiór komponentów jak GLScene, tylko nowy, niezależny system).<br />*Własne designery i modyfikatory <br />*Fizyka 2D/3D, GUI (i inne mogą) być edytowane jak formy w VCL. <br />*Własny system komponentów niezależny od istniejącego (nowe komponenty, moduły danych - <span style="font-style:italic;">tu moduły danych są rozumiane jako moduły na poziomie logicznym Form w VCL</span> - mogą być tworzone w sposób znacznie prostszy i szybciej niż w tradycyjnie).<br />*Kompilator GLSL zintegrowany z RAD Studio <br />*GCL jest kompatybilny z GeForce i Radeon <br />*Zaawansowana i prosta binarna serializacja dla wszystkich typów danych (dosłownie wszystkich, serializator bazuje na nowym RTTI) <br />*Rekordy w "Object Inspector" i w plikach *.dfm (bazuje na nowym RTTI)<br />*Pełna integracja skryptów LUA z Delphi (bazuje na nowym RTTI) <br />*GCL jest gotowe na MacOSX i Linux (jako hosta używa obecnie SDL) <br />*Wszystkie zdarzenia komponentów mogą być kojarzone ze skryptami (dodatek ten nie ma wpływu na wydajność) <br />*Dodatkowe moduły pomocnicze do OTA<br />*Biblioteka matematyczna wprowadza szereg struktur i funkcji dla wektorów, macierzy, kwaternionów, kolizji, interpolacji etc. <br />*Zintegrowane narzędzia w RAD Studio do zarządzania projektem i budowania nowych elementów Sparty w Sparcie<br /><br /><span style="font-weight:bold;">Sparta IDE</span><br /><br />Nad Spartą pracują dwie osoby ja (aka. HNB) i Krystian Komisarek (aka. Spider). Krótka charakterystyka:<br />• HNB - OTA integracja z Delphi, pomysł na całe IDE i wykonanie, projekt i implementacja GCL<br />• Spider - Specjalista od OpenGL, tworzenie nowych komponentów dla GCL, wiele kluczowych pomysłów<br /><br /><span style="font-weight:bold;">Dlaczego powstała Sparta?</span><br /><br />1. Sparta powstała by w prosty, przejrzysty i uporządkowany sposób realizować projekty gier/wizualizacji<br /><br />2. Mieszanie VCL i OpenGL jest niewygodne. Kontrolki windowsowe często nie pasują wizualnie do grafiki wyświetlanej w widoku 3D OpenGL. Często koniecznym jest tworzenie nowych komponentów w samym VCL, integracja między światem OpenGL a VCL jest uciążliwa (bardzo odczuwalne przy tworzeniu bardziej skomplikowanych edytorów i aplikacji).<br /><br />3. Sprawdzony i działający kod, najaktualniejsze moduły do grafiki. Nie trzeba szukać frameworków po internecie i zastanawiać się czy użyty framework OpenGL jest nowoczesny i właściwy.<br /><br />4. Wygoda kształtowania GUI. VCL został stworzony dla kontrolek Windowsowych co niesie z sobą wiele problemów i ograniczeń przy łączeniu z OpenGL. GUI z GCL zostało zaprojektowane od zera specjalnie do integracji z działającym w tle 3D. Ma trochę wspólnego z VCL (łatwość w użyciu), eliminuje częć rzeczy uciążliwych i jednoczenie wprowadza różne udogodnienia, co więcej działa bezpośrednio w OpenGL.<br /><br /><span style="font-weight:bold;">Czym jest Sparta?</span><br /><br />Po pierwsze Sparta to nie tylko GUI dla OpenGL. Po drugie jedyne wspólnego co ma GCL (Sparta) z VCL (Delphi) to IDE, wygoda w użyciu i kompilator. Poniżej w podpunktach zawrę to co istotniejsze <br /><br />1. Moduł na poziomie formy z VCL w GCL zyskał zupełnie nowe znaczenie. Dla ułatwienia nazwijmy te moduły na poziomie formy, Kontrolkami GCL.<br /><br />2. Kontrolki GCL to między innymi : pulpit, forma, main game, fizyka 2D, menager tekstur, timer, scena, teren, particle...<br /><br />3. Kontrolki GCL są zebrane w grupy : GUI (pulpit, forma) Default (main game) itd.<br /><br />4. Każda z kontrolek GCL zawiera swój unikalny system komponentów (!) widoczny na palecie komponentów tylko w chwili gdy jest aktywna zakładka designera z daną kontrolką GCL. Przykładowo dla formy GUI z GCL mamy komponenty jak w VCL (buttony, listy, różne niewizualne komponenty itd.)<br /><br />5. Każda z kontrolek GCL może definiować własne selektory (coś co decyduje czy dany komponent został zaznaczony) i modyfikatory (coś co wizualnie modyfikuje komponent, przesuwa go/skaluje) dla różnych komponentów i ich grup (zaznaczonych kilku komponentów).<br /><br /><span style="font-weight:bold;">Co daje Sparta?</span><br /><br />1. Kontrolki GCL w przeciwieństwie do form z VCL mają liczniki referencji. Z poziomu IDE można tworzyć powiązania między kontrolkami GCL. W dużym skrócie programista może decydować które kontrolki GCL dla których mają być automatycznie stworzone/aktywne. Dzięki temu nie są ładowane wszystkie kontrolki już na starcie programu a jedynie wtedy gdy są potrzebne innej kontrolce GCL.<br /><br />2. Tworzenie w usystematyzowany sposób wiele programów wirtualnych w jednym programie. Przykładem mogą być formy poprzypisywane do pulpitów. Można w prosty sposób aktywować aktualnie potrzebny pulpit. Również z poziomu projektu programistycznego można ładnie uporządkować formy GUI po katalogach danego pulpitu.<br /><br />3. Koncepcja nazewnicza. Projekt tej skali wymagał stworzenia odpowiedniego podziału modułów, warstw i przedrostków i przyrostków. Istnieje wiele modułów zbiorczych i nazewniczo podobnych do tych z VCL/RTL np. gclClasses, guiClasses, dtxUtils. Doświadczony programista Delphi powinien szybko się odnaleźć w środowisku Sparty.<br /><br />4. Granicą jest ludzka wyobraźnia, mając w miejscu designera form okno OpenGL można tworzyć nawet inne biblioteki aniżeli GCL, VCL... Np. do tworzenia grafów etc.<br /><br /><span style="font-weight:bold;">Warstwy Sparty</span><br /><br />Projekt tego rozmiaru wymagał usystematyzowania i uporządkowania.<br /><br />• Warstwa 1 (aka. SpartaRTL)<br />Własne moduły pomocnicze wypełniające braki w RTL. W ich skład wchodzą moduły realizujące/dostarczające mi.: serializację, matematykę, skrypty<br /><br />• Warstwa 2 (aka. SpartaEngine)<br />Silnik gry. Istnieją różne silniki do gier. Używając samej warstwy 2 i 1 można tworzyć pełnowartościowe gry komputerowe i wizualizacje w tradycyjny sposób jak ma to miejsce w przypadku zwykłych silników, używając różnorodnych klas do kształtowania wirtualnej rzeczywistości.<br /><br />• Warstwa 3 (aka. otaUtils)<br />Warstwa nabudowana na ToolsAPI. Znacząco upraszcza i automatyzuje użycie interfejsów z ToolsAPI. W planach jest stworzenie komponentów do VCL korzystających z warstwy 3, przeznaczonych tylko i wyłącznie do tworzenia bibliotek *.bpl dla IDE.<br /><br />• Warstwa 4 (aka. Sparta IDE)<br />Korzystając z warstwy 3, zostało podłączone OpenGL do RAD Studio i został stworzony alternatywny system komponentów, oraz zintegrowane narzędzia w IDE (np. kompilator shaderów GLSL, wystarczy je dodać do projektu jak zwykłe pliki z kodem).<br /><br />• Warstwa 5 (aka. GCL)<br />Zostało omówione w podpunkcie : „Czym jest Sparta?”<br /><br />• Warstwa 6<br />Konkretne kontrolki GCL: GUI, Physics, RTS Maps, FPS... Kontrolki np. Physics mogą korzystać w swoich designerach np. z kontrolek już obecnych w Sparcie np. z GUI.<br /><br />• Warstwa 7 (w planach, jednak wszystko jest pod to pisane)<br />Możliwość edycji kontrolek GCL w czasie działania programu (!). Selektory, modyfikatory i cały system komponentów może być przeniesiony w program. W planach jest stworzenie IDE podobnego do Delphi działającego bezpośrednio w OpenGL i w uruchomionej aplikacji/specjalnym trybie edycji. Zamiast kodu Delphi pisałoby się w skryptach LUA (lub innych), analogicznie do tego jak ma to miejsce w Delphi (zdarzenia, object inspector itd.). Nowe eventy mogą współdziałać z tymi napisanymi w Delphi, bądź mogą je nadpisywać. Możliwe by było dodawanie nowych komponentów z poziomu tego właśnie IDE do już istniejących kontrolek GCL.<br /><br /><span style="font-weight:bold;">Jak jest tworzona Sparta</span><br /><br />Sparta jest tworzona równolegle z dużym projektem gry komputerowej, nie jest to środowisko pisane samo dla siebie, a hartowane na realnych zastosowaniach:<br /><br /><a href="http://serwis.gamedev.nazwa.pl/screens/18a77df995aaccbcf628808f268d8d3a.jpg">http://serwis.gamedev.nazwa.pl/screens/18a77df995aaccbcf628808f268d8d3a.jpg</a> <br /><a href="http://mort-game.com">http://mort-game.com</a><br /><a href="http://www.youtube.com/watch?v=za_JtzO6QGI">http://www.youtube.com/watch?v=za_JtzO6QGI</a><br /><br /><span style="font-weight:bold;">Stopień ukończenia Sparty</span><br /><br />Sparta to działający prototyp. Kluczowe elementy środowiska programistycznego zostały zaimplementowane. Obecnie rozwijana jest głównie strona samego silnika gier i nowych komponentów GUI na potrzeby projektu Mort i dodatkowe funkcjonalności do IDE przyspieszające proces powstawania gry. Fajerwerki do planowanych prezentacji typu - podłączony nasz autorski silnik fizyczny pod designery - zeszły na dalszy plan (jakieś dodatkowe 2 tygodnie być może niepotrzebnej na chwilę obecną pracy). Jesteśmy w pełni skoncentrowani na kodzie dla naszej gry RTS.<br /><br /><span style="font-weight:bold;">Przyszłość Sparty</span><br /><br />Pomimo zamieszczenia tematu i informacji o Sparcie moim łamanym angielskim ;) (<a href="https://forums.embarcadero.com/thread.jspa?threadID=48136&tstart=90">link</a>), nie doczekałem się niestety ani jednego komentarza od któregokolwiek pracownika na forum ani na PM...<br /><br />Jedyna alternatywa dająca zbliżone możliwości do Delphi to platforma .NET i język C#. Wiele myślałem o przepisaniu Sparty, początkowo na Delphi Prism a później na C#, jednak to wymaga dodatkowego czasu a i efekt takiego zabiegu stoi pod znakiem zapytania. Rozwijana Sparta, nawet jeśli nigdy nie stanie się produktem do kupienia, może się opłacić istniejąc jako narzędzie do wewnętrznego użytku, ze względu na nasze przyszłe projekty i możliwość kompilacji na pozostałe systemy operacyjne w całkiem niedalekiej przyszłości (MacOSX, Linux). Do tego dochodzi Delphi Prism, a stąd droga na XBOXA czy najnowszy projekt "Cooper" czyli kompilator Delphi Prism tworzący "natywne" pliki javy mi. dla Androida. Nie wspomnę już nawet o planach stworzenia backendu kompilatora dla ARM :).<br /><br /><span style="font-weight:bold;">Drogi są dwie : nasze własne prywatne IDE, albo współpraca z Embarcadero i kto wie?</span> :)<br /><br />Na zakończenie kilka smaczków :). Skąd nazwa Sparta? Nazwa nie jest przypadkowa.<br /><br /><span style="font-weight:bold;">Geneza nazwy</span><br /><br /><blockquote>Za twórcę Sparty jako bytu politycznego uważa się prawodawcę Likurga. Nie wiadomo, czy jest on postacią historyczną, bowiem już w czasach starożytnych uchodził za postać niemal mityczną. Żywot Likurga pióra Plutarcha zawiera krótki tekst traktujący o ustroju Sparty. Jest to tak zwana Wielka Rhetra napisana w dialekcie doryckim. Likurg miał jakoby otrzymać owe prawa od wyroczni <span style="font-weight:bold;">delfijskiej</span>, co znacznie podnosiło ich prestiż. Prawa Likurga miały zakończyć okres walk i niepokojów w Sparcie (około VIII w. p.n.e.).</blockquote><br /><br />Zaznaczyłem wyroczni delfijskiej gdyż jest to klasyk. Nazwa Delphi, środowiska (IDE) w którym programujemy i języka który też jest nazywany Delphi, wywodzi się z pogranicza greckiej mitologii i historii. Delphi powstało głównie z myślą o bazach danych, stąd jest szybkie i stabilne, przejrzyste, tym samym przy okazji nadaje się do pisania gier. Głównym targetem Delphi była baza danych "Oracle", stąd też Delphi zostało nazwane Delphi - Delphi oracle było jedną z najistotniejszych świątyń/wyroczni w starożytnej grecji.<br /><br />Tutaj mamy obraz jednej z Delfijskich kapłanek:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/John_Collier_-_Priestess_of_Delphi.jpg/220px-John_Collier_-_Priestess_of_Delphi.jpg"><img style="cursor:pointer; cursor:hand;width: 220px; height: 444px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/John_Collier_-_Priestess_of_Delphi.jpg/220px-John_Collier_-_Priestess_of_Delphi.jpg" border="0" alt="" /></a><br /><br />Wracając do cytatu - poniekąd też dostaliśmy prawa od Delfi. Całość jest ściśle zintegrowana z językiem Delphi i IDE, dzięki czemu uzyskaliśmy własnego "clickera" do tworzenia gier.<br /><br />Co więcej Delphi zawsze towarzyszą Ateny. Motyw Aten najwidoczniejszy jest w ikonkach starszych wersji i obecnie w ikonce RAD Studio 2010. Objawia się w grafice Partenonu w wersji demo (ma trochę mniej kolumn - może to wcale nie Partenon?): <br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img811.imageshack.us/img811/5140/mainicon.jpg"><img style="cursor:pointer; cursor:hand;width: 245px; height: 245px;" src="http://img811.imageshack.us/img811/5140/mainicon.jpg" border="0" alt="" /></a><br /><br />Przy okazji przedstawiam ikonkę samego Delphi:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img340.imageshack.us/img340/5281/delphi.png "><img style="cursor:pointer; cursor:hand;width: 102px; height: 101px;" src="http://img340.imageshack.us/img340/5281/delphi.png " border="0" alt="" /></a><br /><br />Co mają Ateny do naszej Sparty? <br /><br /><blockquote>W wojnach perskich na początku V w. p.n.e. Sparta (miasto o pow. 300 ha i 8 tys. mieszkańców) była połączona sojuszem z Atenami – Termopile. W połowie stulecia doszło jednak do konfliktu między tymi najsilniejszymi greckimi polis. Wojnę tę, zwaną peloponeską wygrała Sparta, dzięki czemu zdobyła hegemonię w Helladzie. Zarówno Ateny jak i Sparta na przemian były opłacane przez Persję.</blockquote><br /><br />Po prostu Sparta to idealne wpasowanie się w klimaty - tego co robimy i języka/środowiska pod które piszemy.<br /><br />Co jest symbolem Sparty? Otóż jest nim grecka litera Lambda, od Lakonii, przedstawiany najczęściej na tarczach. Oficjalne logo stworzone przez naszego grafika Ftorka jest widoczne na samym początku wpisu, nawiązuje do samej lambdy jak i tarczy:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img263.imageshack.us/img263/8753/aaa4yq7.jpg"><img style="cursor:pointer; cursor:hand;width: 292px; height: 425px;" src="http://img263.imageshack.us/img263/8753/aaa4yq7.jpg" border="0" alt="" /></a><br /><br />Nazwa i charakter teamu DaThoX. Jesteśmy jak spartanie. <br /><br />Poza klasycznym tekstem Leonidasa "This is Sparta!" warto nadmienić:<br /><br /><blockquote>Państwem spartańskim zachwycała się oligarchia ateńska oraz filozofowie na czele z Platonem. Zachwycała ich prostota życia, jasność prawa oraz wysokie morale społeczeństwa mające swój wyraz w poświęceniu się całkowicie ideałowi wielkości Sparty. Do dziś jej historia jest klasycznym w swej oryginalności wycinkiem historii Hellady.</blockquote><br /><br />;)<br /><br /><blockquote>Życie spartanina było ciągłym zmaganiem się z własnymi słabościami. Trening zaczynał się od dnia narodzin</blockquote><br /><br />Pierwsza wersja w chwili gdy nie było do końca wiadome czy uda się podłączyć pod RAD Studio w sposób oczekiwany, nazwa kodowa brzmiała "Termopile". <br /><br />Bitwa została przedstawiona w filmie 300. Cóż. Mieliśmy podobną sytuację.<br /><br /><blockquote>Spartanie dowiedli wówczas, że wolą zginąć niż się poddać</blockquote><br /><br />My jednak łamiąc historyczną tradycję żyjemy, a nasz prototyp działa. :)<br /><br />PS. Sparta uchodziła za najpotężniejsze państwo starożytnej Grecji:<br /><br /><a href="http://www.spartan3.republika.pl/sparta.htm">http://www.spartan3.republika.pl/sparta.htm</a><br /><br />Pozdrawiam wszystkich, którzy przebrnęli przez ten cały długi wpis :)!Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5953912728542946082.post-50994518614869871592011-01-06T12:35:00.005+01:002011-01-06T15:15:47.547+01:00Cisza w eterzePrawie pół roku bez postów :). Pracuję od wielu miesięcy nad bardzo dużym projektem. Całość ma już ponad 150k LOC. Niebawem będę mógł ujawnić nieco więcej szczegółów o prowadzonych od czerwca pracach. Sądzę, że to będzie wielkie zaskoczenie dla wszystkich, zwłaszcza dla programistów Delphi :). <br /><br />Przez ten cały czas zdążyło wyjść "RAD Studio XE" a w nim masa naprawionych błędów z wersji poprzednich (liczone w tysiącach). Jednak szału nie ma. Po pierwsze, żadnej większej nowości w składni. Np. {$STRONGLINKTYPES ON} obecne już w Delphi 2010 tylko nieudokumentowane (strasznie nie lubię tej dyrektywy ponieważ ma działanie na wszystkie deklarowane typy w projekcie i nie można "silnie zlinkować" wybranych klas, wielka szkoda...). <br /><br />Pomimo, że mam licencję na XE, nie używam go. Dodanie jednej funkcjonalności do RTTI to stanowczo za mało. TVirtualMethodInterceptor - klasa umożliwiająca przechwycenie/zastąpienie dowolnej metody wirtualnej w instancji klasy to trochę za mało. Dodano też moduł do wyrażeń regularnych i klika mniejszych usprawnień.<br /><br />Podstawową przeszkodą w używaniu DelphiXE jest debugowanie IDE w IDE... Nowa wersja przysporzyła mi kilku kłopotów np. w OTA zmieniając zachowania niektórych elementów. Nie wspomnę już o beznadziejnej dołączonej do Delphi wersji (DEMO! WTF?) AQTime 7 która wywala się na moich projektach -,-...<br /><br />Jako ciekawostkę przytoczę post mówiący o historii kompilatora Delphi, napisany przez Allena Bauera (Embarcadero Chief Scientist):<br /><br /><blockquote>It is mostly C, with very little C++. The Delphi32 bit compiler was a port from a (at the time) Borland Pascal compatible Atari ST compiler that targeted the 68000 CPU. It was called "Pure Pascal." Borland purchased the IP and contracted with the original author to create an x86 backend. While much of the original architecture remains, it is so significantly different that it hardly looks like the original code.<br /><br />I personally worked with the original author for many months to get the Borland Pascal RTL and Turbo Vision building for 32bit. That work was put aside and things shifted to the new fledgling Delphi project. Even while the Delphi project was in full swing and initially targeted Windows 16bit, work continued on the 32bit compiler. That work had also shifted to add the Delphi specific language features.<br /><br />The original Turbo Pascal compiler targeted the Z80 CPU and was written in Assembler. At the behest of Philippe Kahn, Anders Hejlsberg ported the assembler to 8086 and targeted the same. Because the 8086 is an evolution of the 8080A (as is the Z80), it shared many of the same opcodes as the 8080A/Z80/8085, so the port was fairly mechanical. This is also why that up through Turbo Pascal 3.0 the compiler would only<br />create .COM file, which was limited to 64K.<br /><br />The Turbo Pascal/Borland Pascal/Delphi compilers have never been written in Pascal. Not because it isn't possible, but was simply not practical or economical. Academically, yes, many times it is the goal of the compiler author to get the compiler to the point where it can compile itself. This is usually the first "real-world" use of a new compiler and serves as a validation suite. However, the world of<br />commercial software has more practical and economic factors that weigh heavily in the development process.</blockquote><br /><br />Na deser:<br /><br />mały obraz z Delphi64 bit (ma wyjść w tym roku) i CHASM (nie ma już BASM):<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://a.yfrog.com/img614/4939/e20w.png"><img style="cursor:pointer; cursor:hand;width: 477px; height: 503px;" src="http://a.yfrog.com/img614/4939/e20w.png" border="0" alt="" /></a>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5953912728542946082.post-21173492395976252722010-07-24T14:07:00.003+02:002010-07-24T14:26:09.754+02:00Nowy kompilator DelphiHuh. Rzeczywistość zaczyna mnie coraz bardziej zadziwiać - nowy kompilator Delphi zapowiada się rewelacyjnie - właściwie to dwa kompilatory. Po pierwsze obecny kompilator jest przepisywany/został przepisany z C (>300K kodu) do C++ by łatwiej było nim zarządzać i naprawiać błędy/wprowadzać nowe właściwości.<br /><br /><span style="font-weight:bold;">Stary kompilator</span> jest trzymany (i będzie) by zachować wszystkie właściwości języka jakie znamy, wszystkie jego niekiedy specyficzne zachowania by można było łagodnie przejść na <span style="font-weight:bold;">nowy język Delphi</span>.<br /><br />Mam nadzieję, że chodzi tylko o zachowanie starego front-end kompilatora, czyli części odpowiedzialnej za składnię, ale z nowym back-endem, czyli częścią generującą kod maszynowy.<br /><br /><span style="font-weight:bold;">Nowy kompilator</span> ma być znacznie elastyczniejszy. Nie tyle ciekawy jestem nowej składni co ostatnio zwłaszcza back-endu:<br /><br /><blockquote>With a back end compiler architecture - we are not limited to just Intel (x86, x64) only. It will be possible to plug in any number of optimizers and code emitters - whether this work is done by Embarcadero engineers, chip manufacturers or other engineers and community members.</blockquote><br /><br />jak to napisał David Intersimone z Embarcadero (Vice President of Developer Relations and Chief Evangelist). WOW!<br /><br />Kompilator Delphi na Xboxa, PS3, Gameboya, do plików SWF, do Javy ? Jeśli nie ruszy tego Embarcadero, wszystko będziemy mogli stworzyć my - community members!Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-5953912728542946082.post-55640785914713669462010-05-02T04:11:00.014+02:002010-05-02T14:59:37.999+02:00Delphi i TStringGrid cz.1Kolejny raz pisząc projekt natrafiłem na seryjnie powtarzające się problemy z StringGridem. Najpopularniejsze braki występujące w komponencie to:<br /><br />1. Wstawianie kolumny/wiersza<br />2. Kasowanie kolumny/wiersza<br />3. Wykrywanie zdarzenia zmiany rozmiaru kolumny/wiersza<br /><br /><span style="font-weight:bold;">Założenia</span><br /><br />Dostępne w sieci przykłady nie spełniły moich oczekiwań - skupiają się głównie na pisaniu nowego komponentu udostępniającego jedne z powyższych funkcjonalności. Ja nie lubię specjalnie zaśmiecać palety komponentów, stąd też staram się ograniczać i używać tego co mam.<br /><br />Poniższe rozwiązania nie wymagają instalowania / tworzenia komponentu a jedynie kilku zmian w kodzie modułu z formą. <br /><br /><span style="font-weight:bold;">Przygotowania</span><br /><br />Zanim przystąpimy do omawiania powyższych podpunktów, musimy zastosować technikę zwaną "podrabianiem klasy" (ang. Class Spoofing) - bardzo rzadko stosowana, acz bardzo użyteczna tachnika pozwalająca nam uzyskać dostęp do pól i metod z sekcji protected. Standardowa notacja kodu używana w Delphi nie przewiduje specjalnych oznaczeń, jednak ja konsekwentnie używam przedrostka CS. Należy zadeklarować następujący typ który posłuży nam w dalszej części artykułu:<br /><br /><pre class="brush: delphi">type // class spoofing<br /> TCS_StringGrid = class(TStringGrid);</pre><br /><br /><br /><span style="font-weight:bold;">1. Wstawianie kolumny/wiersza </span><br /><br />W razie potrzeby należy samodzielnie dodać kod zabezpieczający przed wyjściem z zakresu parametrów AColumn i ARow.<br /><br /><pre class="brush: delphi">procedure TfMain.InsertColumn(AStringGrid: TStringGrid; AColumn: integer);<br />Begin<br /> with TCS_StringGrid(AStringGrid) do<br /> begin<br /> ColCount := ColCount + 1;<br /> MoveColumn(ColCount - 1, AColumn);<br /> Cols[AColumn].Clear;<br /> end;<br />end;<br /><br />procedure TfMain.InsertRow(AStringGrid: TStringGrid; ARow: integer);<br />begin<br /> with TCS_StringGrid(AStringGrid) do<br /> begin<br /> RowCount := RowCount + 1;<br /> MoveRow(RowCount - 1, ARow);<br /> Rows[ARow].Clear;<br /> end;<br />end;</pre><br /><br /><span style="font-weight:bold;">2. Kasowanie kolumny/wiersza</span><br /><br /><pre class="brush: delphi">procedure TfMain.DeleteColumn(AStringGrid: TStringGrid; AColumn: integer);<br />begin<br /> with TCS_StringGrid(AStringGrid) do<br /> begin<br /> if ColCount - FixedCols = 1 then<br /> Exit;<br /> DeleteColumn(AColumn);<br /> end;<br />end;<br /><br />procedure TfMain.DeleteRow(AStringGrid: TStringGrid; ARow: integer);<br />begin<br /> with TCS_StringGrid(AStringGrid) do<br /> begin<br /> if RowCount - FixedRows = 1 then<br /> Exit;<br /> DeleteRow(ARow);<br /> end;<br />end;</pre><br /><br />Powyższe metody mogą zostać zaimplementowane w klasie formy, lub można w ramach treningu stworzyć klasę pomocniczą dla TStringGrida.<br /><br /><span style="font-weight:bold;">WAŻNE</span><br /><br />Jeśli implementowaliśmy zdarzenie przesuwania kolumn/wierszy OnRowMove/OnColumnMoved, to powyższe implementacje mogą być dość problematyczne, ponieważ zostanie wywołany event przesunięcia, pomimo, że takowe "logicznie" nie nastąpiło. Należy się przed tym zabezpieczyć poprzez napisanie metod zawieszających i odwieszających te zdarzenia, oraz wrappery na funkcje dodające/kasujące wiersze/kolumny.<br /><br /><pre class="brush: delphi">procedure TfMain.LockColRowMoveEvent;<br />begin<br /> StringGrid1.OnRowMoved := nil;<br /> StringGrid1.OnColumnMoved := nil;<br />end;<br /><br />procedure TfMain.UnlockColRowMoveEvent;<br />begin<br /> StringGrid1.OnRowMoved := StringGridRowMoved;<br /> StringGrid1.OnColumnMoved := StringGridColumnMoved;<br />end;</pre><br /><br />a tu mamy wrappery na metody dodawania/kasowania, z których należy korzystać zamiast z InsertColumn, InsertRow, DeleteRow i DeleteColumn w przypadku wystąpienia zdarzeń przesuwania kolumn i wierszy dla danego StringGrida:<br /><br /><pre class="brush: delphi">procedure TfMain.AddCol(ACol: integer);<br />begin<br /> LockColRowMoveEvent;<br /><br /> InsertColumn(StringGrid1, ACol);<br /><br /> UnlockColRowMoveEvent;<br />end;<br /><br />procedure TfMain.AddRow(ARow: integer);<br />begin<br /> LockColRowMoveEvent;<br /><br /> InsertRow(StringGrid1, ARow);<br /><br /> UnlockColRowMoveEvent;<br />end;<br /><br />procedure TfMain.DelCol(ACol: integer);<br />begin<br /> LockColRowMoveEvent;<br /><br /> DeleteColumn(StringGrid1, ACol);<br /><br /> UnlockColRowMoveEvent;<br />end;<br /><br />procedure TfMain.DelRow(ARow: integer);<br />begin<br /> LockColRowMoveEvent;<br /><br /> DeleteRow(StringGrid1, ARow);<br /><br /> UnlockColRowMoveEvent;<br />end;</pre><br /><br /><span style="font-weight:bold;">3. Wykrywanie zdarzenia zmiany rozmiaru kolumny/wiersza</span> <br /><br />Dla czego? Najodpowiedniejszym wyjaśnieniem jest synchronizacja z innym StringGridem np. znajdującym się nad/pod lub obok.<br /><br />W przykładzie zostanie pokazana technika wykrywania zdarzenia dla kolumn, w razie potrzeby można dopisać analogiczne metody dla wierszy.<br /><br />Pierwszym krokiem na drodze do wykrycia zdarzenia jest stworzenie klasy pomocniczej, której metody są używane w dalszym kodzie:<br /><br /><pre class="brush: delphi">type<br /> TStringGridHelper = class helper for TStringGrid<br /> public<br /> function RightCol: integer;<br /> function BottomRow: integer;<br /> end;<br /><br />{...}<br /><br />function TStringGridHelper.BottomRow: integer;<br />begin<br /> Result := TopRow + VisibleRowCount - 1<br />end;<br /><br />function TStringGridHelper.RightCol: integer;<br />begin<br /> Result := LeftCol + VisibleColCount - 1;<br />end;</pre><br /><br />Następnym krokiem jest zadeklarowanie nowej klasy<br /><br /><pre class="brush: delphi">TStringGridColResize = class(TStringGrid)<br />protected<br /> procedure ColWidthsChanged; override;<br />end;</pre><br /><br />której implementacja wygląda następująco (kiedy chcemy synchronizować z innym StringGridem):<br /><br /><pre class="brush: delphi">procedure TStringGridColResize.ColWidthsChanged;<br /><br /> procedure AlignColSize(ASource, ADest: TStringGrid);<br /> var<br /> i, RightCol: LongInt;<br /> begin<br /> if ASource.ColCount - ASource.FixedCols <> ADest.ColCount -<br /> ADest.FixedCols then<br /> Exit;<br /><br /> RightCol := ASource.RightCol + 1;<br /> if RightCol = ASource.ColCount then<br /> Dec(RightCol);<br /><br /> for i := ASource.LeftCol to RightCol do<br /> ADest.ColWidths[i + (ADest.FixedCols - ASource.FixedCols)] :=<br /> ASource.ColWidths[i];<br /> end;<br /><br />begin<br /> if Self = fMain.StringGrid1 then<br /> AlignColSize(fMain.StringGrid1, fMain.StringGrid2)<br /> else if Self = fMain.StringGrid2 then<br /> AlignColSize(fMain.StringGrid2, fMain.StringGrid1);<br /><br /> inherited;<br />end;</pre><br /><br />Jak widać nie wykrywamy która konkretnie kolumna podlega zmianie rozmiaru, a jedynie wykrywamy zdarzenie bez danych precyzujących, jak co i o ile.<br /><br />Można oczywiście wykryć której kolumny rozmiar został zmieniony, poprzez przechowywanie rozmiarów kolumn w osobnej tablicy i porównanie ich z nowymi rozmiarami. <br /><br />Technika jest wydajna nawet w przypadku dużej liczby kolumn, gdyż sprawdzamy rozmiary kolumn jedynie tych widocznych.<br /><br />Teraz w zdarzeniu stworzenia formy należy podmienić tablicę VMT dla StringGridów, które mają być podatne na wykrycie zdarzenia zmiany rozmiarów kolumn.<br /><br /><pre class="brush: delphi">procedure TfMain.FormCreate(Sender: TObject);<br />begin<br /> // patch dla VMT - potrzebne zdarzenie ColResize<br /> PPointer(StringGrid1)^ := TStringGridColResize;<br /> PPointer(StringGrid2)^ := TStringGridColResize;<br />end;</pre><br /><br /><span style="font-weight:bold;">Podsumowanie</span><br /><br />Zaprezentowane techniki mogą się wydać dość uciążliwe jednak do większości zastosowań są bardzo użyteczne i nie sprawią problemów i co ważniejsze nie trzeba tworzyć/instalować dodatkowych komponentów.<br /><br />W przypadku intensywnej eksploracji warto się pokusić o stworzenie własnego komponentu :).<br /><br /><a href="http://dathox.unit1.pl/files/hnb/delphi/StringGrid1.zip">[ŚCIĄGNIJ PRZYKŁADOWY PROGRAM]</a><br /><br />Pozdrawiam Maciej "HNB" IzakUnknownnoreply@blogger.com2tag:blogger.com,1999:blog-5953912728542946082.post-81710661604923291202010-01-20T00:47:00.003+01:002010-01-20T00:58:07.709+01:00Jak wkompilować DLL do EXEBardzo stare (ma już z 5 lat) i epickie ^^ czyli:<br /><br />jak wkompilować DLL do naszego programu. <br /><br /><span style="font-weight:bold;">--- INFO ---</span><br />DLLtoPAS jest wersją programu pod starą wersję DLLLoadera.<br />Przemielone nim moduły będą działać po drobnych przeróbkach.<br /><br />Obecnie nie mam czasu, chęci ani potrzeby, na napisanie wersji <br />pod nowy unit. <br />Jeśli ktoś chce może napisać podobny program pod nową wersję <br />modułu :). <br /><br />Jeśli go napiszesz, wyślij na email: hnb[małpa]dathox.com<br /><br />a zrobię update + credits dla Ciebie.<br /><br /><span style="font-weight:bold;">--- USES ---</span><br />Unit jest prosty w obsłudze:<br /><br /><pre class="brush: delphi">function AddDLL(Name:pchar;Data:pointer;Size:longword):PDLLFileListItem;<br />procedure RemoveDLLItem(Item:PDLLFileListItem);<br />procedure RemoveDLL(Name:pchar);<br />function PatchImports(hLibModule:hmodule):hmodule;<br /><br />function FindDLLModulePerName(const Name:pchar):PDLLModule;<br />function FindDLLModulePerWideName(const Name:pwidechar):PDLLModule;<br />function FindDLLModulePerImageBase(const ImageBase:pointer):PDLLModule;<br />function FindDLLModulePerAddress(const Address:pointer):PDLLModule;<br /><br />function GetProcAddressByOrdinal(Module:hmodule;Ordinal:longword):pointer;<br />function GetProcAddressByHash(Module:hmodule;Hash:longword):pointer;<br />function GetProcAddressByName(Module:hmodule;ModuleName:pchar):pointer;<br /><br />function LoadDLLModule(ModuleData:pointer;const ModuleName:pchar;FileSize:longword):PDLLModule;<br />function FreeDLLModule(DLLModule:PDLLModule):boolean;</pre><br /><br /><br />Jak to działa w praktyce (mniej więcej) możemy zobaczyć na przykładzie <br />przetrawionych modułów przez DLLtoPAS.<br /><br /><span style="font-weight:bold;">--- ABOUT ---</span><br />Dzięki dla Goriona za pomoc kilka lat temu w napisaniu DLLtoPAS i dla<br />autora DLL Loadera - BeRo<br /><br />Pozdrawiam, Maciej HNB Izak<br />hnb[małpa]dathox.com<br /><br /><a href="http://dathox.unit1.pl/files/hnb/dllloader.zip">[LINK]</a>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5953912728542946082.post-51278768002562426942009-12-10T17:11:00.011+01:002009-12-10T17:51:38.548+01:00Serializacja klas cz1. cz.2 i cz.3Zbiór 3 artykułów o serializacji klas w Delphi mojego autorstwa bazujący na mechanizmach używanych przez VCL. Obecnie (od Delphi 2010) serializacja jest możliwa w dużo bardziej prosty i oczywisty sposób o którym postaram się wkrótce napisać, jednak warto poznać ta "Old Schoolową" technikę. Wrzucam wszystkie 3 części:<br /><br />najważniejsze procedury z dtxUtils używane w dalszym kodzie, bardzo przydatne podczas serializacji klas w Delphi<br /><pre class="brush: delphi">function ComponentToString(Component: TComponent): string;<br />var<br /> BinStream:TMemoryStream;<br /> StrStream: TStringStream;<br /> s: string;<br />begin<br /> BinStream := TMemoryStream.Create;<br /> try<br /> StrStream := TStringStream.Create(s);<br /> try<br /> BinStream.WriteComponent(Component);<br /> BinStream.Seek(0, soFromBeginning);<br /> ObjectBinaryToText(BinStream, StrStream);<br /> StrStream.Seek(0, soFromBeginning);<br /> Result:= StrStream.DataString;<br /> finally<br /> StrStream.Free;<br /><br /> end;<br /> finally<br /> BinStream.Free<br /> end;<br />end;<br /><br />procedure StringToComponent(Value: string; Comp: TComponent);<br />var<br /> StrStream:TStringStream;<br /> BinStream: TMemoryStream;<br />begin<br /> StrStream := TStringStream.Create(Value);<br /> try<br /> BinStream := TMemoryStream.Create;<br /> try<br /> ObjectTextToBinary(StrStream, BinStream);<br /> BinStream.Seek(0, soFromBeginning);<br /> BinStream.ReadComponent(Comp);<br /> finally<br /> BinStream.Free;<br /> end;<br /> finally<br /> StrStream.Free;<br /> end;<br />end;<br /><br />{$WARNINGS OFF}<br />procedure SaveComponent(AFile: string; AComponent: TComponent;<br /> AText: boolean = true);<br />var<br /> f: TFileStream;<br /> m: TMemoryStream;<br />begin<br /> if AText then<br /> try<br /> m := TMemoryStream.Create;<br /> m.WriteComponent(AComponent);<br /> m.Seek(0, soFromBeginning);<br /><br /> f := TFileStream.Create(AFile, fmCreate);<br /> ObjectBinaryToText(m, f);<br /> finally<br /> m.Free;<br /> f.Free;<br /> end else<br /> try<br /> f := TFileStream.Create(AFile, fmCreate);<br /> f.WriteComponent(AComponent);<br /> finally<br /> f.Free;<br /> end;<br />end;<br />{$WARNINGS ON}<br /><br />{$WARNINGS OFF}<br />procedure LoadComponent(AFile: string; AComponent: TComponent;<br /> AText: boolean = true);<br />var<br /> f: TFileStream;<br /> m: TMemoryStream;<br />begin<br /> if AText then<br /> try<br /> f := TFileStream.Create(AFile, fmOpenRead);<br /> m := TMemoryStream.Create;<br /><br /> ObjectTextToBinary(f, m);<br /> m.Seek(0, soFromBeginning);<br /> m.ReadComponent(AComponent);<br /> finally<br /> m.Free;<br /> f.Free;<br /> end else<br /> try<br /> f := TFileStream.Create(AFile, fmOpenRead);<br /> f.ReadComponent(AComponent);<br /> finally<br /> f.Free;<br /> end;<br />end;<br />{$WARNINGS ON}<br /></pre><br /><br /><span style="font-weight:bold;">Część 1</span><br /><pre class="brush: delphi"><br />(*******************************************************************************<br /> Serializacja klas w Delphi cz.1<br /><br /> DaThoX 2004-2008 <br /><br /> Maciej Izak (hnb.code[at]gmail[dot]com)<br /><br /><br /> Serializacja – w programowaniu komputerów proces przekształcania obiektów,<br /> tj. instancji określonych klas, do postaci szeregowej, czyli w strumień<br /> bajtów, z zachowaniem aktualnego stanu obiektu. Serializowany obiekt może<br /> zostać utrwalony w pliku dyskowym, przesłany do innego procesu lub innego<br /> komputera poprzez sieć. Procesem odwrotnym do serializacji jest<br /> deserializacja. Proces ten polega na odczytaniu wcześniej zapisanego<br /> strumienia danych i odtworzeniu na tej podstawie obiektu klasy wraz z jego<br /> stanem bezpośrednio sprzed serializacji.<br /><br /> Powyższa definicja pochodzi z wikipedii<br /> (http://pl.wikipedia.org/wiki/Serializacja)<br /><br /> Serjalizacja w Delphi wygląda dużo bardziej estetycznie niż w innych językach<br /> i moim zdaniem jest znacznie prostsza. Zresztą nie bedę się zbytnio rozpisywał<br /> :) - przejdźmy do kodu<br /><br />(******************************************************************************)<br /><br />program Lesson_01;<br /><br />{$APPTYPE CONSOLE}<br /><br />uses<br /> SysUtils,<br /> Classes, // <- podstawowe klasy z których bedziemy dziedziczyć<br /> Dialogs,<br /> dtxUtils // <- napisałem procedury ułatwiające serializację klas<br /> ;<br /><br />{-------------------------------------------------------------------------------<br /> Generalnie sprawa jest prosta. Każda klasa którą chcemy zapisywać do pliku musi<br /> dziedziczyć z TComponent. Oczywiście jeśli posiadamy odpowiednio duża wiedzę<br /> możemy się pokusić o napisanie własnych klas do zapisu klas do pliku ale po co?<br /><br /> TComponent jest świetną klasą, zwartą i dzielącą/łączącą wszystko w jedną całość.<br /> Możemy przyjąć że TComponent to Np. TGracz<br />{------------------------------------------------------------------------------}<br /><br />type<br /> // wrsja gracza 1 :) - później omówimy kolejne możliwości serializacji<br /> // i nie chcę by ten tutek stracił czytelność<br /> TPlayer1 = class(TComponent)<br /> private<br /> FName: string; // nazwa<br /> FRememberPasswd: boolean; // możemy nie chcieć zapamiętywać hasła do pliku<br /> //by go ktoś nie przechwycił<br /> FPasswd: string; // hasło<br /> public<br /> // ---<br /> protected<br /> // ---<br /> published<br /> // zapis odbywa się dzięki property<br /> property Name: string read FName write FName;<br /> // kolejność property ma OGROMNE znaczenie. Przypuśćmy że pole<br /> //<br /> // property RememberPasswd<br /> //<br /> // byłoby za<br /> //<br /> // property Passwd<br /> //<br /> // wtedy zawartość Passwd mogłaby zostać nie wczytana ponieważ na końcu jej<br /> // deklaracji mamy dyrektywę "stored" i nazwę pola "FRememberPasswd" co<br /> // oznacza:<br /> //<br /> // "zainicjalizuj właściwość Passwd tylko jeśli pole FRememberPasswd<br /> // ma wartość true"<br /> //<br /> // !!!oczywiście za stored możemy umieśćić funkcję (która zostanie wywołana<br /> // podczas odczytu/zapisu)!!!<br /> //<br /> // Z tego wniosek, że za późno zinicjalizowalibyśmy wartość pola<br /> // FRememberPasswd i przez to nie wczytalli hasła :(<br /> property RememberPasswd: boolean read FRememberPasswd write FRememberPasswd;<br /> property Passwd: string read FPasswd write FPasswd stored FRememberPasswd;<br /> end;<br /><br />{-------------------------------------------------------------------------------<br /> Zaletą serializacji klas w delphi jest to że struktura klasy może się<br /> !zmieniać! co w przypadku plików binarnych niosłoby ze sobą szereg zmian.<br /><br /> ZALETĄ zapisu przez property jest fakt że możemy za read/write wstawić metody<br /> odczytu i zapisu co w połączeniu ze stored daje nam ogromne mozliwości!<br />{------------------------------------------------------------------------------}<br /><br />{-------------------------------------------------------------------------------<br /> Na chwilę obecną zanim omówimy bardziej zaawansowane aspekty serializacji w<br /> Delphi sprawdźmy czy faktycznie działa...<br />{------------------------------------------------------------------------------}<br /><br />var<br /> Player: TPlayer1;<br /> c: char;<br />begin<br /> Player := TPlayer1.Create(nil);<br /><br /> Write('Podaj swoj nick : ');<br /> ReadLn(Player.FName);<br /><br /> Write('Podaj haslo : ');<br /> ReadLn(Player.FPasswd);<br /><br /> Write('Zapamietac twoje haslo na pozniej (T/N)? : ');<br /> ReadLn(c);<br /> Player.FRememberPasswd := UpCase(c) = 'T';<br /><br /> // przekształcamy obiekt w tekst :)<br /> // zapisem zajmiemy się w nastepnej części<br /> WriteLn(sLineBreak,<br /><br /> ComponentToString(Player)<br /><br /> );<br /><br /> // zakończ ...<br /> ReadLn;<br /> Player.Free;<br />end.<br /></pre><br /><br /><span style="font-weight:bold;">Część 2</span><br /><pre class="brush: delphi"><br />(*******************************************************************************<br /> Serializacja klas w Delphi cz.2<br /><br /> DaThoX 2004-2008<br /><br /> Maciej Izak (hnb.code[at]gmail[dot]com)<br /><br /> Na dzisiejszej lekcji zajmiemy się obsługą zapisu przypisanej metody do pola<br /> (Delphi umożliwia zapamiętanie jaką metodę przypisaliśmy polu typu<br /> proceduralnego obiektowego)<br /><br /> Poznamy także procedury umozliwiajace odczyt/zapis klasy z/do pliku<br />(******************************************************************************)<br />program Lesson_02;<br /><br />{$APPTYPE CONSOLE}<br /><br />uses<br /> SysUtils,<br /> Classes, // <- podstawowe klasy z których bedziemy dziedziczyć<br /> Dialogs,<br /> dtxUtils; // <- napisałem procedury ułatwiające serializację klas<br />{-------------------------------------------------------------------------------<br /> Na dole w głównym bloku begin ... end. znajduje się opis zapisu i odczytu klas<br /> z jak i do pliku ...<br /><br /> ------------------------------------------------------------------------------<br /> /// Funkcje pomocnicze z dtxUtils.pas ///<br /> ------------------------------------------------------------------------------<br /><br /> --- <br /> 1 procedure StringToComponent(Value: string; Comp: TComponent);<br /> ---<br /> ------------------------------------------------------------------------------<br /> Konwertuje dane z łańcucha znaków na dane do obiektu i inicjalizuje<br /> jego dane. Przekazywana klasa Comp musi być wczesniej stworzona.<br /><br /><br /> ---<br /> 2 function ComponentToString(Component: TComponent): string;<br /> ---<br /> ------------------------------------------------------------------------------<br /> Konwertuje komponent na łańcuch<br /><br /><br /> --- <br /> 3 procedure SaveComponent(AFile: string; AComponent: TComponent;<br /> --- AText: boolean = true);<br /> ------------------------------------------------------------------------------<br /> Zapisuje komponent do pliku tekstowego. Parametr AText ustawia czy ma być<br /> to w postaci czytelnej dla człowieka (tekstowej) czy też binarnej.<br /> Wersja binarna zajmuje nieco mniej miejsca.<br /><br /><br /> ---<br /> 4 procedure LoadComponent(AFile: string; AComponent: TComponent;<br /> --- AText: boolean = true);<br /> ------------------------------------------------------------------------------<br /> Robi dokładnie to co SaveComponent tylko w drugą stronę<br /><br /> ------------------------------------------------------------------------------<br /> /// Funkcje i typy pomocnicze z "Classes.pas" ///<br /> ------------------------------------------------------------------------------<br /><br /> ---<br /> 1 type<br /> --- TStreamOriginalFormat = (sofUnknown, sofBinary, sofText);<br /> ------------------------------------------------------------------------------<br /> Typ mówiący o tym w jakiej postaci zapisaliśmy obiekt (binarna/tekstowa)<br /><br /><br /> ---<br /> 2 procedure ObjectBinaryToText(Input, Output: TStream); overload;<br /> --- procedure ObjectBinaryToText(Input, Output: TStream;<br /> var OriginalFormat: TStreamOriginalFormat); overload;<br /> procedure ObjectTextToBinary(Input, Output: TStream); overload;<br /> procedure ObjectTextToBinary(Input, Output: TStream;<br /> var OriginalFormat: TStreamOriginalFormat); overload;<br /> ------------------------------------------------------------------------------<br /> Funkcje konwertujące obiekt w postaci binarnej do tekstowej (i odwrotnie)<br /> operujące na strumieniach<br /><br /><br /> ---<br /> 3 procedure ObjectResourceToText(Input, Output: TStream); overload;<br /> --- procedure ObjectResourceToText(Input, Output: TStream;<br /> var OriginalFormat: TStreamOriginalFormat); overload;<br /> procedure ObjectTextToResource(Input, Output: TStream); overload;<br /> procedure ObjectTextToResource(Input, Output: TStream;<br /> var OriginalFormat: TStreamOriginalFormat); overload;<br /> ------------------------------------------------------------------------------<br /> Funkcje konwertujące postać tekstową do zasobów i odwrotnie<br /><br /><br /> ---<br /> 4 function TestStreamFormat(Stream: TStream): TStreamOriginalFormat;<br /> ---<br /> ------------------------------------------------------------------------------<br /> Funkcja sprawdzająca jakiego typu są dane zserializowanego obiektu<br /><br />{------------------------------------------------------------------------------}<br />type<br /> // "typ" naszej procedury<br /> TOnPrint = procedure of object;<br /><br /> // wrsja gracza 2 :) - zawiera wszystko to co zawierała klasa z poprzedniej<br /> // części + mała nowość :)<br /> TPlayer2 = class(TComponent)<br /> private<br /> FName: string;<br /> FRememberPasswd: boolean;<br /> FPasswd: string;<br /> FOnPrint: TOnPrint;<br /> public<br /> // ---<br /> protected<br /> // ---<br /> published<br /> property Name: string read FName write FName;<br /> property RememberPasswd: boolean read FRememberPasswd write FRememberPasswd;<br /> property Passwd: string read FPasswd write FPasswd stored FRememberPasswd;<br /><br /> // tytaj zaczynają się nowości :) ...<br /> procedure OnPrint1; // mamy dwie procedury do wyboru<br /> procedure OnPrint2;<br /><br /> // pole pamiętające nasz wybór (możemy przypisać mu dowolną metodę będacą<br /> // w sekcji published z klasy w której ów właściwość jest zadeklarowana)<br /> property OnPrint: TOnPrint read FOnPrint write FOnPrint;<br /> end;<br /><br /><br />{ TPlayer2 }<br /><br />procedure TPlayer2.OnPrint1;<br />begin<br /> WriteLn('Wywolano OnPrint1');<br />end;<br /><br />procedure TPlayer2.OnPrint2;<br />begin<br /> WriteLn('Wywolano OnPrint2');<br />end;<br /><br />var<br /> Player: TPlayer2;<br /> c: char;<br />{-------------------------------------------------------------------------------<br /> Poniżej są zastosowane procedury zapisu odczytu klas do plików i strumieni.<br />{------------------------------------------------------------------------------}<br />begin<br /> Player := TPlayer2.Create(nil);<br /><br /> Write('Ktora metode chcesz przypisac do property OnPrint (1 lub 2) : ');<br /> ReadLn(c);<br /> if c = '1' then<br /> Player.OnPrint := Player.OnPrint1<br /> else<br /> Player.OnPrint := Player.OnPrint2;<br /><br /> // Wywołujemy property :)<br /> WriteLn(sLineBreak, 'Za chwile wywolamy metode zapisana w property OnPrint :');<br /> Player.OnPrint;<br /> WriteLn;<br /><br /> WriteLn('Tak wyglada nasza klasa przerobiona na napis :', sLineBreak, sLineBreak,<br /><br /> ComponentToString(Player)<br /><br /> );<br /><br /> // zapisujemy do pliku<br /> SaveComponent('Player.txt', Player);<br /> // i zwalniamy<br /> Player.Free;<br /><br /> WriteLn(sLineBreak,<br /> 'Klasa zostala zapisany do ''Player.txt'' i zwolniona z pamieci. ',<br /> 'Mozesz otworzyc zapisany plik i go zmodyfikowac - za chwile klasa TPlayer2 ',<br /> 'zostanie utworzona na nowo i wlasnie z ''Player.txt'' zostanie wczytana ',<br /> 'zawartosc klasy. Zmodyfikuj plik jak chcesz i wcisnij [ENTER] by ',<br /> 'zaincjalizowac klase i wywolac property OnPrint.');<br /> ReadLn;<br /><br /> // tworzymy obiekt od nowa<br /> Player := TPlayer2.Create(nil);<br /> LoadComponent('Player.txt', Player);<br /> WriteLn('Tak wyglada nasza klasa po wczytaniu z pliku :', sLineBreak, sLineBreak,<br /><br /> ComponentToString(Player)<br /><br /> );<br /><br /> // Wywołujemy property :)<br /> WriteLn('Za chwile wywolamy metode zapisana w property OnPrint :');<br /> Player.OnPrint;<br /> WriteLn;<br /><br /> // zakończ ...<br /> ReadLn;<br /> Player.Free;<br />end.<br /></pre><br /><br /><span style="font-weight:bold;">Część 3</span><br /><pre class="brush: delphi"><br />(*******************************************************************************<br /> Serializacja klas w Delphi cz.3<br /><br /> DaThoX 2004-2008<br /><br /> Maciej Izak (hnb.code[at]gmail[dot]com)<br /><br /> Na dzisiejszej lekcji dowiemy się jak wpleść w klasę TComponent inne klasy<br /> nie dziedziczące z TComponent;<br />(******************************************************************************)<br /><br />program Lesson_03;<br /><br />{$APPTYPE CONSOLE}<br /><br />uses<br /> SysUtils,<br /> Classes, // <- podstawowe klasy z których bedziemy dziedziczyć<br /> Dialogs,<br /> dtxUtils; // <- napisałem procedury ułatwiające serializację klas<br /><br />type<br /> // nasza klasa która chcemy wpleść. Np. gracz ma samochód :)<br /> //<br /> // musimy dziedziczyć z TPersistent - ona zapisuje z RTTI naszej klasy<br /> // właściwości z sekcji published. Moglibyśmy sami napisać taką klasę ale<br /> // ta jest wystarczająco dobra i nic nie dorzuca do TObject. Czyli zamiast<br /> // dziedziczyć po TObject (TKlasa = class lub TKlasa = class(TObject))<br /> // dziedziczymy z TPersistent TKlasa = class(TPersistent)<br /> TCar = class(TPersistent)<br /> private<br /> FName: string;<br /> FMaxSpeed: single;<br /> public<br /> constructor Create(AName: string; AMaxSpeed: single);<br /> published<br /> property Name: string read FName write FName;<br /> property MaxSpeed: single read FMaxSpeed write FMaxSpeed;<br /> end;<br /><br />{ TCar }<br /><br />constructor TCar.Create(AName: string; AMaxSpeed: single);<br />begin<br /> inherited Create;<br /> FName := AName;<br /> FMaxSpeed := AMaxSpeed;<br />end;<br /><br /> // wrsja gracza 3 :) -<br /> // NOWOŚĆ :D Jeśli klasa ma włączone RTTI to od razu po class(TComponent)<br /> // mamy do czynienia z sekcją published :)<br /> // NOWOŚĆ 2 :D<br /> // sprawdź blok begin ... end. aplikacji. Jeśli nadamy wartość polu name z<br /> // TComponent nasz obiekt w wersji tekstowej będzie wyglądał inaczej :)...<br />type<br /> TPlayer3 = class(TComponent)<br /> // tu też jest published !!! tylko ciut inne ;) - omówimy później<br /> //<br /> //<br /> private<br /> FCar: TCar;<br /> public<br /> // musim stworzyć i zniszczyć klasę z pola FCar<br /> constructor Create; reintroduce;<br /> destructor Destroy; override;<br /> published<br /> property Car: TCar read FCar write FCar;<br /> end;<br /><br />{ TPlayer3 }<br /><br />constructor TPlayer3.Create;<br />begin<br /> inherited Create(nil);<br /> FCar := TCar.Create('BMW', 210.6);<br />end;<br /><br />destructor TPlayer3.Destroy;<br />begin<br /> FCar.Free;<br /> inherited;<br />end;<br /><br />var<br /> Player: TPlayer3;<br /> c: char;<br />begin<br /> Player := TPlayer3.Create;<br /><br /> // NADAJEMY Name :D<br /> Player.Name := 'HNB';<br /><br /> WriteLn(<br /><br /> ComponentToString(Player)<br /><br /> );<br /> // zakończ ...<br /> ReadLn;<br /> Player.Free;<br />end.<br /></pre><br /><br />Powodzenia :)! Powyżej zaprezentowane lekcje to tylko niewielki wstęp do całego tematu. Zachęcam do samodzielnego poszerzania wiedzy, albo do czekania na kolejne części :).Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5953912728542946082.post-10745580470220081562009-11-28T02:48:00.012+01:002010-06-08T02:05:49.252+02:00Dyrektywy kompilatora Pascala cz.1 - Symbole predefiniowane<span style="font-weight:bold;">ważne</span>: jeśli dostrzegłeś jakieś braki czekam na komentarz!<br /><br />Zaczniemy od podstaw - omówimy na początek symbole pre-definiowane, które są podstawą do sprawnej kompilacji warunkowej. Na początek trochę nudów i może dla większości rzeczy oczywistych, jednak spokojnie :). Jeden z artykułów będzie o "białych krukach" wśród dyrektyw. <br /><br />Symbole pre-definiowane to symbole które zostały zdefiniowane przez kompilator w zależności od przeróżnych okoliczności (np. system operacyjny linux lub windows). Dzięki temu jesteśmy w stanie generować różny kod. Standardowo sami możemy definiować symbole o wymyślonych przez nas nazwach, bądź je usuwać:<br /><br /><pre class="brush: delphi"><br />{$DEFINE SOME_NAME} // definiujemy symbol o nazwie SOME_NAME<br />{$UNDEF SOME_NAME} // kasujemy symbol o nazwie SOME_NAME<br /></pre><br /><br />Zaczniemy rysem historycznym (uwielbiam te nazwy kodowe!). Przytoczę wersje kodowe produktów, cytując artykuł <a href="http://www.dragonsoft.us/delphi_history.php">"Delphi History"</a> i wzbogacając go o nowe pozycje (uwzględniając najnowszy <a href="http://dn.embarcadero.com/article/39934">"RAD Studio, Delphi and C++Builder Roadmap"</a>):<br /><br />Project <span style="font-weight:bold;">Commodore </span>2010/2011<br />Project <span style="font-weight:bold;">Delphi "X"</span> 2010<br />Embarcadero RAD Studio 2010 <span style="font-weight:bold;">Weaver </span>2009<br />CodeGear C++ Builder 2009 <span style="font-weight:bold;">Barracuda </span>2008<br />CodeGear RAD Studio 2009 - Unicode <span style="font-weight:bold;">Tiburón </span>2008<br />CodeGear RAD Studio 2007 <span style="font-weight:bold;">Highlander </span>2007, Sept 5<br />Chrome 2.0 by RemObjects <span style="font-weight:bold;">Joyride </span>2007, Aug 1<br />CodeGear C++ Builder 2007 <span style="font-weight:bold;">Cogswell </span>2007, June 5<br />CodeGear Delphi for PHP <span style="font-weight:bold;">Astro </span>2007, Mar 27<br />CodeGear Delphi 2007 for Vista and AJAX <span style="font-weight:bold;">Spacely </span>2007, Mar 19<br />Borland Developer Studio 2006 - W32, .Net, C++ and C# <span style="font-weight:bold;">DeXter </span>2005, Oct 10<br />Borland Delphi 2005 - C# and Delphi <span style="font-weight:bold;">Diamondback </span>2004, Oct 12<br />Borland Delphi 8 for .Net <span style="font-weight:bold;">Octane </span>2003, Dec 22<br />Borland C++BuilderX <span style="font-weight:bold;">Tomahawk </span>2003, Aug 28<br />Borland C#Builder 1.0 <span style="font-weight:bold;">Sidewinder </span>(Galileo IDE 1.0) 2003, Jun 16<br />Borland Delphi.NET compiler (.Net 1.0) <span style="font-weight:bold;">Morpheus </span>2003<br />Borland Delphi 7 <span style="font-weight:bold;">Aurora </span>2002, Aug 9<br />Borland C++ Builder 6.0 <span style="font-weight:bold;">Riptide </span>2002, Feb 1<br />Borland Delphi 6 <span style="font-weight:bold;">Illiad </span>2001, May 21<br />Borland C++ Builder 5.0 <span style="font-weight:bold;">Rampage </span>2000, Jan 30<br />Borland Delphi 5 <span style="font-weight:bold;">Argus </span>1999, Aug 10<br />Borland Delphi/400 <span style="font-weight:bold;">outsourced </span>1999, Feb<br />Borland Delphi 4 <span style="font-weight:bold;">Allegro </span>1998, Jun 17<br />Borland Delphi 3 <span style="font-weight:bold;">Ivory </span>1997, Aug 5<br />Borland Delphi 2 32bit/Win95 <span style="font-weight:bold;">Polaris </span>1996, Feb 10<br />Borland <span style="font-weight:bold;">Delphi 1</span> 16bit/Win3.x <span style="font-weight:bold;">Delphi95, Wasabi, Mango, AppBuilder</span> 1995, Feb 14<br /><br />i teraz poniżej zobaczmy, jakimi symbolami pre-definiowanymi zostały oznaczone poszczególne wersje, nie tylko Delphi ale i C++ (możliwe jest miksowanie kodu C++ i Delphi), w oparciu o artykuł <a href="http://delphi.wikia.com/wiki/Borland_Compiler_Conditional_Defines">"Borland Compiler Conditional Defines"</a><br /><br /><pre class="brush: delphi"><br />{$DEFINE VER210} // Embarcadero RAD 2010 v14.0<br />{$DEFINE VER200} // CodeGear Delphi 2009 v12.0<br />{$DEFINE VER200} // CodeGear C++ Builder 2009 v12.0<br />{$DEFINE VER190} // CodeGear Delphi 2007 for .NET v11.0<br />{$DEFINE VER185} // CodeGear Delphi 2007 for Win32 v11.0<br />{$DEFINE VER180} // CodeGear Delphi 2007 for Win32 v11.0<br />{$DEFINE VER180} // Borland Developer Studio 2006 v10.0<br />{$DEFINE VER170} // Borland Delphi 2005 v9.0<br />{$DEFINE VER160} // Borland Delphi 8 for .NET v8.0<br />{.$DEFINE ?} // C++BuilderX<br />{$DEFINE VER160} // Borland C#Builder v1.0<br />{$DEFINE VER150} // Borland Delphi 7 v7.0<br />{$DEFINE VER140} // Borland Kylix 3 v3.0<br />{$DEFINE VER140} // Borland C++Builder 6<br />{$DEFINE VER140} // Borland Kylix 2 v2.0<br />{$DEFINE VER140} // Borland Delphi 6 v6.0<br />{$DEFINE VER140} // Borland Kylix v1.0<br />{$DEFINE VER130} // Borland C++Builder 5<br />{$DEFINE VER130} // Borland Delphi 5 v5.0<br />{$DEFINE VER125} // Borland C++Builder 4<br />{$DEFINE VER120} // Borland Delphi 4 v4.0<br />{$DEFINE VER110} // Borland C++Builder 3<br />{$DEFINE VER100} // Borland Delphi 3 v3.0<br />{.$DEFINE ?} // Borland C++ 5<br />{$DEFINE VER93} // Borland C++Builder 1<br />{$DEFINE VER90} // Borland Delphi 2 v2.0<br />{.$DEFINE ?} // Borland C++ 4.5<br />{$DEFINE VER80} // Borland Delphi v1.0<br />{.$DEFINE ?} // Borland C++ 4<br />{$DEFINE VER70} // Borland Pascal 7 v7.0<br />{.$DEFINE ?} // Borland C++ 3.1<br />{$DEFINE VER70} // Turbo Pascal for Windows 1.5 v1.5<br />{.$DEFINE ?} // Turbo C++ for DOS 3<br />{.$DEFINE ?} // Borland C++ 3<br />{.$DEFINE ?} // Turbo C++ for Windows 3 (Win16)<br />{.$DEFINE ?} // Turbo Pascal for Windows 1.0 v1.0<br />{.$DEFINE ?} // Borland C++ 2<br />{$DEFINE VER60} // Turbo Pascal 6 v6.0<br />{.$DEFINE ?} // Turbo C++ for DOS<br />{.$DEFINE ?} // Turbo C for DOS 2<br />{$DEFINE VER55} // Turbo Pascal 5.5 v5.5<br />{.$DEFINE ?} // Turbo C for DOS v1.5<br />{$DEFINE VER50} // Turbo Pascal 5 v5.0<br />{$DEFINE VER40} // Turbo Pascal 4 v4.0<br />{.$DEFINE ?} // Turbo C for DOS<br />{.$DEFINE ?} // Turbo Pascal 3 v3.0<br />{.$DEFINE ?} // Turbo Pascal 2 v2.0<br />{.$DEFINE ?} // Turbo Pascal 1 v1.0<br /></pre><br /><br />Nieźle? :D To nie wszystko. Istnieją także symbole definiowane w zależności od środowiska/warunków/wersji w jakim kod został skompilowany (część z nich można znaleźć <a href="http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/compdirsconditionalcompilation_xml.html">na tej oficjalnej stronie</a>).<br /><pre class="brush: delphi"><br />{$DEFINE CONSOLE} // defioniowana w projektach gdzie została użyta dyrektywa {$APPTYPE CONSOLE}<br />{$DEFINE CONDITIONALEXPRESSIONS} // definiowane w przypadku gdy możliwe jest testowanie warunków poprzez używanie dyrektywy $IF<br />{$DEFINE DEBUG} // gdy kompilujemy kod w trybie debugowania<br />{$DEFINE CPU386} // procesor Intel 386 i późniejszy<br />{$DEFINE WINDOWS} // używamy Windowsa - definicja "depracted" i zalecane jest używanie MSWINDOWS<br />{$DEFINE MSWINDOWS} // używamy Windowsa<br />{$DEFINE WIN32} // Windows 32 bitowy<br />{$DEFINE WIN64} // Windows 64 bitowy<br />{$DEFINE LINUX} // Linux<br />{$DEFINE NOT} // zebezpiecznie kou przed próbami automatycznej modyfikacji na różnych platformach<br />{$DEFINE MACOSX} // MacOSX! :D (pojawia się w kodzie D2010)<br />{$DEFINE UNICODE} // Wersja Delphi z unicode<br />{$DEFINE RTL} // wersja Delphi dla .NET<br /></pre><br />Zgrzeszyłbym nie przedstawiając pre-definiowanych symboli w FreePascalu. FreePascal posiada szereg swoich własnych symboli nieco odmiennych czy wybrakowanych w stosunku do Delphi, jednak istnieje plik zgrabnie ujednolicający definicje FPC i Delphi (patrz niżej opis pliku jedi.inc). Poniższa lista powstała w oparciu o <a href="http://www.freepascal.org/docs-html/prog/progap7.html#x323-323000G">"Appendix G - <br />Compiler defines during compilation"</a> gdzie można odnaleźć bardziej kompletne zestawienie.<br /><br /><pre class="brush: delphi"><br />{$DEFINE FPC_LINK_DYNAMIC} // Kiedy ustawiliśmy linkowanie dynamiczne<br />{$DEFINE FPC_LINK_STATIC} // Dla linkowania statycznego (domyślnie)<br />{$DEFINE FPC_LINK_SMART} // Defioniowane dla "sprytnego linkowania" (ang. smartlinking)<br />{$DEFINE FPC_CROSSCOMPILING} // Kiedy docelowa platforma jest inna niż ta na któej kompilujemy<br />{$DEFINE FPC} // Definiowane dla FreePascala<br />{$DEFINE VER2} // Definiowane dla Free Pascala 2.x.x.<br />{$DEFINE VER2_0} // Definiowane dla Free Pascala 2.0.x.<br />{$DEFINE VER2_2} // Definiowane dla Free Pascala 2.2.x.<br />{$DEFINE FPC_DELPHI} // Free Pascal w "Delphi mode" (dyrektywa $MODE DELPHI)<br />{$DEFINE FPC_OBJFPC} // Free Pascal w "OBJFPC mode" (dyrektywa $MODE OBJFPC)<br />{$DEFINE FPC_TP} // Free Pascal w "Turbo Pascal mode" (dyrektywa $MODE TP)<br />{$DEFINE FPC_GPC} // Free Pascal w "GNU Pascal mode" (dyrektywa $MODE GPC)<br /></pre><br /><br />Jeszcze więcej o symbolach pre-definiowanych możemy znaleźć w pliku <a href="https://jcl.svn.sourceforge.net/svnroot/jcl/trunk/jcl/source/include/jedi.inc">jedi.inc</a> - jest to bardzo użyteczny plik, który po dołączeniu za pomocą dyrektywy<br /><br /><pre class="brush: delphi"><br />unit Unit1;<br />{$I jedi.inc}<br />interface {...}<br /></pre><br /><br />umożliwia nam łatwiejsze sprawdzanie co/jak/która wersja (np. definiuje DELPHI6_UP - symbol definiowany dla Delphi6 i każdego następnego) . Zachęcam do jego analizy. Jako alternatywy można też użyć pliku <a href="http://gexperts.svn.sourceforge.net/viewvc/gexperts/trunk/Source/Framework/GX%5FCondDefine.inc?view=markup">GX_CondDefine.inc</a> z pluginu <a href="http://www.gexperts.org/">gexperts</a> (informacja pochodzi z <a href="http://stackoverflow.com/questions/750801/complete-list-of-defines-for-delphi-versions">tej strony</a>)<br /><br />New art soon. gl&hfUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-5953912728542946082.post-90534824978361378102009-11-27T22:39:00.004+01:002009-11-28T02:48:22.640+01:00Kolorowa składni i nowy charakter blogaNowy charakter bloga. Od dzisiaj poza newsami będę wrzucał trochę kodu :). Pokolorowane dzięki <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter">SyntaxHighlighter</a> i z pomocą wpisu na <a href="http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html">Carter Cole's Blog</a><br /><br />Myślę że kilka osób na to czekało ^^. Z góry dzięki za ewentualne sugestie i propozycja poprawek błędów.<br /><br /><script type="syntaxhighlighter" class="brush: delphi"><![CDATA[<br />program HNB;<br />begin<br />end.<br />]]></script><br /><br />:DUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-5953912728542946082.post-13349733704591777722009-07-03T21:44:00.014+02:002009-09-06T16:37:28.701+02:00Delphi - nowe wrażenia - potęga języka na przestrzeni latDobra na Delphi nie mogę się gniewać bo Delphi jest jak kobieta. Co gorsze trochę kosztuje - podobnie jak płeć piękna.<br /><br />Założę się, że większość z was nie miała pojęcia o istnieniu wszystkich elementów Object Pascala. Poniżej wymieniłem najistotniejsze zmiany wprowadzone w samym tylko języku od czasów Delphi 6 na przestrzeni około 7 lat:<br /><br /><span style="font-weight:bold;">Delphi 7</span> "Aurora"<br />-Rozbudowane możliwości typu variant i odseparowania na osobny unit elementów związanych z typem variantowym do "variants.pas" <br />-Poszerzone informacje czasu wykonania dla metod klas w zastępstwie sekcji klasy "automated" <br /><br /><span style="font-weight:bold;">Delphi 2005</span> "Diamondback"<br />-Pętla "for in do" na wzór foreach z php <br />-Słowa kluczowe dla bezpieczeństwa kodu czyli oznaczenia experimental <br />-Łatwe tworzenie tablic dynamicznych <br />-Procedury / funkcje / metody inline <br /><br /><span style="font-weight:bold;">Delphi 2006 i Delphi 2007</span> (D2007 naprawia głównie błędy z D2006) "DeXter" i "Spacely"<br />-Przeciążenia operatorów <br />-Opisy dla depracted<br />-Rewelacyjny menager pamięci FastMM, za który autor dostaje do końca życia za darmo nowe wersje Delphi! <br />-Statyczne metody <br />-Nieinstancyjne "class property"<br />-Zmienne statyczne<br />-Typy wewnątrz definicji klas<br />-Tworzenie sekcji var/type na przemian z deklarowaniem procedur wewnątrz definicji klas<br />-Rekordy mogą przyjmować część cech klas (np. metody w rekordach, konstruktory rekordów)<br />-Pomocnicze regiony w kodzie jak w C#<br />-Klasy / rekordy pomocnicze<br />-Słowa kluczowe precyzujące kontekst użycia klas (abstract i sealed)<br />-Sekcje strict<br />-Dyrektywa final do metod wirtualnych<br /><br /><span style="font-weight:bold;">Delphi 2009</span> "Tiburón"<br />-Matematyka wskaźników na wzór C<br />-Metody anonimowe <br />-Używanie klas jako procedur / funkcji związane z metodami anonimowymi <br />-Typy generyczne i cała infrastruktura języka z tym związana <br />-Exit działające opcjonalnie jak return w C <br />-Unicode i infrastruktura języka związana z kodowaniem regionalnym dla typów AnsiString i wsparcie ze strony RTL<br /><br /><span style="font-weight:bold;">Delphi Weaver</span> (w fazie beta)<br />-Łatwiejsze tworzenie singletonów (statyczne konstruktory)<br />-Dyrektywa delayed<br />-Atrybuty<br />-Rozbudowa RTTI i RTL od RTTI, a z tym wiele ciekawych nowości (np. wywoływanie metod w czasie działania aplikacji - na potrzeby skryptów. Co prawda jest to możliwe znacznie wcześniej jednak technika ta nie jest tak oczywista i jest nieudokumentowana!)<br /><br />I <span style="font-weight:bold;">do wszystkich wersji</span> ;):<br />-Spora rozbudowa RTL związana z nową składnią<br /><br /><br />Niech mnie ktoś poprawi jeśli coś przeoczyłem bo pisałem to z głowy. Zabawne jest to jak ludzie krytykują Delphi, nie mając nawet pojęcia o ułamku możliwości i ułatwień jakie w ze sobą niesie. (Delphi jest dla mnie jak pyszne ciasteczko z kawą xD!)<br /><br />Jest to na chwilę obecną jedyny język tak twardo stojący natywnie a zarazem udostępniający ułatwienia "platformy" .NET, przy czym to Delphi jest prekursorem i wzorcem dla .NET, a nie odwrotnie :)!<br /><br />PS. Najbardziej bolesne jest to, że jedne z ciekawszych elementów składni (w tym niektóre z tych przedstawione w powyższej liście czy dyrektyw służących optymalizacji są nieudokumentowane! Szczerze to tylko niewielka grupa "wtajemniczonych" programistów Delphi ma szersze pojęcie i niestety aby dowiedzieć się pewnych rzeczy trzeba mieć po prostu szczęście...<br /><br /><span style="font-style:italic;">Podziękowania dla Force za przypomnienie o sekcjach strict i sugestii o podziale na wersje</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5953912728542946082.post-8469549042713593382009-05-21T17:35:00.003+02:002009-05-21T17:44:20.742+02:00Delphi X , Delphi Weaver, Delphi 64Straciłem motywację do pisania postów. Po pierwsze powodem jest niezbyt miły kontakt z CodeGear, a po drugie nie ma nic o darmowym Delphi. Na nieszczęście jest mnóstwo informacji i nowinek o samym Delphi. W związku z brakiem chęci tak tylko skrótowo:<br /><br />Delphi Waver/Commodore 64 - trwają beta testy nowego Delphi. W wersji rozbudowano RTTI, i lada dzień mają zostać wprowadzone 64 bity. Na beta-testera prawdopodobnie można się jeszcze zapisać pod adresem <a href="http://beta.embarcadero.com">beta.embarcadero.com</a><br /><br />Delphi X - nie chodzi tu o komponent. Ten mroczny tytuł to kodowa nazwa natywnego Delphi dla MacOS X i LinuXa.<br /><br />Long life Delphi dla kasiastych ludzi i koncernów -,-<br /><br />żal.pl...Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5953912728542946082.post-75410740878447067142009-03-22T11:29:00.003+01:002009-03-22T12:05:48.048+01:00Delphi?Ciągle żyję i pamiętam o blogach. Tylko marność nad marnościami, nie widać na horyzoncie nowego darmowego Delphi. Nie odpisują. Olewają. Po ostatnich kontaktach z CodeGear mam szczerze dość.<br /><br />Tylko M$ dba o przyszłe pokolenia programistów. Czy CG nie rozumie że nie wspierając młodych tylko na tym traci? -,-Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5953912728542946082.post-24729584334084236192009-01-13T20:59:00.002+01:002009-01-13T21:02:51.118+01:00The Future of the Delphi CompilerOstatnio w DN ukazał się ciekawy artykuł pana Nicka Hodgesa odnośnie przyszłości kompilatora Delphi. Przyszłość rysuje się naprawdę kolorowymi barwami :D. Po pierwsze w skrócie w planach jest napisanie kompilatora od nowa, umożliwiając używanie starego dla kompatybilności. Właśnie przez tą kompatybilność składnia Delphi troszeczkę stoi w miejscu. Zresztą co będę pisał - przeczytajcie i oceńcie sami!<br /><a href=" http://dn.codegear.com/article/39174"><br />http://dn.codegear.com/article/39174</a><br /><br />Gorąco zachęcam do lektury.Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5953912728542946082.post-76413573022530933992008-12-23T12:09:00.003+01:002008-12-23T12:17:33.307+01:00Pax Compiler 2.2<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JMmEfORz1-o/SVDIg44wt7I/AAAAAAAAADI/HQe6E1pN1qo/s1600-h/paxcompiler.gif"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 120px; height: 120px;" src="http://2.bp.blogspot.com/_JMmEfORz1-o/SVDIg44wt7I/AAAAAAAAADI/HQe6E1pN1qo/s320/paxcompiler.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5282942830257420210" /></a><br />Ukazała się nowa wersja PaxCompiler 2.2<br /><br />W najnowszej wersji:<br /><br />-skrypty mają RTTI zgodne z tym z Delphi<br />-umożliwiają tworzenie pól, metod i właściwości w sekcji published<br />-obsługują pliki *.dfm<br /><br />Czyli wszystko na co czekam od wakacji :). Teraz to ja mogę programować. Jeśli ktoś się przymierza do zakupu PaxCompiler to jest ku temu dobry moment. Z okazji gwiazdki Alexander Baranovsky przygotował zniżkę w wysokości 30% (pewnie też odczuwa kryzys i ludzie przestali kupować...)<br /><br /><a href="http://www.paxcompiler.com">www.paxcompiler.com</a><br /><br />Polecam!Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5953912728542946082.post-89173016801483086722008-12-20T03:40:00.005+01:002008-12-20T03:48:33.202+01:00Wikipedia i moje wypowiedzi :)<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JMmEfORz1-o/SUxbfGAxZHI/AAAAAAAAAB4/nB7wYhAswIs/s1600-h/Wiki.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 135px; height: 155px;" src="http://4.bp.blogspot.com/_JMmEfORz1-o/SUxbfGAxZHI/AAAAAAAAAB4/nB7wYhAswIs/s320/Wiki.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5281697052746671218" /></a><br />Tak z Ciekawości zaglądam dzisiaj na Wikipedię w hasło "Delphi" a tu moje newsy i informacje o Delphi wplecione w teksty hasła... Czyżbym był chodzącą encyklopedią xD?<br /><br />PS. Wnioski? Czytajcie mojego bloga, a będziecie szybciej doinformowani ;). Zanim to wszystko trafi na wiki albo do encyklopedii PWN, zapewne minie trochę czasu ;D...Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5953912728542946082.post-75536035696357990902008-12-20T03:12:00.005+01:002008-12-20T03:45:44.076+01:00Święta, święta. Delphi i piękne plany na 2009Zacznę od nowości, wyciągniętych z Nicka Hodgesa podczas jego "sesji" dla programistów w Europie:<br /><br />-Rok 2009 ma upłynąć pod szyldem <span style="font-weight:bold;">RTTI</span> w Delphi (ułatwienia w jego eksploatowaniu). <br />-<span style="font-weight:bold;">Natywna kompilacja do innych systemów operacyjnych</span>(!).<br />-64 bity (ci co oczekiwali wcześniej nieco się rozczarują) w 2010<br />-VCL i dotykowe ekrany (coraz popularniejsze w UMPC - np. w 2009 mają wyjść MSI czy bardziej popularne 9-calowe eee z dotykowymi ekranami, więc netbookowe "tablety" powinny być osiągalne dla każdego)<br /><br />Pięknie :D<br /><br />Komentarz z mojej strony - o kompilacji programów tworzonych przy pomocy VCL do innych systemów raczej można zapomnieć. <span style="font-weight:bold;">VCL jest dla Windows</span>. W grę wchodzi jedynie (aż!) a może po prostu, kompilacja multiplatformowa.<br /><br />Prawie pewne jest, że dostaniemy za darmo co najmniej kompilator w postaci linii poleceń. Czy coś więcej? Zobaczymy.<br /><br />Osobiście jestem najbardziej zadowolony z zapowiedzi o RTTI. Szykuje nam się <span style="font-weight:bold;">prawdziwe natywne .NET</span> ;)<br /><br />PS. Trochę nie lubię świąt, bo tu gdzie obecnie jestem mam nieco wolniejszy internet, a co gorsza nie mam nawet Delphi... -,- ;)Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5953912728542946082.post-90753658808560464932008-12-13T22:39:00.004+01:002008-12-13T22:56:48.451+01:00Oxygene za darmo<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JMmEfORz1-o/SUQr0l_YqVI/AAAAAAAAABw/cEorfFwpM34/s1600-h/Prism.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 60px;" src="http://1.bp.blogspot.com/_JMmEfORz1-o/SUQr0l_YqVI/AAAAAAAAABw/cEorfFwpM34/s320/Prism.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5279392845736225106" /></a><br />Cieszcie się narody, albowiem oto CodeGear udostępnia za darmo kompilator Oxygene. A nie robi tego typowo i zaprawdę powiadam wam udostępnia za darmo :) ("It’s free as in beer").<br /><br /><a href="http://cc.codegear.com/Free.aspx?id=26256">http://cc.codegear.com/Free.aspx?id=26256</a><br /><br />Ciekawe czy ktoś w dzisiejszych czasach, wszechobecnych środowisk programistycznych i WYSIWYG potrafi jeszcze używać linii poleceń ? ;)Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-5953912728542946082.post-57142171197849079322008-12-09T15:39:00.002+01:002008-12-09T15:44:29.149+01:00Delphi na Linuxa i Maca?!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JMmEfORz1-o/ST6DlgT64YI/AAAAAAAAABo/wjx1OAcE6a4/s1600-h/04_small.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 309px; height: 320px;" src="http://1.bp.blogspot.com/_JMmEfORz1-o/ST6DlgT64YI/AAAAAAAAABo/wjx1OAcE6a4/s320/04_small.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5277800493676683650" /></a><br />Na konferencji CodeRage III został zaprezentowany krótki Roadmap na przyszłość (to chyba nie jest oficjalny roadamap, ale zapowiedzi można traktować poważnie). Wygląda to naprawdę optymistycznie!<br /><br />Czyżby Delphi za jakiś czas miało naprawdę kopać jak za starych dobrych czasów? :)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5953912728542946082.post-9032999610528269672008-11-25T20:34:00.005+01:002008-11-27T23:01:25.055+01:00PaxCompiler v2.123 listopada ukazała się nowa wersja zaawansowanego języka skryptowego PaxCompiler.<br /><br />PaxCompiler jest językiem skryptowym JIT co oznacza, że kod skryptu jest kompilowany do kodu maszynowego (brak warstwy pośredniczącej w wykonaniu skryptu, przez co zyskujemy na wydajności).<br /><br />Nie sposób nie zauważyć, że język skryptowy cechuje się ogromną integralnością z Delphi (podobnie jak z FreePascalem, oraz w mniejszym stopniu z VC++), co niewątpliwie sprzyja prostocie w użyciu i przyspieszonej wymianie danych. Co więcej umożliwia generowanie własnych plików EXE (PaxCompiler jest czymś na pograniczu języka skryptowego a kompilatora).<br /><br />Docelowo składnia PaxCompiler (właściwie dialekt Object Pascala oparty na silniku PaxCompilera) ma być kompatybilna z tą znaną z Delphi 7. Dodatkowe języki które moją zagościć na silniku PaxCompiler to JavaScript, C i Basic (mini środowisko .NET ;))<br /><br />W obecnej wersji do nowości należy:<br />-zgodność z Delphi 2009<br />-Częściowa kompatybilność klas zdefiniowanych w Delphi z tymi w skrypcie (w klasach skryptowych możemy dziedziczyć po klasach zdefiniowanych w Delphi<br />-usprawnienia interfejsu<br />-zlikwidowanie masy błędów<br /><br />Nie sposób streścić całej funkcjonalności w krótkim poście, ponieważ PaxCompiler niewątpliwie zasługuje na osobną, dedykowaną książkę. <br /><br />Strona projektu: <a href="http://paxcompiler.com">www.paxcompiler.com</a>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5953912728542946082.post-3839227831353654022008-11-05T12:07:00.006+01:002008-11-16T03:04:13.108+01:00Pogaduchy i pytania o DelphiWarto utrwalić kilka rzeczy o które jestem często pytany. Pytania i odpowiedzi (moje) pochodzą z komentarzy na gamedev (wersja na blogu jest nieco wzbogacona). Jak ktoś znowu zada jedno z tych pytań albo pytanie dość podobne będę odsyłał do tego wpisu :)<br /><br /><hr>Quavitor <br /><span style="font-weight:bold;">Borland ratuje się przed upadkiem? </span> (Pytanie odnośnie nowych wersji Delphi i nowej polityki odnośnie Delphi. Ale Borland... Zresztą przeczytaj dalej ;))<br /><br /><u>Borland dawno "upadło" i nie jest już właścicielem Delphi ani C++ Buildera.</u> Przed upadkiem Borland wydzieliło z siebie CodeGear zajmujące się tylko narzędziami dla programistów. CodeGear zostało kupione przez Embarcadero (właściwie od chwili wydzielenia CodeGear było na sprzedaż). Borland zajmuje się teraz czymś w stylu wspomagania biznesu (jakieś narzędzia korporacyjne do zarządzania cyklem życia aplikaji)... Tylko ja bym nic od nich nie kupił... Co to za firma co traci swoje sztandarowe produkty i dojne krowy?<br /><br />Osoby pracujące w CodeGear twierdzą, że odkąd zostali przejęci przez Embarcadero, Delphi i C++ Builder nigdy nie miał się aż tak dobrze. <u>Cóż - zarówno komfort pracy jest dość istotny, a ten wzrósł znacząco (poczucie psychiczne itd).</u><br /><br />Zobaczymy co z tego wyjdzie. Dopiero niedawno zakończył się proces przejmowania dość sporej firmy jaką było CodeGear. A dotychczasowe efekty pracy Embarcadero i zapowiedzi są naprawdę obiecujące.<br /><hr>Quavitor<br /><span style="font-weight:bold;">A moim zdaniem wsadzanie Delphi w objecia .NET to blad. Tam niepodzielnie rzadzi MS ze swoim C# i nie widze najmniejszego powodu dla ktorego np. ja mialbym sie uczyc teraz Delphi. Lepiej bylo zostac i rozwijac natywne aplikacje na bazie VCL czy czego innego, przynajmniej bylaby jakas alternatywa dla .NET a tak nie ma nic. .NET nie jest idealne i posiada spory narzut.</span><br /><br /><span style="font-weight:bold;">Jak wlasciwie sie ma Delphi dla natywnego kodu ? Zyje jeszcze czy juz drgawki przedsmiertne ? </span><br /><br />Odpowiadając na Twój komentarz to właśnie porzucono Delphi for .NET i VCL.NET. Nie będą już tracić na nie pieniędzy ani czasu. Po prostu pod szyldem Delphi Prism, jest kompilator innej firmy. Chodzi o "Oxygene" firmy RemObjects. <u>Oxygene powstał niezależnie od Delphi for .NET i je mocno przegonił</u> pod względęm możliwości dla platformy .NET. Dzięki współpracy CodeGear i RemObject korzyści sa obopulne. Ta pierwsza nie zostawia na lodzie dawnych userów "Delphi for .NET" a druga ma większy rynek zbytu.<br /><br />Dzięki temu CodeGear robi "focus" na natywne Delphi (i jego IDE), bardzo "agresywnie" jak to określają twórcy. Mają nawet część składni "Oxygene" przenieść do natywnego Delphi (zabawki z .NET dostępne w natywnym języku !).<br /><br />D<u>elphi dla natywnego kodu ma się dobrze jak nigdy dotąd!</u> Zobacz najnowsze Delphi 2009 - Typy generyczne (i można by powiedzieć, że jest też coś w stylu STL), metody anonimowe(!), unicode i wsparcie składniowe dla niego, ze strony języka.<br /><br />A to dopiero początek. <u>W planach jest standaryzacja Delphi</u> (a raczej Object Pascala), by je wzmocnić w stosunku do np. C++.<br /><br />PS. Z tego co zaobserwowałem, przeważająca liczba wpisów na wszelakiej maści blogach, forach, grupach dyskusyjnych, wyrażała niezadowolenie z zaniedbania natywnego Delphi na rzecz .NET. Na szczęście dobrze się dzieje - programiści którzy zdecydowali się na Delphi dla .NET mają teraz bardziej zaawansowany Delphi Prism i narzędzia do konwersji starych projektów na nowe środowisko. <br /><br />Natywne Delphi rośnie ku uciesze większości :)!Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5953912728542946082.post-53039843075989922072008-11-04T12:27:00.004+01:002008-11-04T12:35:56.453+01:00Underground<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JMmEfORz1-o/SRAzmFoVa7I/AAAAAAAAABM/XOyZLuPIlrc/s1600-h/images.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 101px; height: 139px;" src="http://4.bp.blogspot.com/_JMmEfORz1-o/SRAzmFoVa7I/AAAAAAAAABM/XOyZLuPIlrc/s320/images.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5264764693835508658" /></a><br />Otworzyłem właśnie nową sub stronę powiązaną z Delphi.<br /><br />Znajdują się na niej takie informacje jak : "instalacja komponentów w Turbo Delphi", "instalowanie kilku edycji Turbo Delphi obok siebie" i inne magiczne sztuczki :)<br /><br /><a href="http://underground.dathox.com">underground.dathox.com</a><br /><br />Chwilowo zostaje przy blogerze, pomimo, że zgromadzone materiały zasługują na osobną dedykowaną stronę (+ info o mnie i jakiś download). Taka strona już jest gotowa tylko postanowiłem sobie, że zanim trafi do internetu muszę ukończyć kilka innych projektów i dopiero wtedy trafi do sieci z pewnym "portfolio".<br /><br />I nie jest to zwykła strona ;)... Ma sporo grafik...Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5953912728542946082.post-18646172157793033432008-11-02T22:23:00.004+01:002008-11-02T23:22:21.451+01:00<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JMmEfORz1-o/SQ4eTOvusrI/AAAAAAAAABE/2iIpaNKkkdE/s1600-h/turbopascalv1bytead_814.thumbnail.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 92px; height: 128px;" src="http://3.bp.blogspot.com/_JMmEfORz1-o/SQ4eTOvusrI/AAAAAAAAABE/2iIpaNKkkdE/s320/turbopascalv1bytead_814.thumbnail.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5264178330167325362" /></a><br />Turbo Pascal kończy w listopadzie 25 lat :^) <br /><br />Za wiele o nim nie napiszę bo mnie jeszcze na świecie nie było, ale zawsze z sentymentem będę wspominał Turbo Pascala 5.5, moje gry tekstowe, pierwsza gra "Kwadracik" (malowanie dróg) i książkę "Pisanie gier 2D i 3D w Turbo Pascalu" Piotra Besty...<br /><br />więcej pod linkiem : <a href="http://blogs.codegear.com/davidi/2008/11/01/38931/">http://blogs.codegear.com/davidi/2008/11/01/38931/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5953912728542946082.post-24962619240650374522008-10-30T03:00:00.006+01:002008-10-30T19:58:09.314+01:00XNA 3.0 dla C# i... Oxygene!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JMmEfORz1-o/SQkYcHRszRI/AAAAAAAAAAk/l6Zb_QgLHnQ/s1600-h/Xnalogo.PNG"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 236px; height: 107px;" src="http://4.bp.blogspot.com/_JMmEfORz1-o/SQkYcHRszRI/AAAAAAAAAAk/l6Zb_QgLHnQ/s320/Xnalogo.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5262764510827826450" /></a><br /><span style="font-weight:bold;">Ogólnie</span>:<br /><br />Dnia dzisiejszego światło dzienne ujrzy XNA 3.0. XNA jest to zestaw narzędzi firmy Microsoft do programowania gier na systemy Windows (z wykorzystaniem technologii .NET), Xbox czy ZUNE. <br /><br />Jedną z najważniejszych cech nowego XNA jest wsparcie dla C# 3.0, by w pełni korzystać z nowej składni języka.<br /><br />W tej wersji, XNA pierwszy raz wspiera platformę ZUNE i Xbox Live. XNA 3.0 jest tworzone pod IDE C# Visual Studio 2008.<br /><span style="font-weight:bold;"><br />Pascal/Oxygene XNA</span>:<br /><br />Oxygene jest kompilatorem Object Pascala dla platformy .NET (Mono + .NET Microsoftu), który powstał obok kompilatora "Delphi for .NET". Ostatnio Oxygen zastąpił Delphi for .NET jako język znacznie bardziej zaawansowany i wspierający dodatkowo Mono.<br /><br />Twórcy Oxygene co rusz sprawiają nam miłe niespodzianki. Począwszy od zapowiedzi <a href="http://delphi.dathox.com/2008/10/nowa-skadnia-delphi.html">ulepszania języka Delphi</a> for Win32 (przejmie część składni Oxygene) to poinformowali jeszcze, że umożliwią korzystanie z XNA w Oxygene (obecnie Oxygene jest częścią <a href="http://delphi.dathox.com/2008/10/delphi-prism.html">Delphi Prism</a>)! Gdy tylko pojawi się na ten temat więcej informacji, spodziewajcie się kolejnego wpisu :).<br /><br /><span style="font-weight:bold;">Update:</span> Nowe XNA można już ściągać pod adresem <a href="http://creators.xna.com/">creators.xna.com/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5953912728542946082.post-24875380201513579812008-10-29T20:24:00.020+01:002008-10-29T21:10:03.961+01:00Lazarus 0.9.26 i komentarze rodem z "Delphi"<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JMmEfORz1-o/SQi5MpWYNqI/AAAAAAAAAAc/rf84Ad9bQGU/s1600-h/lazarus_logo_small.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 211px; height: 154px;" src="http://1.bp.blogspot.com/_JMmEfORz1-o/SQi5MpWYNqI/AAAAAAAAAAc/rf84Ad9bQGU/s320/lazarus_logo_small.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5262659791491708578" /></a>Lazarus to alternatywne IDE dla Delphi 7, umożliwiające tworzenie w LCLu (odpowiednik VCLa), używające kompilatora Free Pascal. Tak nie raz nie dwa próbowałem go używać. Niestety za każdym razem zniechęcało mnie małe "coś". I tak za wersji 0.9.24 zniechęcił mnie błąd kolorowania składni komentarzy... Niby mała niedogodność jednak skutecznie uniemożliwiająca pracę...<br /><br />Uwielbiam stosować czytelne komentarze w stylu:<br /><pre><font color="green"><span style="font-style:italic;">{------------------------------------------------------------<br /> Opis<br />{-----------------------------------------------------------}</span></font></pre>Co w domyślnej składni FreePascala jest niepoprawne (nonsens! i moim zdaniem kompletnie nieprofesjonalne, utrudniające pracę)... Bo w owym komentarzu nie są "komenentowane/ignorowane" kolejne znaki <font color="green">' { '</font> rozpoczynające komentarz. Więc jeśli za znakiem <font color="green">' { '</font> umieściliśmy kolejne <font color="green">' { '</font> to musimy dać taką samą liczbę nawiasów zamykających komentarz <font color="green">' } '</font>... Nie mam pojęcia czym się kierowała osoba tworząca taką składnię... Zagnieżdżanie kolejnych działających komentarzy, w mojej opinii jest co najmniej dziwne (a na usta cisną mi się dużo gorsze określenia).<br /><br />Na szczęście po wpisaniu, przed komentarzami dyrektywy <br /><pre><font color="green">{$MODE DELPHI}</font></pre>Komentarze w trakcie kompilacji zachowują się poprawnie. Niestety kolorowanie składni w edytorze nadal było niewłaściwe. Po prostu nie mogłem kodować... Zgłosiłem buga i...<br /><br />Na target wersji w której problem będzie rozwiązany wyznaczono wersję "post 1.2"... I zostałem mile zaskoczony! W obecnym release 0.9.26 bug is fixed!<br /><br />Brawo Lazarus Team. Jeszcze kilka wersji i będzie można w miarę normalnie używać tego środowiska. A ten błąd był dla wielu Delphiarzy błędem krytycznym...<br /><br />PS. Dla mnie Lazarus staje się używalny z chwilą "naprawienia kolorowania komentarzy".Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5953912728542946082.post-40467401666232230502008-10-28T23:36:00.002+01:002008-10-28T23:43:02.757+01:00Dodawanie komentarzyNa prośbę Destructiona, włączyłem możliwość dodawanie komentarzy przez osoby anonimowe. Więc jak ktoś chciał coś skomentować, a nie chciał zakładać konta to już może ;).<br /><br />Enjoy!Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5953912728542946082.post-41951434802836180862008-10-28T11:42:00.003+01:002008-10-28T12:32:55.861+01:00Nowa Składnia Delphi!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JMmEfORz1-o/SQbuvyOIzQI/AAAAAAAAAAU/Fq-TVWx-rMo/s1600-h/header.gears.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 129px; height: 105px;" src="http://4.bp.blogspot.com/_JMmEfORz1-o/SQbuvyOIzQI/AAAAAAAAAAU/Fq-TVWx-rMo/s320/header.gears.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5262155719331335426" /></a><br />Wygląda na to, że Object Pascal zostanie kopnięty w tyłek i przeturla się nieco do przodu :D. Dzięki ścisłej współpracy RemObjects i CodeGear/Embarcadero skorzystają na tym nie tylko programiści .NET ale i Win32/64.<br /><br />Autorzy Oxygene zyskali dostęp do teamu i kodu kompilatora Delphi, i mają wpływ na jego dalszy rozwój!<br /><br />Za jakiś czas możemy się spodziewać nowej karmy po latach składniowej posuchy.<br /><br />W następnej wersji Delphi niewykluczone, że obok procedure/function pojawi się słowo mothod dla klas, znane z Oxygene. Do języka zostanie prawdopodobnie dodanych wiele ciekawych składniowych urozmaiceń.<br /><br />Ku uciesze umysłów CodeGear zapowiedziało, że ma zamiar standaryzować i znacznie rozwijać język Delphi. Czyżby zbliżał się kres królowania C++ ;)?<br /><br /><span style="font-weight:bold;">Update</span>: Zapomniałem wspomnieć, że przez użycie Oxygene zostało porzucone VCL.NET i zaleca się programistom Delphi for .NET używających VCL przejście na Delphi for Win32 (jak to piszą w oficjalnych dokumentach powiązanych z Delphi Prism). Co świadczy o tym, że (prawdopodobnie) Delphi for Win32 stanie się naprawdę mocne!Unknownnoreply@blogger.com4