Paweł Parzych

Paweł Parzych Starszy Programista
Delphi/MSSQL

Temat: Style w Delphi XE6 a DevExpress

Pytanie brzmi:

Planując utworzenie nowej aplikacji i chcąc korzystać ze styli, to które wybrać ?
Style w Delphi i DevExpress są zupełnie niezależne od siebie. Jeśli wykorzystam Delphi to fajne kontrolki DevExpress będą odbiegać wizualnie od reszty aplikacji, natomiast jeśli zdecyduje się użyć styli DevExpress to cała nowa funkcjonalność stylowania w Delphi nie będzie mogła być wykorzystana w przyszłości i cała aplikacja będzie musiała być oparta w DevExpress.

Co sądzicie, co byście doradzili i dlaczego ?
Daniel Grabowski

Daniel Grabowski Interaktywne
planowanie produkcji
on-line z MES

Temat: Style w Delphi XE6 a DevExpress

Paweł P.:
Pytanie brzmi:
/ciach/
Co sądzicie, co byście doradzili i dlaczego ?
Od zawsze używam tylko i wyłącznie DevExpressa, ale wszystkiego co mają.
Jeśli to konieczne (a czasem się zdarza) to implementuję styl DevExpress do własnych kontrolek.
Dlaczego?
Dlatego, że nie używam innych kontrolek wizualnych poza DevExpress + własnych opartych lub zgodnych z DevExpress. Nie pozwalam na używanie takiego bałaganu jak chociażby JVCL i setek innych kontrolek, tylko dlatego bo są...
Tomasz Andrzejewski

Tomasz Andrzejewski PROGRAMMING ENGINEER
(DELPHI, SQL)

Temat: Style w Delphi XE6 a DevExpress

A co stoi na przeszkodzie zeby GUI bylo niezalezne ?
Logika (nazwijmy ja biznesowa) aplikacji nie musi (i nie powinna) miec nic wspolnego z GUI.
Moglbys skorzystac z wzorca classfactory i jesli bedziesz chcial mozesz sobie w przyszlosci wygenerowac inny wyglad aplikacji. Mozesz skorzystac z delegatow, obserwatorow itp.

np

ClassFactory > rejestracja GUI (np OknoFaktura).
Pozniej chcesz utworzyc obiekt implementujacy OknoFaktura.
Taki obiekt moze utworzyc classfactory.
W momencie inicjalizacji OknoFaktura nastepuje pobranie z classfactory delegatow dla odpowiednich kontrolek
(np onClick, OnChanged).

BTW

Devexpress'owy SkinController ma zdarzenia
OnSkinForm
OnSkinControl
oraz
Refresh()Ten post został edytowany przez Autora dnia 24.05.14 o godzinie 18:12
Daniel Grabowski

Daniel Grabowski Interaktywne
planowanie produkcji
on-line z MES

Temat: Style w Delphi XE6 a DevExpress

Tomasz A.:
A co stoi na przeszkodzie zeby GUI bylo niezalezne ?
Logika (nazwijmy ja biznesowa) aplikacji nie musi (i nie powinna) miec nic wspolnego z GUI.
Moglbys skorzystac z wzorca classfactory i jesli bedziesz chcial mozesz sobie w przyszlosci wygenerowac inny wyglad aplikacji. Mozesz skorzystac z delegatow, obserwatorow itp.
Poważnie, Ty do mnie to piszesz? Przecież widziałeś jak piszę własny kod...
Zapytam inaczej - co ma piernik do wiatraka?
Pytanie było zupełnie inne i na nie odpowiedziałem.
np

