Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.28;
Скачать: CL | DM;

Вниз

проблема с сохранением в файл   Найти похожие ветки 

 
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], и вобще ничего местами не меняя

какое условие нужно использовать здесь
if SpeedButton2.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]

> а если мне нужно записать кол-во очков, набранных непосредственно перед закрытием формы?
неважно когда, принцип один - открываешь &#8594; записываешь &#8594; закрываешь. для гарантии используешь блок 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.014 c
4-1229417136
Riply
2008-12-16 11:45
2010.02.28
Настоящее закрытие файла :)


6-1213366187
JanMihail
2008-06-13 18:09
2010.02.28
Новое письмо на Email ???


2-1261763355
Pup
2009-12-25 20:49
2010.02.28
простейшие фигуры с помощью TShape


2-1261640332
pest
2009-12-24 10:38
2010.02.28
Создание своего компонента-контейнера


2-1261799017
Igor2010
2009-12-26 06:43
2010.02.28
кодировка