Problem z niczego...

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0

@lampasss: mnie namawiał, to opiszę, a nóż widelec ktoś coś będzie wiedział ;-)

U jednego klienta, na różnych komputerach, są z moim systemem dziwaczne problemy.
Aplikacja napisana w Delphi XE, działająca na Win10 Pro (kompilacja 17134.407).
Klient zgłasza, że program działa dobrze, po jakimś czasie zaczyna działać wolniej albo się zacina, zawiesza a w efekcie często po protu znika bez komunikatu błędu.
Używam Eureki, ale ona również niczego nie widzi.

Problem występuje tylko u jednego klienta (ale na wielu komputerach w firmie), ta sama aplikacja u innych działa poprawnie.
Sprawdziłem wszystko co mogłem w programie i jego otoczeniu, wszystko wydaje się OK.

I nagle wczoraj, na sesji z klientem zauważyłem coś, co mnie zmroziło.

  1. User odpala akcję dodaj załączniki
  2. Otwiera się standardowy OpenDialog.
  3. User wybiera pliku, które są dodawane do danego dokumentu.

Po chwili system wisi, potem znika.
Myślę: StackOverflow w aplikacji?

Sprawdzam jeszcze raz, ale coś mnie tknęło i włączyłem sobie TaskManagera z boku.

  1. Odpal formatki, wszytko ok.
  2. Chcę dodać załącznik, dodając plik z dysku.
  3. Odpala się OpenDialog i pamieć zostaje zużywana przez proces mojego programu w tempie 10-50 MiB na sekundę. Na oko. Po zamknięciu Open Dialog RAM dalej rośnie i nie przestaje aż do totalnej zwiechy.

W pierwszej chwili myślałem, że może coś ze strumieniami pogmerałem (które są używane przy wczytywaniu plików) albo cokolwiek.
Ale dobra, proszę klienta o restart aplikacji i chcę sprawdzić czysty OpenDialog bez żadnych strumieni.
Wiem, gdzie mam prosty temat również ze standardowym OpenDialog.
Wykonujemy akcję, która odpala OpenDialog i program w tle nic nie robi - po prostu czeka aż OpenDialog się zamknie.

Otwarcie OpenDialog, znowu powoduje masowe zużywanie RAM.
WTF?!

Zauważam, że klient używa OpenDialog na wypasie - z włączonymi wszelkimi podglądami plików.
Używa dużo PDFów i przeglądarki PDFów z Acrobat Readera, która się integruje z Windows Explorer.
I ta przeglądarka jest osadzona w OpenDialog.
Nie wiem czy to trop, ale proszę go takie skonfigurowanie dialogów, aby przeglądarki plików i katalogów zostały wyłączone.
Sprawdzam ponownie.
Teraz działa normalnie.

Czy ktoś coś wie?
Czy ktoś z Was spotkał się z takim tematem?
A może jakieś sugestie?

Sam chcę sprawdzić inne użycie OpenDialog. Może nie Delphiowe (które używa standardowego OpenDialog z windows), jeszcze nie wiem co i jak dokładnie...

edytowany 2x, ostatnio: flowCRANE
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

Daj może tutaj "gołą" aplikacje testową (w sensie - sam mechanizm z OpenDialogiem), zobaczę, czy u mnie się zachowuje podobnie.


LA
  • Rejestracja:ponad 11 lat
  • Ostatnio:dzień
  • Postów:469
0

Trop z PDF może być trafny, u mnie kiedyś PDF sam w sobie w sytemie otwierał się 20 sekund, a pliki były małe.
Prosta akcja, niech ktoś nawet na innej wersji delphi - ja mam Berlina tomogę Ci wystawić jakąś formatkę z Opendialogiem i sprawdzisz apke u Klienta.
Jak będzie powtórka to czyli nie wina delphi.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0

Dla wszystkich, którzy czytają, mam update info ;-)

Problemy występuje przy zwykłym OpenDialog.Execute - i tu już jest masowe zużycie pamięci.
Ale występuje tylko wtedy, gdy OpenDialog ma włączony podgląd drzewa katalogów. Bez tego podglądu drzewa katalogów, wszystko zachowuje się normalnie. Podgląd plików w OpenDialog też nie powoduje problemów.

Ja mam dokładnie tę samą wersję systemu co klient, u mnie problemów nie ma.
Zresztą u innych klientów, też nie ma...