ClassFactory > rejestracja GUI (np OknoFaktura).
Pozniej chcesz utworzyc obiekt implementujacy OknoFaktura.
Taki obiekt moze utworzyc classfactory.
W momencie inicjalizacji OknoFaktura nastepuje pobranie z classfactory delegatow dla odpowiednich kontrolek
(np onClick, OnChanged).
Taaa... zapominasz, że 85% programistów Delphi programuje na zasadzie pint'n'click + obsługa zdarzeń.
65% może zrozumiało cokolwiek z tego co napisałeś, z czego może ze 20% widziałoby jak tego użyć, ale tylko 5% widzi w tym sens.
Innymi słowy - mnie już dawno przeszło zawracanie kijem Wisły ;-)


BTW

Devexpress'owy SkinController ma zdarzenia
OnSkinForm
OnSkinControl
oraz
Refresh()
Ma zdarzenia, ale ma też zupełnie inny mechanizm (moim zdaniem - znacznie lepszy) który służy do "oskinowania" własnych kontrolek.
Tomasz Andrzejewski

Tomasz Andrzejewski PROGRAMMING ENGINEER
(DELPHI, SQL)

Temat: Style w Delphi XE6 a DevExpress

nie no co jak co ale napewno to nie bylo do Ciebie - to jak piszesz to dobrze wiem.
Tobie nikt nie musi tego tlumaczyc - chodzilo mi o to ze pytajacy moze sobie rozdzielic GUI od logiki biznesowej.
I nie bedzie musial zawracac sobie glowy czy skinowac devexpress czy delphi'owe rozwiazanie.
Tomasz Andrzejewski

Tomasz Andrzejewski PROGRAMMING ENGINEER
(DELPHI, SQL)

Temat: Style w Delphi XE6 a DevExpress

A fakt devexpressowy skinpainter ma mechanizmy skinowania obcych kontrolek. Kiedys sobie napisalem skinowanie SynEdita (niestety devespress'owe cxMemo nie ma kolorowania skladni - nie chcialem sam tego dziergac recznie)
Piotr F.

Piotr F. software developer

Temat: Style w Delphi XE6 a DevExpress

Daniel G.:
Taaa... zapominasz, że 85% programistów Delphi programuje na zasadzie pint'n'click + obsługa zdarzeń.
65% może zrozumiało cokolwiek z tego co napisałeś, z czego może ze 20% widziałoby jak tego użyć, ale tylko 5% widzi w tym sens.

Może czegoś nie łapie... :-) ale ile procent programistów powinno pracować wg wymagań biznesowych tudzież projektu funkcjonalnego? :-) I teraz w zależności od odpowiedzi, trzeba by albo przeprosić te "85%" klikaczy, albo wykazać specjalny szacunek dla tych "5%" z końca...

konto usunięte

Temat: Style w Delphi XE6 a DevExpress

Piotr F.:
Może czegoś nie łapie... :-) ale ile procent programistów powinno pracować wg wymagań biznesowych tudzież projektu funkcjonalnego? :-) I teraz w zależności od odpowiedzi, trzeba by albo przeprosić te "85%" klikaczy, albo wykazać specjalny szacunek dla tych "5%" z końca...

To napisz jakąkolwiek aplikację desktopową w ten sposób (mówię o programowaniu przez wyklikanie zdarzeń OnClick czy coś podobnego i implementację zestawu instrukcji) a później w ramach alternatywy dokładnie tą samą ale w oparciu o MVP, SOLID i wszystkie potrzebne wzorce projektowe, a zobaczysz jak to odbije się w perspektywie dalszej rozbudowy. Bo jakby na to nie patrzeć, będzie to miało rzecz jasna odzwierciedlenie nie tylko w czasie pracy nad projektem ale i w perspektywie dalszego utrzymania i zapobiegania powstawaniu błędów.

Nawet tutaj w tym konkretnym przypadku, jeśli jest mowa o możliwości zmiany wyglądu okienek i kontrolek i tego wzorca class factory, jest też pytanie, czy obiekt który będzie się tworzyło w ramach pobranej opcji (skiny, a może bez skinów), jest pytanie czy zastosować tutaj implementację metod z jakiegoś interfejsu IFaktura, czy też obiektem nadrzędnym ma być TForm bo przecież klasa abstrakcyjna a interfejs to nie to samo. To oczywiście w kontekście zgodności z SOLID. Chyba te zasady nie zostały przyjęte tak bez powodu...

