Diskuze: Soubory - neplatná cesta

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Jakou hodnotu v době vyvolání výjimky (či těsně před provedením rewrite(f);) má SaveDialog1.FileName?
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).
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.FileName těsně před voláním Rewrite.
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)?
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.
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);
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.
Zobrazeno 9 zpráv z 9.