Co ma ten klient, czego nie mają inni?
Używa sporej ilości zamapowanych dysków sieciowych, które udostępnia Synology RS814 z DMS 6.1.
Widziałem, ze czasem te dyski w OpenDialog są widoczne jako nieaktywne, ale klikniecie na taki dysk spowoduje jego wybudzenie.
Może to jest jakiś trop?

@cerrato Goła aplikacja testowa, to formatka z OpenDialog.Execute. I taki problem pewnie nie wystąpi u Ciebie jak i nie występuje u mnie :/
@lampasss Nie jest to problem z PDF ani z obsługa plików w aplikacji. To ma sprawdzone dokładnie.

PS.
Dzięki za zainteresowanie :)

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0

a nie ma jakichś dodatków do Eksploratora, np. Clover https://www.dobreprogramy.pl/Clover,Program,Windows,37495.html czy czegoś podobnego?


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
1

żywa sporej ilości zamapowanych dysków sieciowych

No to na logikę, najprostszym krokiem jest wywalenie tych dysków na czas testów i zobaczenie, czy error się będzie pojawiać.
Napisz jeszcze (bo nie do końca jest to jasno powiedziane), czy na tych "wadliwych" kompach problem się pojawia zawsze, czy tylko jak mu się zachce. W sensie - na ile jest reprodukowalny?


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

a nie ma jakichś dodatków do Eksploratora, np. Clover https://www.dobreprogramy.pl/Clover,Program,Windows,37495.html czy czegoś podobnego?

Z tego co wiem na dziś, jest używany preview od Acrobat Readera i Office i nic więcej.
Ale oczywiście dowiem się więcej, też moje podejrzenia meandrują w tę stronę.

Ale - dlaczego problem znika po wyłączeniu drzewa katalogów?
Tego nie potrafię wyjaśnić.
Jeszcze :)

cerrato
jak pisałem - odmapuj i wywal dyski sieciowe i zobacz, czy coś to dało. Mało z tym pracy, a odpowiedź będziesz miał prawie natentychmiast ;)
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
cerrato napisał(a):

żywa sporej ilości zamapowanych dysków sieciowych

No to na logikę, najprostszym krokiem jest wywalenie tych dysków na czas testów i zobaczenie, czy error się będzie pojawiać.

Dokładnie i tak będziemy to testować.

Napisz jeszcze (bo nie do końca jest to jasno powiedziane), czy na tych "wadliwych" kompach problem się pojawia zawsze, czy tylko jak mu się zachce. W sensie - na ile jest reprodukowalny?

I to jest ciekawe, bo wg moich obserwacji problem występuje zawsze, ale nie zawsze przy pierwszym uruchomieniu OpenDialog.
Czasem jest to 1, a czasem 5 odpalenie OpenDialog, ale w końcu zawsze wystąpi.
Userzy tam dodają masę plików do systemu.
Czasem popracują godzinę, czasem pół dnia a czasem 5 minut...

Najciekawsze jest to, że aplikacja alokuje co jakiś czas (na oko co kilka sekund) ilość RAM, którą alokuje OpenDialog przy Execute.
Dzieje się to po zamknięciu OpenDialog (tak jakby w tle działała pętla co kilka sekund robi OpenDialog.Execute i nie zwalniała pamięci), ale dzieje się to poza aplikacją (w WindowsAPI), ale w kontekście procesu aplikacji. No masakra jakaś...

Najciekawsze jest to, że OpenDialog zawsze powoduje zużycie RAM. Tam jest ładowana cała masa bibliotek i dodatków COM, a wszystko jest wstrzykiwane w proces nadrzędny (wywołujący OpenDialog).
Tak to działa w Windows i koniec.

Znalazłem rozwiązanie - napisanie programu, który tylko Odpala OpenDialog i się zamyka, a dane do nadrzędnej aplikacji przekazuje jakoś (np. pipe czy WM_COPYDATA).
To wygląda na chory temat, ale jak nie będę miał wyjścia...

edytowany 1x, ostatnio: wloochacz
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0

Jeszce jeden UpdateInfo od kolegi programisty:

TOpenDialog i tFileOpenDialog działają tak samo. Nawet używają tych samych obiektów.
Przy obu pamięć rośnie do 10MB... 15MB przy przeglądaniu. Jak naprzemiennie ich używasz w tym samym programie to nadal jest 10MB (czyli korzystają pod spodem z tych samych obiektów).

Raz na kilkanaście wywołań u mnie, bez żadnej widocznej przyczyny Tortoise się podłącza pod ten proces i zaczyna sobie cache budować.
i to nie ma znaczenia czy przeglądam katalogi gita, czy nie.
OpenDialog.png