No chyba że mówimy o możliwości jakiejś rozbudowy czy modyfikacji dużego już projektu, bo rozbudowa czegoś co już jest a napisanie czegoś od nowa to dwie różne sprawy.
Daniel Grabowski

Daniel Grabowski Interaktywne
planowanie produkcji
on-line z MES

Temat: Style w Delphi XE6 a DevExpress

Piotr F.:
Daniel G.:
Taaa... zapominasz, że 85% programistów Delphi programuje na zasadzie pint'n'click + obsługa zdarzeń.
65% może zrozumiało cokolwiek z tego co napisałeś, z czego może ze 20% widziałoby jak tego użyć, ale tylko 5% widzi w tym sens.
Może czegoś nie łapie... :-)
Może... i właśnie o tym pisałem ;-)
ale ile procent programistów powinno pracować wg wymagań biznesowych tudzież projektu funkcjonalnego? :-)
Wszyscy.
I teraz w zależności od odpowiedzi, trzeba by albo przeprosić te "85%" klikaczy, albo wykazać specjalny szacunek dla tych "5%" z końca...
Dlaczego?
Jedno nie wyklucza drugiego - dla większości liczy się efekt, a ten można osiągnąć różnymi drogami...
Innymi słowy, da się napisać coś użytecznego w ten i tamten sposób. Gorzej potem z utrzymaniem czy rozwojem ;-)
Daniel Grabowski

Daniel Grabowski Interaktywne
planowanie produkcji
on-line z MES

Temat: Style w Delphi XE6 a DevExpress

Dariusz R.:
Piotr F.:
Może czegoś nie łapie... :-) ale ile procent programistów powinno pracować wg wymagań biznesowych tudzież projektu funkcjonalnego? :-) I teraz w zależności od odpowiedzi, trzeba by albo przeprosić te "85%" klikaczy, albo wykazać specjalny szacunek dla tych "5%" z końca...

To napisz jakąkolwiek aplikację desktopową w ten sposób (mówię o programowaniu przez wyklikanie zdarzeń OnClick czy coś podobnego i implementację zestawu instrukcji) a później w ramach alternatywy dokładnie tą samą ale w oparciu o MVP, SOLID i wszystkie potrzebne wzorce projektowe, a zobaczysz jak to odbije się w perspektywie dalszej rozbudowy.
W Delphi?
Najpierw będzie pisał ten framework przez dwa lata, a potem może zacznie pisać aplikację.
Za dwa lata będzie już za późno...
Bo jakby na to nie patrzeć, będzie to miało rzecz jasna odzwierciedlenie nie tylko w czasie pracy nad projektem ale i w perspektywie dalszego utrzymania i zapobiegania powstawaniu błędów.

Nawet tutaj w tym konkretnym przypadku, jeśli jest mowa o możliwości zmiany wyglądu okienek i kontrolek i tego wzorca class factory, jest też pytanie, czy obiekt który będzie się tworzyło w ramach pobranej opcji (skiny, a może bez skinów), jest pytanie czy zastosować tutaj implementację metod z jakiegoś interfejsu IFaktura, czy też obiektem nadrzędnym ma być TForm bo przecież klasa abstrakcyjna a interfejs to nie to samo. To oczywiście w kontekście zgodności z SOLID. Chyba te zasady nie zostały przyjęte tak bez powodu...
Jedno i drugie podejście nie jest zbyt szczęśliwe...
W jednym i drugim przypadku na etapie projektu wiążesz konkretną funkcjonalność z konkretną klasą lub interfejsem (jeszcze gorzej).
Dlaczego nie zastosować IoC?
No chyba że mówimy o możliwości jakiejś rozbudowy czy modyfikacji dużego już projektu, bo rozbudowa czegoś co już jest a napisanie czegoś od nowa to dwie różne sprawy.
Moim zdaniem, niekoniecznie. Uważam, że można tuningować nawet stare projekty - trzeba tylko wiedzieć jak działają, co trzeba zrobić i mieć pomysł na to wszystko.
Tomasz Andrzejewski

