Zrobiłem porównanie Delphi i Lazarus pod względem wagi aplikacji.
Projekty skompilowane z pustym formularzem.
W trybie Debug waga aplikacji w Delphi wynosi 11 517 kb, w Lazarus 25 073
W trybie Release z wyłączeniem kilku punktów w ustawieniach, w Delphi 2268 kb a w Lazarus 2798 kb
Wygrywa Delphi bo mało waży aplikacja lecz Lazarus jest darmowy całkowicie, a Delphi ma wersję Community z ograniczeniami i płatne wersje (bardzo drogie).
Czy naprawdę w czasach, gdzie dysk 1-2TB jest już praktycznie standardem i nikogo taka pojemność nie dziwi, jest sens patrzeć na kilka mega różnicy w rozmiarze pliku? Zresztą i tak w większości przypadków, rozmiar gotowej apki zależy raczej od grafik/tekstur/dźwieków/bazy danych, a sama aplikacja to tylko bardzo niewielki element całej paczki.
RAD Studio 12 wydane
https://www.embarcadero.com/products/rad-studio/whats-new-in-12-athens
Delphi 11 oraz C++Builder 11 Community Editions wydane
@Pepe a mi nie wiem czy licencji nie wywaliło od poprzedniej w związku z pojawieniem się nowszej. W sumie nie wiem może to przypadek ale wydawało mi się że jeszcze kilka miesięcy było. Nowszej jeszcze nie instalowałem i nie próbowałem też uzyskać nowej licencji na starszą ale jak u Ciebie OK to chyba tylko przypadkowo skończyła mi się w tym terminie a wydawało mi się że mam na dłużej bo rzadko ostatnio używam Delphi.
@kAzek: Obawiam się, że nie przypadkowo... Ja przy okazji instalacji Delphi 11.3 postawiłem Windows na nowo (miałem tam już klika wersji Delphi, że nie wspomnę o wersjach Windows, uaktualnianych co jakiś czas - najwyższy czas był odświeżyć ten bałagan :P). Zainstalowałem zatem świeży Windows oraz Delphi 11.3 CE (licencja na 367 dni). W maszynie wirtualnej (Windows 11) natomiast zainstalowałem (gdzie już wcześniej zainstalowałem testowo Delphi 11.3 (żeby wiedzieć, czy jest sens instalować nowe CE na kompie) tę stara wersję Delphi 10.4.2, której klucz miałem zarejestrowany na starym systemie - co ciekawe, ten klucz licencji był bezterminowy (nie wiem jakim cudem!). Ale mimo tego, że klucz w starym Windows, przed formatem, kilka godzin wcześniej był bezterminowy, przy instalacji w maszynie wirtualnej nagle stał się expired (licencja wygasła).
Z cyklu ciekawostki #FireDAC
Na wstępie chciałbym uniknąć zbędnej dyskusji, że delphi umarło itd. Załączam jedynie jako ciekawostkę / info jeśli ktoś korzysta.
Mam kawałek kodu, który bierze DDL obiektu oracle (procedura/funkcja/pakiet/trigger itp.) z pliku i wgrywa ją na docelowe środowisko. Jak to w przypadku oracle bywa jak coś jest nie tak to status obiektu jest invalid i np w przypadku pakietów gdzie wgrywany jest np tylko header pakietu to wymagana jest kompilacja body tegoż pakietu bo automatycznie wchodzi w stan invalid.
W związku z powyższym po wgraniu czegokolwiek na bazkę uruchomiłem poniższy kod:
BEGIN
FOR CUR IN (SELECT * FROM ALL_OBJECTS
WHERE OWNER = :USER
and STATUS = 'INVALID'
and OBJECT_TYPE <> 'JAVA CLASS'
and OBJECT_NAME = :OBJECT_NAME) LOOP
BEGIN
IF CUR.OBJECT_TYPE = 'PACKAGE BODY' THEN
EXECUTE IMMEDIATE 'ALTER PACKAGE "'||CUR.OWNER||'"."'||CUR.OBJECT_NAME||'" COMPILE BODY';
ELSE
EXECUTE IMMEDIATE 'ALTER '||CUR.OBJECT_TYPE||' "'||CUR.OWNER||'"."'||CUR.OBJECT_NAME||'" COMPILE';
END IF;
END;
END LOOP;
END;
który automatycznie kompiluje mi dany obiekt/obiekty.
Wywołanie natomiast powyższego kodu wygląda tak:
for var k: integer := 0 to FFilList.Count - 1 do
begin
if TdmMainModule.Instance.LoadScriptFromFileFD(FFilList[k].value) then
try
TdmMainModule.Instance.qScript.ExecuteAll;
if ((FFilList[k].objectType <> TObjectEnum.oeOthers) and (pAutoCompile)) then
TryCompileObject(FFilList[k].value); //tu jest execute powyższego PL/SQL'a
if Assigned(fOnGetText) then
fOnGetText('OK: ' + FFilList[k].value + ' ' + sAddInfo);
except
on e: Exception do
if Assigned(fOnGetText) then
fOnGetText('Fail: ' + FFilList[k].value + ' ' + e.Message);
end;
end;
No i mam wszystko OK
Co ciekawe na bazie jest status pakietu INVALID no i rozkmina dlaczego. Odpaliłem PL/SQL'a z toad i zwrócił mi:
ORA-24344: Success with Compilation Error
niby jakiś tam ORA ale do exceptiona nie wchodzi .... i tu niestety bez wczytania się w kody FireDAC nie dało rady. Najpierw FireDac.Phys.OracleCli.pas
OCI_SUCCESS = 0; // maps to SQL_SUCCESS of SAG CLI
OCI_SUCCESS_WITH_INFO = 1; // maps to SQL_SUCCESS_WITH_INFO
OCI_RESERVED_FOR_INT_USE = 200; // reserved
OCI_NO_DATA = 100; // maps to SQL_NO_DATA
OCI_ERROR = -1; // maps to SQL_ERROR
OCI_INVALID_HANDLE = -2; // maps to SQL_INVALID_HANDLE
OCI_NEED_DATA = 99; // maps to SQL_NEED_DATA
OCI_STILL_EXECUTING = -3123; // OCI would block error
następnie FireDAC.Phys.OracleWrapper.pas
procedure TOCIError.Check(ACode: sword; AInitiator: TObject = nil);
begin
if FIgnoreErrors then
Exit;
case ACode of
OCI_SUCCESS:
;
OCI_NEED_DATA,
OCI_INVALID_HANDLE,
OCI_STILL_EXECUTING,
OCI_CONTINUE:
FDException(AInitiator, EOCINativeException.Create(Self, ACode, '')
{$IFDEF FireDAC_Monitor}, Env.Tracing {$ENDIF});
OCI_SUCCESS_WITH_INFO:
begin
ClearInfo;
FInfo := EOCINativeException.Create(Self);
end;
OCI_NO_DATA,
OCI_ERROR:
FDException(AInitiator, EOCINativeException.Create(Self)
{$IFDEF FireDAC_Monitor}, Env.Tracing {$ENDIF});
else
;
end;
end;
Jak widać OCI_SUCCESS_WITH_INFO jest jedynym exceptionem, który nie tworzy FDException ... no taaa logiczne przecież
@robertos7778: za długo trwa dlatego wyszukuję tylko obiekty rozkompilowane, które wgrywałem :)
Sprawdziłem sobie z ciekawości hasła Pascal/Delphi na portalach
Liczba ogłoszeń:
NoFluff - 0 i 0
JustJoinIt - 0 i 1
Pracuj - 2(ale nie bezpośrenio związane z programowaniem w Pacalu) i 6 (ale z samym Delphi chyba z 3 oferty, reszta nie wiem jakim cudem sie na wyszukiwarkę załapała)
@KamilAdam: moze ja po prostu nie rozumiem do konca tego kóleczka wzajemnej adoracji z pewnym określonym poczuciem humoru i ironii na mikroblogach - zatem faktycznie po cichu się wycofam i wroce do pracy :)
Z cyklu #Delphi
Witajcie,
Zasadniczo w systemach, przy których pracuję projekty zbudowane są o exe + bpl'e. W związku z powyższym niezbyt często mam okazję tworzyć DLL (raczej jak już to korzystam z dll dostarczonych do firmy). Dziś akurat miałem tą okazję stworzyć DLL z dosłownie jedną funkcją eksportową i swojego rodzaju eventem tak aby dll sam wywoływał procedurę w exe.
Kod dll:
procedure GetGPSCoordinates(const pCOM, pBaudRate: integer; pOnGPS: Pointer); stdcall;
begin
TGPSLib.Instance.GPS.Com := pCOM;
TGPSLib.Instance.GPS.BaudRate := pBaudRate;
TGPSLib.Instance.OnGPS := pOnGPS;
TGPSLib.Instance.GPS.Active := True;
end;
Jak widać mamy podłączenie nr com, jego prędkość, zdarzenie OnGPS i aktywację. Żadnych cudów.
Teraz zdarzenie OnGPS:
type
TOnGetGPS = procedure(const pLat, pLon: Extended) stdcall;
TGPSLib = class
...
vOnGPS: TOnGetGPS;
procedure GPSPosition(Sender: TObject);
...
property OnGPS: TOnGetGPS read vOnGPS write vOnGPS;
end;
...
procedure TGPSLib.GPSPosition(Sender: TObject);
begin
if Assigned(vOnGPS) then
vOnGPS(vGPS.Latitude,vGPS.Longitude);
end;
No i ogólnie zadziałało bez problemu. No ale GPS zwraca tez inne parametry więc dodajmy np wysokość do powyższego kodu:
type
TOnGetGPS = procedure(const pLat, pLon, pAlt: Extended) stdcall;
...
procedure TGPSLib.GPSPosition(Sender: TObject);
begin
if Assigned(vOnGPS) then
vOnGPS(vGPS.Latitude,vGPS.Longitude, vGPS.Altitude);
end;
Nagle okazuje się, że ten kod przestał działać ... dosłownie dodanie jakiegokolwiek parametru do tych dówch wcześniejszych wywala błąd ...
Okazało się dzięki świetnemu artykułowi, który znalazłem i których chiałem wam pokazać:
http://rvelthuis.de/articles/articles-dlls.html
że w DLL NIE NALEŻY UŻYWAĆ EXTENDED
to, że zadziałało na 2 parametrach typu Extended to czysty przypadek. Przerobiłem te dwa parametry extended na 1 typu packed record z dwomwa wartościami i też nie chciało zadziałać. Także uważajcie na DLL (nie tylko w Delphi ale również C i C++) i typy danych
@Autysta: Rozumiem