Tylko co się podłącza u mojego klienta?

LA
Git skanuje folder, to może jakiś AV skanuje folder - mają tam jakieś AV? Sprawdzić na wyłączonej ochronie.
WL
Oczywiście, że mają AnitVirusa. Ale to na pewno nie to, ponieważ nie wyjaśnia wielu aspektów które pokazałem a poza tym... AV sprawdzałem już dawno temu bez rezultatów.
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

Znalazłem rozwiązanie - napisanie programu, który tylko Odpala OpenDialog i się zamyka,

Prowizorka, ale może być skuteczna ;)
Zresztą - jak coś jest głupie, ale działa, to znaczy, że nie jest głupie ;)


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

żywa sporej ilości zamapowanych dysków sieciowych

No to na logikę, najprostszym krokiem jest wywalenie tych dysków na czas testów i zobaczenie, czy error się będzie pojawiać.

Sprawdzone; odłączenie wszystkich dysków sieciowych, a włączenie widoku drzewa katalogów w OpenDialog niczego nie zmienia.
Tak więc drogą eliminacji na dziś wiem, że to jedyne rozwiązanie (wyłączenie drzewa katalogów w OpenDialog), które daje pozytywne wyniki.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

Panie @wloochacz - czy mamy jakieś nowe informacje odnośnie "problemu z niczego"? ;)


WL
Są nowe wątki, ale jeszcze nie skończyliśmy sprawdzać pozostałych tropów.
cerrato
podziel się w takim razie i napisz, jakie są aktualne tropy/podejrzenia. Jestem ciekawy, a poza tym może kiedyś ta informacja mi też się przyda :)
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

@wloochacz: minęły dwa tygodnie od ostatniego posta. Czy coś udało Ci się w temacie wyjaśnić? Masz może jakieś nowe obserwacje, teorie albo inne rzeczy, którymi fajnie by było się z nami podzielić? :P


WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0

Nic nowego poza tym co napisałem wcześniej.
Po prostu na kilku komputerach (nie na wszystkich w tej samej firmie) włączanie drzewa katalogów w Open i SaveDialog powoduje takie jaja.
Co ciekawe, tam są dwa identyczne komputery Dell i na jednym problem występuje a na innym nie.

Nie posiadam szerszych informacji o różnicach w oprogramowaniu firm trzecich (jakieś CAD/CAM tam jest, ale nie wiem dokładnie co) na tych Dellach.

Po prostu napisaliśmy sobie wrapper na Open/Save Dialog i tyle.
Ekonomika wygrała - nikt minie zapłaci za głęboki research ;-)

A informacji na interentach u zużyciu ramu przy różnych scenariuszach użycia Eksploatatora Windows jest całkiem sporo...

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

Po prostu napisaliśmy sobie wrapper na Open/Save Dialog

A czy napiszesz coś więcej? Wcześniej pojawiła się opcja/pomysł, żeby stworzyć osobną apkę, której jedynym zadaniem będzie odpalenie dialogu, a potem (zanim pojawią się zwiechy) zamknięcie się. Właśnie w tym kierunku poszedłeś, czy wykminiłeś coś innego?


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

Po prostu napisaliśmy sobie wrapper na Open/Save Dialog

A czy napiszesz coś więcej?

A co tu pisać?

Wcześniej pojawiła się opcja/pomysł, żeby stworzyć osobną apkę, której jedynym zadaniem będzie odpalenie dialogu, a potem (zanim pojawią się zwiechy) zamknięcie się. Właśnie w tym kierunku poszedłeś, czy wykminiłeś coś innego?

Tak, jest apka która ma takie zadanie jak wyżej i komunikacja pomiędzy procesem (to musi być nowy proces, który startuje, odpala dialog, zwraca dane i zamyka się - inaczej będzie tak samo jak wcześniej, tylko w innym procesie) głównym a wrapperem.
To wszystko.
Nie za bardzo jest co wykminić co innego; testowałem tez OldStylDialog, ale to nie wprowadziło żadnych zmian.
A pisać własny dialog od zera naprawdę mi się nie chciało.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

To jeszcze napisz proszę (i obiecuję - przestanę Cię męczyć :D) w jaki sposób rozwiązałeś komunikację między apką z dialogiem a "główną".

Czy wywołujesz to z jakiegoś DLL'a, czy w inny sposób? I jak przekazujesz nazwę pliku do "aplikacji głównej" - bo zakładam, że po wybraniu przez użytkownika pliku do otwarcia, wrapper jedynie przekazuje jego nazwę/lokalizację, a nie wczytuje i nie przekazuje całej treści pliku.


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

