Trochę historii - Delphi XE2

Trochę historii - Delphi XE2
PO
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:3
0

Witam,

Muszę ostatni pogrzebać w projekcie napisanym w Delphi XE2 i napotkałem na dziwny problem.
Ogólnie dzieje się tak w głownej apce, ale i także w stworzonej na prędce do testów.
Chodzi o to, że głowna apka jest kompilowana w Runtime Package, ale żeby było ciekawiej, to te Runtime Package też są inne i zawierają w sobie inne paczki.
Np.xxSystem.bpl zawiera w sobie rtl, vcl itd itp, xxTMS.bpl zawiera paczki TMS UI, xxSDAC zawiera paczki SDACa i tak dalej i tak dalej.
Problem jest taki, że gdy głowna aplikacja jest kompilowana to jest ok, ale gdy zostaje zbuildowana to te bplki "magicznie" zmieniają się na pliki exe. Oczywiście to nie są exe tylko bplki, ale mają takie rozszerzenie a apka głowna wymaga tych z rozszerzeniem exe. Niby działa, ale jakoś to nie jest za eleganckie.

Zeby odtworzyć to wystarczy stworzyć aplikacje VCL dla Windows z samą pustą formą. Ustawić w parametrach projektu Packages->Runtime Packages-> Link with runtime packages na TRUE, a w Runtime packages wpisać xxSystem.
Utworzyć projekt package xxSystem.bpl, wywalić wszystko z requires, dodać unit, w którym wpisać uses vcl.forms; i zbudować paczkę. Wywali błędem żeby dodać rtl i vcl, ale robimy cancel. I paczka jest zbudowana.

Teraz wchodzimy w pierwszą apkę i KOMPILUJEMY ją. Robi się wszystko poprawnie i apka działa też poprawnie (tak samo po przeniesieniu na maszynę bez delphi).
Natomiast gdy zrobimy BUILD apka się buduje, buduje się też paczka xxSystem, ale tworzy się także xxSystem.exe. I od tego momentu apka głowna wymaga tego xxSystem.exe.
xxSystem.exe i xxSystem.bpl to te same pliki tylko generowane z inną nazwą.

Pytanie, czy ja coś źle robię? Czy to odkryty po latach (przynajmniej przeze mnie) błąd/przypadłość XE2.
Czy ktoś się z tym spotkał i wie jak temu zaradzić? Rozdzielanie projektów i kompilacja/budowanie osobno nic nie daje. Zawsze zbudowanie apki podstawowej daje ten sam efekt.

Od razu mówie, sprawdziłem na używanym do dzisiaj XE7 - problem ten nie występuje - zawsze jest plik BPL.
Sprawdziłem też na 11 i tam tak samo - zawsze jest plik BPL.
Nie mam na tyle cierpliwości żeby pobierać XE3 i sprawdzać jak to tam wygląda.

pozdrawiam,
Przemek O.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
1
Przemek O. napisał(a):

Witam,

Muszę ostatni pogrzebać w projekcie napisanym w Delphi XE2 i napotkałem na dziwny problem.

To Cię oświecę - ten "problem" sprawiłeś sobie sam i dotyczy każdej wersji Delphi.

Ogólnie dzieje się tak w głownej apce, ale i także w stworzonej na prędce do testów.
Chodzi o to, że głowna apka jest kompilowana w Runtime Package, ale żeby było ciekawiej, to te Runtime Package też są inne i zawierają w sobie inne paczki.
Np.xxSystem.bpl zawiera w sobie rtl, vcl itd itp, xxTMS.bpl zawiera paczki TMS UI, xxSDAC zawiera paczki SDACa i tak dalej i tak dalej.

Nie ma czegoś takiego jak xxxSystem.bpl, ale jest RTLXXX.BPL i to w tej paczce zawarty jest Runtime Library.

Problem jest taki, że gdy głowna aplikacja jest kompilowana to jest ok, ale gdy zostaje zbuildowana to te bplki "magicznie" zmieniają się na pliki exe. Oczywiście to nie są exe tylko bplki, ale mają takie rozszerzenie a apka głowna wymaga tych z rozszerzeniem exe. Niby działa, ale jakoś to nie jest za eleganckie.

Ale co tu jest mało eleganckiego?
BPL to taki DLL tylko z odrobiną cukru, dzięki czemu łatwiej się tym wszystkim zarządza i używa.
Można sobie np. bezkarnie przekazywać referencję na obiekty, nie ma zdublowanych RTL, itd. itp.
Wada jest jedna - to działa tylko w Delphi, a więc kod dostarczony w BPL zadziała tylko i wyłącznie w Delphi/Builder pod warunkiem, że wszystkie BPL i EXE są kompilowane w tej samej wersji kompilatora.

Zeby odtworzyć to wystarczy stworzyć aplikacje VCL dla Windows z samą pustą formą. Ustawić w parametrach projektu Packages->Runtime Packages-> Link with runtime packages na TRUE, a w Runtime packages wpisać xxSystem.
Utworzyć projekt package xxSystem.bpl, wywalić wszystko z requires, dodać unit, w którym wpisać uses vcl.forms; i zbudować paczkę. Wywali błędem żeby dodać rtl i vcl, ale robimy cancel. I paczka jest zbudowana.

Tak, ale paczka jest zbudowana w ten sposób że wszystkie moduły które są wymagane przez daną paczką, nie będą ładowane z innych BPL (np. SysUtils), a zostaną wkompilowane w Twoją BPLkę.
I to zadziała, ale naprawdę trzeba wiedzieć co się robi, ponieważ dany moduł może występować tylko i wyłącznie w jednej BPLcem, której używa Twoja aplikacja.
A więc nie możesz mieć tego samego modułu w dwóch różnych BPL, których używa Twoja aplikacja w runtime.

A więc jeśli zrobiłeś to co zrobiłeś, a potem używasz swojej packi i równocześnie np. paczki xxSDAC, która też używa modułu SysUtils to skończy się to błędem, ponieważ ten moduł jest zawarty w RTLXXX.BPL, której to paczki wymaga (w definicji paczki sdac w sekcji requires jest podana paczka rtl.bpl) xxSDAC.BPL.

Teraz wchodzimy w pierwszą apkę i KOMPILUJEMY ją. Robi się wszystko poprawnie i apka działa też poprawnie (tak samo po przeniesieniu na maszynę bez delphi).
Natomiast gdy zrobimy BUILD apka się buduje, buduje się też paczka xxSystem, ale tworzy się także xxSystem.exe. I od tego momentu apka głowna wymaga tego xxSystem.exe.

A na pewno te profile kompilacji są identyczne pod kątem konfiguracji kompilacji ?

xxSystem.exe i xxSystem.bpl to te same pliki tylko generowane z inną nazwą.

Pytanie, czy ja coś źle robię?

Raczej na pewno.

Czy to odkryty po latach (przynajmniej przeze mnie) błąd/przypadłość XE2.

Nie sądzę.

Czy ktoś się z tym spotkał i wie jak temu zaradzić?

Trzeba wiedzieć jak to działa, żeby tego używać.
A więc jak ze wszystkim.

Rozdzielanie projektów i kompilacja/budowanie osobno nic nie daje. Zawsze zbudowanie apki podstawowej daje ten sam efekt.

Nie wiem co to znaczy "rozdzielanie projektów".

Od razu mówie, sprawdziłem na używanym do dzisiaj XE7 - problem ten nie występuje - zawsze jest plik BPL.
Sprawdziłem też na 11 i tam tak samo - zawsze jest plik BPL.

Stawiam na inną konfigurację kompilacji w różnych IDE.

Nie mam na tyle cierpliwości żeby pobierać XE3 i sprawdzać jak to tam wygląda.

pozdrawiam,

Mogę Ci pomóc Przemek, tylko nie wiem kiedy ;-)

PO
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:3
0

@wloochacz:

Ciebie To się tutaj nie spodziewałem :) Przeglądając chwilę przed wstawieniem posta to forum nie znalazłem znajomych ksyw z dawnych czasów :) Ale też nie szukałem jakoś dokładnie.

To Cię oświecę - ten "problem" sprawiłeś sobie sam i dotyczy każdej wersji Delphi.

Hmm...

Nie ma czegoś takiego jak xxxSystem.bpl, ale jest RTLXXX.BPL i to w tej paczce zawarty jest Runtime Library.

Ojtam ojtam. Chodzi o to, że standardowe paczki bpl są wkompilowane w jedną paczkę, żeby się za dużo plików nie walało po katalogu. To czy to ma sens, czy nie - to całkiem inna historia.

