Autor Téma: Delphi 10.4 IDE mi automaticky doplňuje finally-end při každém enteru  (Přečteno 2677 krát)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Dobrý den,

je nějaký způsob jak resetovat funkci, která při každém enteru doplňuje finally-end i když všechny try-finaly a begin-end jsou správně. Prostě je IDE nějak zmagořené a já nevím co s tím mám dělat. Kód je v naprostém pořídku, lze jej spustit, ale prostě IDE prostředí na každý enter vloží výše uvedený paskvil. Jinak samozřejmě, po tom automatickém doplnění se kompilace přeruší právě kvůli zdvojenému finally-end. Asi nějaký bug.

Děkuji.
« Poslední změna: 07-10-2020, 09:26:11 od age.new »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7430
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
V podobných prípadoch najprv spustím build a verím, že to pomôže. Nateraz mi to funguje. Občas vyhodí chybu (ktorá to spôsobovala), ktorú kompilácia nezachytí.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Bohužel, compile nebo build nepomůže. Vše je bez chyby. Ale jakýkoliv enter v kódu vloží finally-end.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1144
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Mně to dělá taky (v Seattle), záleží na pozici kurzoru v bloku, je to asi nějaká chybka.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Je to pěkně blbá chyba ... dělá mi to v celé hlavní proceduře, která je v podstatě od začátku do konce unitu.

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1596
  • Karma: 52
    • Verze Delphi: 11.3
Můžeš sem dát nějakou třeba osekanou verzi té unity, kde to dělá? Podíval bych se u sebe (10.3.3).

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Ta unita je větší, navíc pracuje s procedury z dalších unit. Struktura begin-end, try-except, try-finally je v pořádku. Jinak by to ani nešlo spustit. Prostě je to nějak zmatené.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Prostě je to nějak zmatené.
Tak to zkus preformatovat prikazem View | Editor | Format Source, co ti to udela.  Jen si schovej puvodni tvar, protoze ve starsich verzich to byl spis slehac na text, nez pomocnik.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Tak formát zdrojáků podle Delphi taky nepomůže. Ten příkaz jsem měl v Project -> Format Project Sources.. ale i tak to pořád doplňuje ty paskvily.

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1596
  • Karma: 52
    • Verze Delphi: 11.3
Nemáš někdě nějaké "try" třeba v komentáři, v podmíněném překladu apod.? Tzn. kompilátoru by to nevadilo, ale editor by nechápal?

Dělá to úplně všude v té unitě (i když bys třeba psal novou proceduru hned za "uses" v sekci implementace), nebo až od nějakého místa níž?

K.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Žádné více řádkové komentáře. Ani podmíněný překlad. Ale asi už tuším - problém je patrně v anonymních funkcích, které mám v unitě. Po jejich vykomentování to přestalo. Vypadá to, že IDE si s nimi nerozumí a způsobí to tyto problémy.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1144
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Já žádné anonymní funkce nemám, a přesto v určitých situacích taky nastává :(

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Jj, nastává to třeba, když vytvoříš řádek TRY s tím, že časem nakonec procedury vytvoříš i FINALY. Jenže od této chvíli, kdekoliv dáš enter, tak ti to bude automaticky vkládat END aj. paskvily ... A POZOR ... i když dáš enter nad původním TRY, kde by to logicky nic vkládat nemělo. Ta logika asi nebude moc robustní :) 

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1596
  • Karma: 52
    • Verze Delphi: 11.3