Tomasz Andrzejewski PROGRAMMING ENGINEER
(DELPHI, SQL)

Temat: Style w Delphi XE6 a DevExpress

Wg mnie kazdy musi sobie zadac pytanie co robi. Czy jest to duzy projekt w ktorym glownie chodzi o mozliwosci customizacji, alternatywnych procesow w stosunku do standardu, czy aplikacja dla pojedynczego klienta.

Jesli mialbym robic cos co bedzie mialo krotki cykl zycia to pewnie skorzystalbym z RAD.
A ze takich aplikacji nie lubie i nie robie to wole miec framework.Ten post został edytowany przez Autora dnia 26.05.14 o godzinie 11:30

konto usunięte

Temat: Style w Delphi XE6 a DevExpress

Dla przykładu taki prosty kalkulator w DELPHI, napisany w oparciu o MVP:

http://www.danieleteti.it/2009/02/12/a-simple-start-wi...

A wszystko jest sterowane za pośrednictwem prezentera, który zarządza interakcją z użytkownikiem i jednocześnie obliczeniami, realizowanymi przez CalculatorService.

Tymczasem można to samo zrobić znacznie szybciej, definiując metodę, która byłaby wywoływana przy kliknięciu oblicz. Tu jest podzielone na więcej klas (i więcej plików), nawet testy jednostkowe, przez co więcej roboty. Tylko że w takim przypadku nie widzę żadnych problemów, żeby zastosować różne widoki (w sensie wyglądu kontrolek).
Tomasz Andrzejewski

Tomasz Andrzejewski PROGRAMMING ENGINEER
(DELPHI, SQL)

Temat: Style w Delphi XE6 a DevExpress

no i to jest to o czym pisalem. Kalkulator mozna sobie pisac stosujac RAD.
Nie wyobrazam sobie braku architektury w projektach wdrazanych u setek klientow, braku architektury trojwarstwowej.
Co innego kalkulator - co innego np duzy system ksiegowy.
Co zrobic jak klient kaze Ci zmienic logike dzialania aplikacji?
I wyobraz sobie ze metode add/divide/substract/multiple z Twojego kalulatora masz wyklepana jako zdarzenie.
Jesli bedziesz mial to rozwiazane jako np webservice / rest czy cokolwiek innego zmiana / wpiece wtyczki to zmiana w jednym (naogol konfigurowalnym) miejscu.

Jeszcze raz podkresle ze kalkulator to nie aplikacja ktora sie wdraza. Architektura jaka wybierzesz to Twoja sprawa i jesli nie korzystasz z takich mozliwosci ktore sie potrafia zwrocic finansowo/czasowow to nie musisz tego robic na sile.

konto usunięte

Temat: Style w Delphi XE6 a DevExpress

Tomasz A.:
Co zrobic jak klient kaze Ci zmienic logike dzialania aplikacji?

Jakakolwiek modyfikacja działania wyżej przedstawionej aplikacji, z zasady jest łamaniem OCP, zatem kod tego kalkulatora (i każdej innej aplikacji opartej o ten wzorzec), powinien być z zasady otwarty jedynie na rozszerzenie. Tutaj konkretnie można rozszerzyć serwis obliczający o jakieś funkcje np. trygonometryczne, hiperboliczne czy wykładnicze ale napewno nie zmieniać działania. Oczywiście oznaczałoby to dodanie nowej metody do interfejsu.

