Diskuze: Soubory - neplatná cesta

Ostatní jazyky Delphi Delphi (Pascal) Soubory - neplatná cesta

Avatar
pavel
Člen
Avatar
pavel:

dobrý den
Vytvořil jsem jednoduchý program na soubory, jenže mi to hlásí chybu RunError3 - myslím si, že je to neplatná cesta, vyskakuje mi to hned u první procedury, kdy vytvářím soubor. Nevím, proč se mi to najednou objevilo, myslím si, že kˇod je v pořádku. Navíc jsem zjistil, že to tak dělá i u jiného programu, který před tím jel.

 
Odpovědět 14. února 16:38
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na pavel
Martin Dráb:

Jakou hodnotu v době vyvolání výjimky (či těsně před provedením rewrite(f);) má SaveDialog1.Fi­leName?

Nahoru Odpovědět 14. února 18:24
2 + 2 = 5 for extremely large values of 2
Avatar
pavel
Člen
Avatar
Odpovídá na Martin Dráb
pavel:

Moc přesně nechápu, co myslíš. Zkusím popsat, co se děje v programu, když běží. Chci vytvořit soubor, objeví se Save as, já napíšu název programu a dám uložit. Pak to asi 2 vteřinky trvá a objeví se chyba Runtime3. Takže bych řekl asi těsně před rewrite(f).

 
Nahoru Odpovědět 15. února 16:38
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na pavel
Martin Dráb:

Ano, předpokládám, že chybu vyvolá volání Rewrite, což znamená otevření souboru. Proto chci vědět, jaký název souboru je přesně specifikován, což se děje ve volání

AssignFile(f, SaveDialog1.FileName);

Proto mě zajímá hodnota SaveDialog1.Fi­leName těsně před voláním Rewrite.

Editováno 15. února 18:26
Nahoru Odpovědět 15. února 18:26
2 + 2 = 5 for extremely large values of 2
Avatar
pavel
Člen
Avatar
pavel:

Tak jsem na to asi kápl. Zjistil jsem, že když ta cesta (názvy jednotlivých složek) jsou s diakritikou tak mi to hodí chybu RunError3. Takže to asi funguje

 
Nahoru Odpovědět 16. února 17:21
Avatar
Odpovídá na pavel
Michal Haňáček:

Mno, myslím že na to kápl spíše Martin Dráb a zasloužil by za to označit řešení. Každopádně je mi divné, že by diakritika způsobila takové problémy. Na čem a v čem to píšeš (OS a IDE)?

Nahoru Odpovědět 16. února 17:49
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na pavel
Martin Dráb:

Na starších Delphi (myslím, že pod 2010, ale už si to nepamatuju) knihovna VCL, která implementuje i TSaveDialog, nepodporuje Unicode, ale pouze ANSI kódování. A vzhledem k tomu, že OS je interně Unicode, dochází ke konverzi ANSI řetězců, ale pokud obsahují znaky s ASCII hodnotou vyšší než 127, nemusí ta konverze dopadnout tak, jak by si člověk přál.

Částečným řešením je používat explicitně řetězce WideString, ale neřeší to problém knihovny VCL.

Novější verze Delphi už přímo pod datovým typem string myslí Unicode řetězec.

Nahoru Odpovědět 16. února 17:55
2 + 2 = 5 for extremely large values of 2
Avatar
pavel
Člen
Avatar
pavel:

Používám Windows 7 Home Premium, Lazarus -

Ale bohužel mám další problém. Hlásí mě to pro změnu chybu RunTime Error 103, což by měla být chyba, která se objeví pokud soubor není otevřen. Chybu jsem hledal, ale nemůžu najít. Tady už doopravdy nevím, co mám s tím udělat. Zkontroloval jsem si to s kamarádem a zdá se že kód je stejnej, ale mě to hlásí tuto chybu. Je to u Procedury 3 a 4, kdy zavřu soubor closefile; a u 4 přejdu na reset(f);

 
Nahoru Odpovědět 17. února 17:17
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na pavel
Martin Dráb:

Nejsem si jistý, ale možná bys měl po zavření souboru přes CloseFile volat znovu AssignFile předtím, než se pokusíš o otevření (Reset, Rewrite, Append).

Taky to nemáš zrovna dobře navržené. Tvoje procedury mají šanci fungovat jen v přtípadě, že jsou volány v jistém (jistých) pořadích. Například pokud zavolám jako první proceduru č. 2, tak mi to zřejmě spadne, protože soubor nebyl otevřen, ale už se do něj pokoušíš zapisovat.

Doporučuju přepsat tak, že v rámci každé procedury soubor(y) otevřeš, provedeš s ním/nimi dané operace a zavřeš je. Tzn. žádná z procedur nebude očekávat, že nějaký soubor je otevřený a nebude žádný soubor otevírat a nechávat při svém ukončení nezavřený. Jména souborů si přenášej v rámci privátních či veřejných atributů třídy formuláře. Proměnné reprezentující soubory ti pak budou stačit deklarované lokálně v procedurách.

Nahoru Odpovědět 18. února 0:07
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.