Jinak pokud máte zapnuté persistentní bloky nebo jak tomu říkají, stačí mít označený kousek textu a pak to nic nevkládá. Teda alespoň u mě :-) Občas si tak pomáhám právě v situaci, kdy vím, že to finally za chvilku dolů půjdu dopsat.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Jj, nastává to třeba, když vytvoříš řádek TRY s tím, že časem nakonec procedury vytvoříš i FINALY. Jenže od této chvíli, kdekoliv dáš enter, tak ti to bude automaticky vkládat END aj. paskvily ... A POZOR ... i když dáš enter nad původním TRY, kde by to logicky nic vkládat nemělo. Ta logika asi nebude moc robustní :)
No ano, tohle je ovsem spatny postup psani zdrojoveho kodu ;D Programator neni pisarka, aby neco bezduse opisovala shora dolu, takze kdyz napisu try a zmacknu enter, tak ocekavam, ze se objevi prazdny radek pro telo a klauzule finally-end s kurzorem na prazdnem radku, aby se dalo rovnou pokracovat ve psani tela. Osobne bych uvital, kdyby to dalo kurzor na radek za  finally (a mam dojem, ze kdyz jsem delal v Delphi, tak jsem si ty sablony tak upravoval), protoze try clovek pise za vytvoreni/ziskani prostredku, ktery je treba uvolnit a tak to hned uvolnim. Tim, ze to pisu hned parove, tak na to nikdy nezapomenu a nevzpominam si, kdy jsem naposledy chyboval v uvolnovani nejakeho prostredku. A pak se teprv vratim do tela a plne se soustredim na jeho obsah a zivotnim cyklem uz se nezabyvam.

Takze me to prijde jako naprosto prirozene a spravne chovani editoru, ktery se snazi programatorovi ulehcit praci... Je to uplne stejne, jako kdyz enter po begin automaticky vygeneruje end;
« Poslední změna: 08-10-2020, 14:53:26 od pf1957 »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Tak formát zdrojáků podle Delphi taky nepomůže. Ten příkaz jsem měl v Project -> Format Project Sources.. ale i tak to pořád doplňuje ty paskvily.
To nemelo vyresit problem, ale pripadne naznacit, na cem se eventualne rozsype formatovani tj. noreni bloku...
« Poslední změna: 08-10-2020, 14:52:51 od pf1957 »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
No ano, tohle je ovsem spatny postup psani zdrojoveho kodu ;D Programator neni pisarka, aby neco bezduse opisovala shora dolu, takze kdyz napisu try a zmacknu enter, tak ocekavam, ze se objevi prazdny radek pro telo a klauzule finally-end s kurzorem na prazdnem radku, aby se dalo rovnou pokracovat ve psani tela. Osobne bych uvital, kdyby to dalo kurzor na radek za  finally (a mam dojem, ze kdyz jsem delal v Delphi, tak jsem si ty sablony tak upravoval), protoze try clovek pise za vytvoreni/ziskani prostredku, ktery je treba uvolnit a tak to hned uvolnim. Tim, ze to pisu hned parove, tak na to nikdy nezapomenu a nevzpominam si, kdy jsem naposledy chyboval v uvolnovani nejakeho prostredku. A pak se teprv vratim do tela a plne se soustredim na jeho obsah a zivotnim cyklem uz se nezabyvam.

Takze me to prijde jako naprosto prirozene a spravne chovani editoru, ktery se snazi programatorovi ulehcit praci... Je to uplne stejne, jako kdyz enter po begin automaticky vygeneruje end;

To ať klidně generuje, ale ať to tak udělá hned po napsání TRY nebo BEGIN. A nedělá to pak při jakémkoliv dalším enteru. Toto je přeci snadno ošetřitelné. Navíc proč to generuje FINALLY a END i v případě, že dáte enter kdekoliv v kódu výše než je TRY nebo BEGIN. To přeci není správné. Respektive z mého pohledu vnořování. Ta logika je tupá a prostě se snaží uzavřít vše co je otevřené.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
BEGIN. To přeci není správné. Respektive z mého pohledu vnořování. Ta logika je tupá a prostě se snaží uzavřít vše co je otevřené.
No pokud se to chova takto divne, tak tam chyba nejspis bude, zrejme ve spojeni s temi anonymnimi metodami, jak pises, protoze IDE vzdycky kulhalo za prekladacem.

I kdyz jsem nepochopil, jak muzes napsat try, dat enter a cituji "...že časem nakonec procedury vytvoříš i FINALY...", kdyz to ti tam finally vygeneruje hned.

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1596
  • Karma: 52
    • Verze Delphi: 11.3
I kdyz jsem nepochopil, jak muzes napsat try, dat enter a cituji "...že časem nakonec procedury vytvoříš i FINALY...", kdyz to ti tam finally vygeneruje hned.