W przypadku widoku (formatki), mogę sobie co prawda podmienić standardowy TButton na jakiś TFlatButton, pod warunkiem że będzie się dalej tak samo nazywał (nie będzie trzeba zmieniać kodu). Jako że kod w tej formatce się nie zmieni, to ja nie widzę tutaj łamania OCP.
I wyobraz sobie ze metode add/divide/substract/multiple z Twojego kalulatora masz wyklepana jako zdarzenie.

Przede wszystkim jedna zasadnicza sprawa. W jaki sposób napisać pod takie coś testy jednostkowe? W przypadku MVP sprawa jak widać dość prosta.
Tomasz Andrzejewski

Tomasz Andrzejewski PROGRAMMING ENGINEER
(DELPHI, SQL)

Temat: Style w Delphi XE6 a DevExpress

dobrze sobie zdaje sprawe z tego jakie sa wady i zalety. Zwyczajna klikologia na zasadzie button i dbclick mnie nie interesuje. Czesto widywalem konstrukcje ktore ciezko nazwac programowaniem.

Wyobrazmy sobie taka sytuacje - mamy fakture i opcje przeliczenia pozycji wg kursu waluty.
Mozna zrobic to jako funkcjonalnosc na formie - button / onClick i zrobione.
Pozniej okazuje sie ze jest lista faktur i wymagane jest takie przeliczenie z poziomu listy.

Dlatego ja wole ClassFacotyr. Rejestruje sobie instancje np IInvoiceTools (interface w rozumieniu oleautomation).
Majac pewien skonkretyzowany interface z np metoda Calculate wole wolac to na zasadzie

var
I; IInvokable;
begin
I := ClassFacoty.GetInstance(IInvoiceTools) as IInvoiceTools;
I.InvoiceId := 201; // np taki id faktury
I.Calculate.

z instancji singleton ClassFacoty mozna odrejestrowac obiekt implementujacy interface i zarejestrowac nowy.
W ten sposob mozna dowolnie zmieniac zasade dzialania. Wyobrazmy sobie ze klient chce zeby po kazdej takiej akcji byl wyslany mail na adres biuro@faktury.pl. Pracujac np na BPL (ja uzywam dll) dynamicznie mozesz zmieniac obiekty implementujace dany interface, a co za tym idzie totalnie zmieniac zachowanie programu.

Ciagle masz ten sam program, ktory dziala u setek klientow.
Paweł Parzych

Paweł Parzych Starszy Programista
Delphi/MSSQL

Temat: Style w Delphi XE6 a DevExpress

Reasumując.
Rozpoczynając nowy projekt i chcąc korzystać ze sprawdzonych kontrolek DevExpress należy wybrać stylowanie aplikacji tejże firmy, a pominąć te wbudowane z Delphi XE6.

Nadmienię tylko, że są tacy programiści, którzy uwielbiają spędzać czas na tworzenie kodu źródłowego, a ja natomiast należę do tych, którzy muszą w miarę szybko wykonać konkretną robotę dla klienta końcowego i nie mam czasu na próby samodzielnego stylowania różnych kontrolek.

Jedni niech robią kontrolki, a inni niech z nich korzystają.

Dziękuję za wypowiedzi.Ten post został edytowany przez Autora dnia 27.05.14 o godzinie 11:07
Daniel Grabowski

Daniel Grabowski Interaktywne
planowanie produkcji
on-line z MES

Temat: Style w Delphi XE6 a DevExpress

Paweł P.:
/ciach/
Nadmienię tylko, że są tacy programiści, którzy uwielbiają spędzać czas na tworzenie kodu źródłowego, a ja natomiast należę do tych, którzy muszą w miarę szybko wykonać konkretną robotę dla klienta końcowego i nie mam czasu na próby samodzielnego stylowania różnych kontrolek.

Jedni niech robią kontrolki, a inni niech z nich korzystają.
No i masz swoją odpowiedź Piotrze ;-)



Wyślij zaproszenie do