To jeszcze napisz proszę (i obiecuję - przestanę Cię męczyć :D) w jaki sposób rozwiązałeś komunikację między apką z dialogiem a "główną".

Czy wywołujesz to z jakiegoś DLL'a, czy w inny sposób?

DLL?
OpenDialog musi być uruchomione w osobnym procesie.

A więc jest sobie exe, którego zadaniem jest odpalenie OpenDialog z przekazanymi z hosta parametrami.
Owo exe odpala OpenDialog, a potem do hosta przekazuje listę plików, które zostały wybrane w OpenDialog.
Analogicznie dla SaveDialog.

Do tego w aplikacji Host istniej wrapper na cały ten bałagan, którego zadaniem jest używanie całego mechanizmu identycznie jak zwykłego Open/Save Dialog.
W zależności od globalnej flagi konfiguracyjnej systemu, wrapper używa zewnętrznej aplikacji lub standardowych dialogów.

I jak przekazujesz nazwę pliku do "aplikacji głównej" - bo zakładam, że po wybraniu przez użytkownika pliku do otwarcia, wrapper jedynie przekazuje jego nazwę/lokalizację, a nie wczytuje i nie przekazuje całej treści pliku.

No to by było raczej mało sensowne :D
Oczywiście do hosta przekazywane są tablice stringów zawierające pełne ścieżki do plików z wykorzystaniem WM_COPYDATA.

cerrato
Dziękuję za wyjaśnienie, przesłuchanie zakończone, może Pan iść do domu ;)
LA
  • Rejestracja:ponad 11 lat
  • Ostatnio:dzień
  • Postów:469
0

pozdrawiam @wloochacz'a

Aż dziwne, że to się musiało tak skończyć. Działa - jest OK, ale sam fakt pisania aplikacji osobnej do tego jest moim zdaniem dziwny, co oni tam mają na tych komputerach (czy tam serwerach plikowych) hmm...
Jak nie opendialog, to coś możę się sypać przy drukowaniu czy wysylaniu maila... oby nie trzeba było osobnych exeków robić innych :),

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

pozdrawiam @wloochacz'a

Elo ;-)

Aż dziwne, że to się musiało tak skończyć. Działa - jest OK, ale sam fakt pisania aplikacji osobnej do tego jest moim zdaniem dziwny, co oni tam mają na tych komputerach (czy tam serwerach plikowych) hmm...

Nie wiem, nie znam się, zarobiony jestem.
Klient jest zachwycony, bo mu system normalnie działa.
Ja jestem zachwycony, bo nie męczę się z tym gównem już, a trwało to z pół roku...
Metoda czołgowa czasem jest pomocna (innymi słowy, daliśmy całusa brzytwie -> KISS + Ockham Razor :P) ;-)

Jak nie opendialog, to coś możę się sypać przy drukowaniu czy wysylaniu maila... oby nie trzeba było osobnych exeków robić innych :),

Na szczęście po eliminacji problemu z wysysaniem pamięci przez OpenDialog wszystko zaczęło działać jak trzeba.
A to wysysanie pamięci jest "fascynujące" - sam widziałem zużycie ok 10-12 MB co ok. 1,5s; aplikacja kończyła swój żywot po kilkunastu minutach działania, działając coraz bardziej mułowato...

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

Ciekawe, czy ma to jakiś związek z Delphi, czy jest to stricte jakiś zonk na poziomie systemu. Bo jeśli to jest błąd systemu/jakichś dodatków czy pluginów zainstalowanych w systemie (przykładowo, pisałeś coś wcześniej o generowaniu miniaturek plików, integracji PDF'a z explorerem itp.), to analogicznie powinno się dziać w innych aplikacjach odpalanych na tych komputerach, które korzystają z Windowsowych dialogów. Aczkolwiek pewnie zaraz napiszesz, że żaden inny program tak dużo i mocno nie jest wykorzystywany jak ten Twój, więc nie ma jak sprawdzić/porównać ;)


KR
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • Postów:174
0

To chyba coś z komunikacją windows <> delphi i nie tylko, bo ja mam ten sam problem w Lazarusie, jeśli używam komponentu opendialog to często program mi się wykrzacza po którymś razie, używam Windowsa 10 ;-(

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

No to aż się prosi, żeby zrobić analogiczną apkę w C++ builderze i zobaczyć, jak się to zachowa. Obecnie to nie wygląda mi na problem stricte Delphiowy, ale raczej coś skopanego w dialogach Windows10. Tylko niemożliwe, żeby nikt inny na świecie tego nie zauważył ;)


KR
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • Postów:174
0

Może chodzi o to, że w Lazarusie generuję aplikację 32bit a Windows 10 jest 64bit? Zresztą na Win10 czasami też wykrzaczają się aplikacje gdzie używam biblioteki Indy - szczególnie podczas odpalania z poziomu IDE.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

Teoretycznie apki32-bit na maszynie 64 powinny chodzić bezstresowo, jeśli jesteś w stanie coś uruchomić na Windows 32-bit to tak samo powinno to chodzić na 64. Jeszcze jakby chodziło o jakieś sterowniki czy inne niskopoziomowe działania, to moglibyśmy szukać tutaj powodu, ale dialog openFile jest naprawdę jedną z podstawowych części składowych systemu. A co do Indy - zachęcam do spróbowania Synapse. @olesio może potwierdzić :)


