Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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], и вобще ничего местами не меняя

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

всем спасибо, за мучения со мной )


 
Anatoly Podgoretsky ©   (2009-12-27 01:06) [41]

> fen  (27.12.2009 00:19:36)  [36]

Ну так сделай когда уже набраны.


 
Германн ©   (2009-12-27 01:12) [42]


> Ну так сделай когда уже набраны.
>

В OnClose или в OnCloseQuery.
Тоже хороший вариант, кстати.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.005 c
2-1261721535
Б
2009-12-25 09:12
2010.02.28
Получить mouse-wheel.


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


2-1261660605
DL
2009-12-24 16:16
2010.02.28
inline


2-1261744269
vegarulez
2009-12-25 15:31
2010.02.28
вопрос про XML


2-1261851917
Наталья
2009-12-26 21:25
2010.02.28
протокол UDP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский