Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Jak obsługiwać Scintillę?

25 views
Skip to first unread message

Borneq

unread,
Sep 27, 2013, 2:13:43 PM9/27/13
to
Użytkownik "R.e.m.e.K" <g...@dev.null> napisał w wiadomości
news:5243209a$0$2227$6578...@news.neostrada.pl...
> http://code.google.com/p/dscintilla/

Są dwa sposoby komunikacji z tą kontrolką:Windows.SendMessage albo
FDirectFunction(FDirectPointer, AMessage, WParam, LParam);
Ta druga metoda jest szybsza, ale może powodować problemy w pracy z wątkami.
Dlatego też warto zrobić property, w jaki sposób się komunikować.
To jest grupa Delphi, ale chcę oprogramować Scintillę we FreePascalu. Jak to
zrobić w Linuxie? Odpowiednik SendMessage jest w ScintillaGTK.cxx, ale jak
to wywołać z Pascala? Czy trzeba będzie zrobić bibliotekę .so w C++, którą
wołał będzie Pascal?
(wysyłam Cross na Pascal)

Arivald

unread,
Sep 27, 2013, 2:27:11 PM9/27/13
to
W dniu 2013-09-27 20:13, Borneq pisze:
SendMessage jest bezpieczna wątkowo, bo to system dba o wątki i
bezpieczeństwo jeśli przesyłasz komunikat pomiędzy wątkami.

Ale korzystając z drugiej metody, FDirectFunction, też można to zrobić
bezpiecznie. Po prostu trzeba zrobić kolejki komunikatów, z całą otoczką.
I ta wersja będzie działała tak samo zarówno w Windows jak i w Linuxie,
a nawet w Javie. Różnice będą tylko w sposobie tworzenia nowego wątku i
sposobie synchronizacji.

Albo po prostu uznaj że Scintilla może pracować tylko i wyłącznie w
wątku GUI, zresztą jak cały VCL. Wtedy obejdzie się bez kolejek itd.

--
Arivald

Borneq

unread,
Sep 27, 2013, 3:36:31 PM9/27/13
to
Użytkownik "Arivald" <NOSPAM...@interia.pl> napisał w wiadomości
news:l24irq$6td$1...@news.dialog.net.pl...
> Albo po prostu uznaj że Scintilla może pracować tylko i wyłącznie w wątku
> GUI, zresztą jak cały VCL. Wtedy obejdzie się bez kolejek itd.

Najlepiej property, gdy nie zależy nam na tym, by z wątku pisać do
kontrolki, co będzie bardzo często, może być direct. Zastanawiam się nad
Linuxem, na razie nie mam wprawy w programowaniiu pod nim, ale gdy złożę
komputer, zacznę działać. Zależy mi na przenośności.
Sama kontrolka działa, wystarczy utworzyć okno odpowiedniej klasy, nie wiem
czy ten sposób wystarczy dla Linuxa, brakuje mi tam przykładów. Zostaje parę
tysięcy stałych, ale to trzeba będzie przekonwertować automatycznie z pliku
Scintilla.iface.

Arivald

unread,
Sep 27, 2013, 4:15:01 PM9/27/13
to
W dniu 2013-09-27 21:36, Borneq pisze:
W Linuksie komunikacja z ekranem jest zupełnie inna niż w Windows.
Chociażby fakt że proces aplikacji, i proces wyświetlający ją to różne
procesy, zresztą niekoniecznie na jednym komputerze ;-)

Nie ma też SendMessage. Za to są inne metody IPC (sygnały, rurki,
sockety, etc). Chyba najpodobniejsze są kolejki komunikatów (System V
message queue).

http://www.tldp.org/LDP/tlk/ipc/ipc.html

--
Arivald

Borneq

unread,
Sep 27, 2013, 4:33:08 PM9/27/13
to
Użytkownik "Arivald" <NOSPAM...@interia.pl> napisał w wiadomości
news:l24p5v$9si$1...@news.dialog.net.pl...
> Nie ma też SendMessage. Za to są inne metody IPC (sygnały, rurki, sockety,
> etc). Chyba najpodobniejsze są kolejki komunikatów (System V message
> queue).
Ale aby upodobnić wołanie w Windows i Linuxie, jest dostarczony ze Scintillą
plik ScintillaGTK.cxx gdzie jest scintilla_send_message, która to procedura
woła ScintillaGTK::WndProc, problem jest że to napisane w C++ podczas gdy
chcę wołać z Pascala, jak połączyć, czy zrobić małą DLL-kę pośredniczącą a
właściwie shared object .so ? GTK+ podobno działa też pod Windows, więc
można by najpierw tutaj przetestować.

Arivald

unread,
Sep 27, 2013, 4:49:38 PM9/27/13
to
W dniu 2013-09-27 22:33, Borneq pisze:
C++ bezpośrednio nie zlikujesz z Pascalem, bo schemat manglowania nazw
jest zupełnie inny.

Sprawdź czy w plikach Scintilli nie ma exportów w języku C (w pliku
będzie fraza 'extern "C" {' oznaczająca exporty dla "C" bez manglowania).

Zresztą wieli innych języków też wymaga łączenia przez exporty w C, więc
na pewno to tam jest.

--
Arivald

Borneq

unread,
Sep 27, 2013, 5:20:43 PM9/27/13
to
Użytkownik "Arivald" <NOSPAM...@interia.pl> napisał w wiadomości
news:l24r6s$apc$1...@news.dialog.net.pl...
> Sprawdź czy w plikach Scintilli nie ma exportów w języku C (w pliku będzie
> fraza 'extern "C" {' oznaczająca exporty dla "C" bez manglowania).

Jest w pliku scintilla\win32\ScintillaWin.cxx
a w katalogu GTK jest plik scintilla-marshal.c

Borneq

unread,
Sep 27, 2013, 6:27:21 PM9/27/13
to
Użytkownik "Arivald" <NOSPAM...@interia.pl> napisał w wiadomości
news:l24r6s$apc$1...@news.dialog.net.pl...
> C++ bezpośrednio nie zlikujesz z Pascalem, bo schemat manglowania nazw
> jest zupełnie inny.

Scintilla może byc podobno linkowana statycznie (scintilla.a), We
Freepascalu da się zlinkować kod Pascala z kodem w czystym C?

Arivald

unread,
Sep 28, 2013, 3:12:28 AM9/28/13
to
W dniu 2013-09-28 00:27, Borneq pisze:
W Delphi tak, we freepascal pewnie też, w windsows to będą to plik *.obj
(generowany z pojedyńczej jednostki kompilacji) i *.lib (zestaw plików
*.obj).

Nie pamiętam teraz dokładnie, ale w Linuxie tą samą funkcją pełnią pliki
*.o i *.a.


Ale jak dokładnie to działa to Ci nie powiem...
W Delphi wystarczy dodać "{$L filename.OBJ}" w sekcji implementation. I
oczywiście musisz znać dokładnie nazwy i sygnatury funkcji, ale
generowania ich są odpowiednie narzędzia, poszukaj w programach
dołączonych do IDE.

--
Arivald

0 new messages