KR
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • Postów:174
1

Teoretycznie 32bit powinny działać bezstresowo na Win10/64:) Ale np. taki Total Commander 32bit czasem robi problemy, a jak wiadomo jest napisany w Delphi:)

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

Tak technicznie rzecz biorąc, to od. 2010 roku rozpoczęła się migracja na Lazarusa/FPC, więc podejrzewam, że obecnie całość jest pisana jedynie w tym środowisku:
https://www.ghisler.com/history.txt - "14.07.10 Added: Start work on conversion to Lazarus/Free Pascal in preparation for 64-bit version"


edytowany 1x, ostatnio: cerrato
PD
w lazarusie jest pisana wersja x64, wersja 32bit jest nadal pisana w delphi - w delphi 2 z tego co kojarzę
cerrato
Wiem, że tak było kilka lat temu, ale aż ciężko uwierzyć, żeby po pierwsze nadal pisał w dwójce, a po drugie żeby pisał to w dwóch różnych środowiskach. Aczkolwiek wiem tylko tyle, ile jest dostępne w necie, żadnych wtyków u nich nie mam ;)
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Hej. Życie w biegu nadal trwa ;) Także jak ktoś wspomni tutaj nick mój to chociaż e-mail mi o tym "powie", bo e-male akurat czytam. I tak, Synapse jest spoko. Jednak można się borykać z kilkoma problemami. Jeśli chcemy mieć na przykład prawidłowy odczyt stron po HTTPS konieczne jest pobranie najnowszych bibliotek DLL do obsługi SSL, jak też samego zestawu modułów Synapse. O czym dopiero mi tutaj niedawno napisał @kAzek. I sam miałem problem cóż tam źle działa i dlaczego. Przy okazji pozwolę sobie skrobnąć do Ciebie @cerrato PM. Bo widzę że udzielasz się w tym dziale, zdaje się w dawnych wątkach coś od siebie więcej pomagałeś właśnie z Synapse. A jeżeli miałbyś też jakąś wiedzę o Java Script na pewno lepszą od mojej niemal zerowej to kiedy wygram w Toto Lotka odpalam 1/2 wygranej Tobie za pomoc. Tylko jest standardowy problem. Nie gram w takie loterie i nie mam w życiu za dużo szczęścia. A reszta będzie na PM.


Pozdrawiam.
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:16 minut
  • Lokalizacja:Poznań
  • Postów:8764
0

@olesio: Smiało, wbijaj na PW, jeśli będe w stanie to chętnie pomogę, ale niczego obiecać nie mogę :(

Zawsze możesz też pójść drogą tradycyjną i wrzucić pytanie na forum. Więcej osób, do tego wiele z nich mądrzejszych i bardziej doświadczonych, to większa szansa na uzyskanie sensownej odpowiedzi, niż bazowanie na jednym, do tego średnio rozgarniętym szczurku ;)


KR
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • Postów:174
0

Skoro ten wątek stał się taką "odkrywką" do tematów problematycznych z Delphi/Lazarus/Indy itp, to może zapytam - jako że dotąd używałem Indiego by pobierać zawartość jakiejś strony i analizować ją - w Lazarusie, próbowałem też w Delphi standardowego komponentu webbrowser - ale wiadomo nie działa z każdymi stronami. Czy synapse działa jak Indy, czy może ma komponent jakiejś wirtualnej przeglądarki, żeby można było symulować zachowanie użytkownika na stronie www, javascript itp?

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)