Форум: "Начинающим";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];
Внизпроблема с сохранением в файл Найти похожие ветки
← →
fen (2009-12-26 12:09) [0]всем привет, подскажите:
мне нужно сохранить в файл и чтобы если такой файл есть, то он в него дописывал, но если я пишу
fname:="save\"+save+".txt";
AssignFile(fil,fname);
Append(fil);
Writeln(fil,"Результаты игрока "+save);
Writeln(fil,"Дата и время сохранения : "+FrmTetr.Label10.Caption);
Writeln(fil,"Число очков: "+FrmTetr.lBall.Caption);
Writeln(fil,"");
CloseFile(fil);
то если файл не создан, то пишет ошибку, а если пишуRewrite(fil)
то не дописывает в него
← →
12 © (2009-12-26 12:17) [1]if not fileexist( f1 ,точно не помню)
тогда пересоздать
иначе писать в конец
← →
FileExists (2009-12-26 12:20) [2]Assign(...);
if FileExists(...) then
Append
else
ReWrite(...);
← →
valussev@mail.ru (2009-12-26 12:24) [3]
if not fileexists(fname) then
rewrite(fil)
else Append(fil);
вот так работате, спасибо
← →
fen (2009-12-26 13:06) [4]вот еще такой вопрос:
у меня при нажатии на SpeedButton2 открывается файл AssigneFile, а его закрытие происходит при выходе из программы и туда пишется информация, но если я на эту кнопку не нажимаю, то выскакивает ошибка, о том что я пытаюсь писать в файл, который не открыт, пытался вот так написать, но не правильно, подскажите, как это обойти
if SpeedButton2.Click then
begin
Writeln(fil,"Число очков: "+FrmTetr.lBall.Caption);
Writeln(fil,"");
CloseFile(fil);
end
else
...
end;
← →
Anatoly Podgoretsky © (2009-12-26 13:17) [5]> fen (26.12.2009 13:06:04) [4]
при нажатии на SpeedButton2 никакой файл не открывается
← →
fen (2009-12-26 13:20) [6]как же? происходит открытие файла для записи в него..
← →
Anatoly Podgoretsky © (2009-12-26 13:39) [7]> fen (26.12.2009 13:20:06) [6]
Тебе это только кажется.
← →
fen (2009-12-26 13:49) [8]ответь мне по существу лучше, вопрос [4]
← →
Anatoly Podgoretsky © (2009-12-26 13:55) [9]> fen (26.12.2009 13:49:08) [8]
Для по существу недостаточно информации, ее почти совсем нет.
← →
fen (2009-12-26 14:11) [10]
procedure TFrmTetr.SpeedButton2Click(Sender: TObject);
begin
save:=InputBox("Новая игра","Введите свое имя","Anonimous");
fname:="save\"+save+".txt";
AssignFile(fil,fname);
if not fileexists(fname) then
rewrite(fil)
else Append(fil);
Writeln(fil,"Результаты игрока "+save);
Writeln(fil,"Дата и время сохранения : "+FrmTetr.Label10.Caption);
end;
procedure TFrmTetr.FormClose(Sender: TObject; var Action: TCloseAction);
var i:integer;
f:file of BestRec;
begin
Writeln(fil,"Число очков: "+FrmTetr.lBall.Caption);
Writeln(fil,"");
CloseFile(fil);
end;
вот 2 процедуры, если я не нажав на SpeedButton2 выхожу из программы, выскакивает ошибка, вопрос: как ее избежать
← →
Anatoly Podgoretsky © (2009-12-26 14:35) [11]Вот это другое дело, тут уже появилось открытие файла. Проблема решается элементарнейши, добавить открытие файла в процедуру Close и закрытие файла в метод SpeedButton2Click и все. Также не ясно, что делает в процедуре закрытия f:file of BestRec;
← →
Anatoly Podgoretsky © (2009-12-26 14:37) [12]Но вообще то весь код пригоден для корзины.
← →
fen (2009-12-26 14:44) [13]ну а так как я спросил в 4 можно как то сделать?
← →
fen1 (2009-12-26 15:28) [14]а по [4] пункту?
← →
Плохиш © (2009-12-26 18:07) [15]
> fen (26.12.09 14:44) [13]
>
> ну а так как я спросил в 4 можно как то сделать?
goto [11]
> fen1 (26.12.09 15:28) [14]
>
> а по [4] пункту?
goto [12]
← →
fen (2009-12-26 18:20) [16]мда, отличное решение, большое спасибо, и как же я сам до такого не додумался??....
прочитайте мое [4] сообщение, мне нужно сделать как там, не применяя [11], и вобще ничего местами не меняя
какое условие нужно использовать здесь
ifSpeedButton2.Click
then
begin
Writeln(fil,"Число очков: "+FrmTetr.lBall.Caption);
Writeln(fil,"");
CloseFile(fil);
end
else
...
end;
чтобы программа всегда работала??
← →
sniknik © (2009-12-26 18:51) [17]> мда, отличное решение, большое спасибо,
без сарказма в [11], это очень хорошее, правильное решение. совмещать открытие и закрытие файла в одном месте (процедуре). не побоюсь даже дополнить, делать это только с помощью try finally, чтобы гарантированно закрывать открытое (так же как гарантированно освобождать затребованную память, и т.д. бережно в общем к ресурсам относится)
> и как же я сам до такого не додумался??....
дурак наверное... и книжек не читал.
> и вобще ничего местами не меняя
в сказки веришь? ну тогда ничего не меняя скажи вслух "трах тибедох!" и вырви волос. ... помогло?
← →
fen (2009-12-26 19:09) [18]ок, значит нельзя никак сделать [16]? так и надо сказать
← →
sniknik © (2009-12-26 19:26) [19]почему нельзя? можно (можно вообще все! кроме того, что нельзя...), но исключения должны делаться только если хорошо усвоил основные принципы...
← →
fen (2009-12-26 19:30) [20]
> sniknik ©
напиши плиз как это можно реализовать
← →
sniknik © (2009-12-26 19:54) [21]и че ж вам нормально то не пишется? все какие то извращения, чего выгадать пытаешься?
ну открой ты файл при старте например в initialization модуля, закрой в finalization, или в онопен/онклозе, т.е. открыть безусловно и закрывать также, а все остальные художества убери.
или раз уж так хочется со своим дурацким условием то проверяй не клик (чего ты с него вообще хотел?) а файловый хендл на "открытость", т.е. if TTextRec(fil).Handle <> 0 then ...
только смотри чтобы fil не дай Гейтс не был локальной переменной (почему? а читайте детские книжки типа "веселый программист").
← →
Anatoly Podgoretsky © (2009-12-26 19:57) [22]> sniknik (26.12.2009 19:54:21) [21]
А нафиг делать глобализацию, лучше по месту с try finally end
И не надо постоянно файл держать открытым. Может пользователь захочет его в этот период почистить, удалить, переименовать. А тут такой облом.
← →
sniknik © (2009-12-26 20:09) [23]> А нафиг делать глобализацию,
потому что это лучше чем то что сейчас у него, это однозначность, открыли прогу файл блокирован. а у него он блокируется не пойми когда, и в любое время. (по опыту цто однозначность поведения, даже неприятную юзеру можно объяснить фичей)
> лучше по месту с try finally end
а кто спорит (см. [17])? но автор же хочет извращений.
← →
fen (2009-12-26 21:06) [24]
> то проверяй не клик (чего ты с него вообще хотел?) а файловый
> хендл на "открытость", т.е. if TTextRec(fil).Handle <> 0
> then
я вот это добиваюсь уже 20 сообщений
← →
fen (2009-12-26 21:12) [25]теперь спасибо, но можно было и без саарказма это сразу выдать
← →
sniknik © (2009-12-26 22:24) [26]> я вот это добиваюсь уже 20 сообщений
ты получил бы это сразу если бы в вопросе описал причину из-за которой без извращений нельзя... ну и если бы ее признали не надуманной. а так, раз это от непонимания, то пытались наставить на путь истинный. видимо неудачно.
> но можно было и без саарказма это сразу выдать
нельзя. либо так, либо никак. и до сих пор надежда, может тебя "пробьет", ну или хотя бы те кто будет читать это после "внемлют".
(если сразу после вопроса на извращение будет ответ, будет вид как будто так и надо делать... "кульных хацкеров" в инете и без того хватает чтобы к ним еще искренне заблуждающихся добавлять.)
← →
Anatoly Podgoretsky © (2009-12-26 22:45) [27]> sniknik (26.12.2009 22:24:26) [26]
Если не пробьет, то может прибьет.
← →
fen (2009-12-26 23:11) [28]
> Anatoly Podgoretsky ©
я промолчу...
← →
fen (2009-12-26 23:17) [29]
> sniknik ©
да какое тут извращение?
я не мог сделать так, как описано в [11], т.к.
при нажатии на кнопу SpeedButton2.Click у меня открывается диалог, куда записывается имя игрока (вся эта программа - игра "Тетрис"), которое и является именем файла, соответственно я не могу открыть файл до того, как нажал на кнопку, а закрытие может происходить только при закрытии формы, т.к. в файл пишется еще кол-во очков, набранных игроком, как раз поэтому я и спрашивал [4].
← →
Германн © (2009-12-26 23:47) [30]
> а закрытие может происходить только при закрытии формы,
> т.к. в файл пишется еще кол-во очков, набранных игроком
Это не может являться препятствием для решения [11].
← →
Andy BitOff © (2009-12-26 23:54) [31]> fen (26.12.09 23:17) [29]
Блин, тебе же говорят - sniknik © [17] (первая часть). Открывай его где надо, вноси свои изменения и сразу закрывай. Что непонятно-то?
← →
fen (2009-12-26 23:59) [32]
> Andy BitOff ©
прочти [29] внимательнее
> закрытие может происходить только при закрытии формы, т.
> к. в файл пишется еще кол-во очков, набранных игроком
← →
Германн © (2009-12-27 00:05) [33]
> прочти [29] внимательнее
Зачем еще раз читать бредовую "якобы" причину?
← →
sniknik © (2009-12-27 00:15) [34]> да какое тут извращение?
пока маленькое, но стоит только начать...
> при нажатии на кнопу SpeedButton2.Click у меня открывается диалог, куда записывается имя игрока ...
логика действий это не то же самое, что исполнение.
> а закрытие может происходить только при закрытии формы
с чего это? нет таких правил чтобы файл закрывался только при закрытии формы. (в отличие от правил работы с ресурсами которые есть)
p.s. вот теперь я понимаю откуда ноги растут у исполнителей длинных транзакций в базах, да еще завязанных на диалог с юзером...
с малого тренируются. т.к. сказать воспитываем кадры на простых примерах. :)))
← →
Andy BitOff © (2009-12-27 00:15) [35]> fen (26.12.09 23:59) [32]
Хорошо что пишется, я бы даже сказал - замечательно. А теперь скажи, почему нельзя открыть файл, записать в него очки и закрыть? Почему нельзя по SpeedButton2 [4] открыть файл, записать что надо и закрыть? Объясни, почему нельзя сделать так.
← →
fen (2009-12-27 00:19) [36]
> очему нельзя по SpeedButton2 [4] открыть файл, записать
> что надо и закрыть?
да потому что при нажатии на SpeedButton2.Click очки еще не набраны!
← →
fen (2009-12-27 00:22) [37]
> с чего это? нет таких правил чтобы файл закрывался только
> при закрытии формы.
а если мне нужно записать кол-во очков, набранных непосредственно перед закрытием формы?
← →
sniknik © (2009-12-27 00:28) [38]> а если мне нужно записать кол-во очков, набранных непосредственно перед закрытием формы?
неважно когда, принцип один - открываешь → записываешь → закрываешь. для гарантии используешь блок try finally. все. все логично, никакой путаницы, все файловые хендлы для системы доступны (поработал бы в DOS где их было 8 всего вроде по умолчанию, быстрее дошло бы.)
← →
Sha © (2009-12-27 00:34) [39]Выбери один из двух вариантов и не мучайся:
1. Файл объявлен локально в методе формы.
Когда надо записать в файл, открываешь его, пишешь и закрываешь.
2. Файл объявлен в protected секции формы.
Открываешь файл в FormCreate, пишешь в методах формы, закрываешь в FormDestroy.
← →
fen (2009-12-27 00:41) [40]всем спасибо, за мучения со мной )
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.004 c