Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
pavel
Člen
Avatar
pavel:14.2.2016 16:38

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.2.2016 16:38
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na pavel
Martin Dráb:14.2.2016 18:24

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.2.2016 18:24
2 + 2 = 5 for extremely large values of 2
Avatar
pavel
Člen
Avatar
Odpovídá na Martin Dráb
pavel:15.2.2016 16:38

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.2.2016 16:38
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na pavel
Martin Dráb:15.2.2016 18:26

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.2.2016 18:26
Nahoru Odpovědět
15.2.2016 18:26
2 + 2 = 5 for extremely large values of 2
Avatar
pavel
Člen
Avatar
pavel:16.2.2016 17:21

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.2.2016 17:21
Avatar
Odpovídá na pavel
Michal Haňáček:16.2.2016 17:49

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.2.2016 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
Tvůrce
Avatar
Odpovídá na pavel
Martin Dráb:16.2.2016 17:55

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.2.2016 17:55
2 + 2 = 5 for extremely large values of 2
Avatar
pavel
Člen
Avatar
pavel:17.2.2016 17:17

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.2.2016 17:17
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na pavel
Martin Dráb:18.2.2016 0:07

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.2.2016 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.