Ale co tu jest mało eleganckiego?
BPL to taki DLL tylko z odrobiną cukru, dzięki czemu łatwiej się tym wszystkim zarządza i używa.
Można sobie np. bezkarnie przekazywać referencję na obiekty, nie ma zdublowanych RTL, itd. itp.
Wada jest jedna - to działa tylko w Delphi, a więc kod dostarczony w BPL zadziała tylko i wyłącznie w Delphi/Builder pod warunkiem, że wszystkie BPL i EXE są kompilowane w tej samej wersji kompilatora.

Panie - nie ucz mnie podstaw. Chodzi o to, że dawno dawno temu, gdy to coś było stworzone to generowały się BPLki. Technicznie nie robi mi to różnicy czy to ma rozszerzenie BPL, EXE czy jakiekolwiek inne. Bardziej problem w tym, że po latach ten sam projekt przebudowywany w świeżo zainstalowanej XE2 robi tak że te BPLki są budowane do EXE. A ja nie chce przy okazji małej zmiany robić rewolucji.

Tak, ale paczka jest zbudowana w ten sposób że wszystkie moduły które są wymagane przez daną paczką, nie będą ładowane z innych BPL (np. SysUtils), a zostaną wkompilowane w Twoją BPLkę.
I to zadziała, ale naprawdę trzeba wiedzieć co się robi, ponieważ dany moduł może występować tylko i wyłącznie w jednej BPLcem, której używa Twoja aplikacja.
A więc nie możesz mieć tego samego modułu w dwóch różnych BPL, których używa Twoja aplikacja w runtime.

To jest jasne.

A więc jeśli zrobiłeś to co zrobiłeś, a potem używasz swojej packi i równocześnie np. paczki xxSDAC, która też używa modułu SysUtils to skończy się to błędem, ponieważ ten moduł jest zawarty w RTLXXX.BPL, której to paczki wymaga (w definicji paczki sdac w sekcji requires jest podana paczka rtl.bpl) xxSDAC.BPL.

Nie nie skończy się. To jest coś co działa, a nie coś nowego. xxSDAC.BPL nie ma w requires rtla :) I tak - za każdym razem przy kompilacji krzyczy że powinien być (zresztą nie tylko on).

A na pewno te profile kompilacji są identyczne pod kątem konfiguracji kompilacji ?

Nie powinny mieć niczego innego - w każdym przypadku świeże Delphi na świeżym obrazie systemu. A projekt ten sam. Test też ten sam.

Pytanie, czy ja coś źle robię?
Raczej na pewno.

No ja nie jestem do końca pewny. czysty system + czyste Delphi, w wersjach XE2, XE7 i D11 ten sam projekt testowy i tylko w pierwszym takie cuda się dzieją.
Poza tym w poszukiwaniach znalazłem jedno podobne zgłoszenie (tzn z podobnym efektem wyjściowym - zamiana bpl na exe na XE2) i żadne z proponowanych rozwiązań nie zadziałało.

Mogę Ci pomóc Przemek, tylko nie wiem kiedy ;-)

Wiesz, ogólnie to sam nie wiem czy się w to bawić. Mogę zawsze powiedzieć że nie mam czasu na bzdury i kopanie w historii, ale z drugiej strony klient to klient. Natomiast bardziej mnie zastanowił sam fakt takiego nieoczekiwanego zachowania Delphi, stąd moje pytanie.

pozdrawiam,
Przemek O.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
Przemek O. napisał(a):

@wloochacz:

No ja nie jestem do końca pewny. czysty system + czyste Delphi, w wersjach XE2, XE7 i D11 ten sam projekt testowy i tylko w pierwszym takie cuda się dzieją.
Poza tym w poszukiwaniach znalazłem jedno podobne zgłoszenie (tzn z podobnym efektem wyjściowym - zamiana bpl na exe na XE2) i żadne z proponowanych rozwiązań nie zadziałało.

To podeślij ten testowy projekt dla XE2 i D11.
Zobaczymy.

PO
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:3
0

Sorry że zamilkłem, ale że tak powiem bardzo, bardzo oględnie - olałem temat, więc nie zawracałem więcej głowy.
Dzięki za chęć pomocy!

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)