Třeba už mám napsaných pár řádků, ale zjistím, že ještě budu potřebovat nějaký tMemoryStream. Tak si ho deklaruju, před těmi existujícímí řádky dám .Create, try... A od té doby Enter znamená, že se vloží finally end. Možná by stačilo, když by někde v nastavení bylo, zda to má vkládat vždycky, nebo jen když uživatel stisknul Enter hned za tím try.

Ale neříkám, že mi to stávající chování vadí - jednak to alespoň nutí to finally rovnou napsat a nezapomenout na něj, druhak kdybych ho hned psát nešel, tak si označím kousek textu, a pak to nedoplňuje.
« Poslední změna: 09-10-2020, 08:55:21 od vandrovnik »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Třeba už mám napsaných pár řádků, ale zjistím, že ještě budu potřebovat nějaký tMemoryStream. Tak si ho deklaruju, před těmi existujícímí řádky dám .Create, try... A od té doby Enter znamená, že se vloží finally end. Možná by stačilo, když by někde v nastavení bylo, zda to má vkládat vždycky, nebo jen když uživatel stisknul Enter hned za tím try.

Přesně to jsem myslel... doplnit jen 1x za TRY nebo BEGIN a pak už ne.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Třeba už mám napsaných pár řádků, ale zjistím, že ještě budu potřebovat nějaký tMemoryStream. Tak si ho deklaruju, před těmi existujícímí řádky dám .Create, try... A od té doby Enter znamená, že se vloží finally end.
Ale to ja povazuju za spravne chovani: chce to po tobe, abys uzavrel blok, takze kurzor za existuji radky a enter. Navic to muzes psat odzadu tj. nejprve to ve finally uvolnit a pak pred try doplnit konstrukci a kdyz ne in-line variable, tak jeste definovat promennou v odpovidajicim scope...

Citace
Možná by stačilo, když by někde v nastavení bylo, zda to má vkládat vždycky, nebo jen když uživatel stisknul Enter hned za tím try.
Ono to tam je: Options | Editor Options | Code Insight | Block completion

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1596
  • Karma: 52
    • Verze Delphi: 11.3
Ono to tam je: Options | Editor Options | Code Insight | Block completion

A jo, takže když to někomu bude dělat neplechu, mělo by stačit tam nastavit "New blocks only".

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Ono to tam je: Options | Editor Options | Code Insight | Block completion

To ale zablokuje veškeré doplňování ne? To bych zas nechtěl :) ... krátký příběh ze života: Roky jsem dělal v Delphi 6 a 7. Když jsem začal s XE2 verzí, prskal jsem pokaždé, když mi editor doplnil nějaké řádky za mě. Teď když dělám roky s novým Delphi a občas se musím vrátit k D6/D7, tak prskám, když mi editor řádky nedoplňuje, že to musím psát sám.

Ta funkce je fajn (kromě doplňování u cyklu FOR - to jsem snad nikdy nevyužil). Ale jen je škoda, že má takové chybky.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Excellent
Rated 1 time
To ale zablokuje veškeré doplňování ne? To bych zas nechtěl :)
Tak si to vyzkousej, jak se to chova. Ja s default chovanim problem nemam.

A mam jiny pribeh ze zivota: nekdy pred 35 lety jsem mel vypiplany MultiEdit od American Cybernetics k obrazu svemu, mel do nej napsano hafo scriptu, sablon atd. A kdyz jsem prisel k jinemu pocitaci, kde sice byl Multiedit, ale bez mych scriptu, tak jsem s tim skoro nedokazal delat.
A pak mi v nejake dalsi verzi zmenili scriptovaci jazyk z Pascal-like na C-like a to byl pro mne dostatecny impuls, abych si prestal prizpusobovat nastroj, ale prizpusobil se nastroji. Konec koncu je to jedina cesta, jak muzes efektivne prechazet mezi ruznymi platformami a nastroji.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Tak je to jasné. V editoru jsou nějaké neplechy s anonymními metodami. Použil jsem v novém kódu anonymní vlákno a od té doby mi v celém kódu po enteru vkládá "until ;". Je to nějaké pomatené.