Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 634

/ вопрос открыт /

Здравствуйте!
проблема такая:
поставил себе задачу, что бы по нажатию на кнопку текст из Edit сохранялся в одну из строк в TXT файл, а затем отображался в Label.
Получился маразм. Помогите написать или исправить код.

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. lines : TStringList;
  4. num : integer;
  5. sl:TStringList;
  6. begin
  7. num := 3;
  8. lines := TStringList.Create;
  9. lines.LoadFromFile('my_file.txt');
  10. if lines.Count >= num then
  11.  
  12. lines.Destroy;
  13. sl := TStringList.create;
  14. try
  15.  
  16. if sl.count < 2 then begin
  17.  
  18. exit;
  19. end else if sl.count = 2 then
  20. sl.add(edit1.text)
  21. else
  22. sl[3] := Edit1.text;
  23.  
  24. finally
  25. sl.free;
  26. end;


Paroonalitik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Paroonalitik (статус: Посетитель)
Вопрос отправлен: 13 сентября 2011, 15:07
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Казаков Николай Константинович

Здравствуйте, Paroonalitik!

На первый взгляд, слишком запутанная конструкция if .. then .. else.
Присвоение s1[3]:=Edit1.text не совсем корректное, заносит данные в переменную типа TStringList нужно методом Add, еще помните, что нумерация начинается с 0, поэтому sl[3] пытается считать фактически уже 4 строку, существование которой у вас не проверено.

Ответ отправил: Казаков Николай Константинович (статус: 1-ый класс)
Время отправки: 14 сентября 2011, 09:11

Ответ #2. Отвечает эксперт: min@y™

Как тебе такая функция?

// функция, сохраняющая строку S в позицию Index (Index >= 0) текстового файла.
function StrToTextFile(const FileName, S: string; const Index: Integer): Boolean;
var
  Lines: TStrings;
begin
  Result:= False;
  Lines:= TStringList.Create();
  try
    try
      if FileExists(FileName)
        then Lines.LoadFromFile(FileName);
 
      // добавление пустых строк до нужной позиции
      while Lines.Count < Index - 2 do // вместо этого можно выдать сообщение
        Lines.Add('');                 // "в файле мало строк"
 
      Lines.Add(S);
      Lines.SaveToFile(FileName);
      Result:= True;
    except
      Result:= False;
    end;
  finally
    Lines.Free();
  end;
end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 20 сентября 2011, 14:13


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 16 сентября 2011, 08:25; участников в обсуждении: 4.

13 сентября 2011, 18:55: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.

bugmenot

bugmenot (статус: 3-ий класс), 14 сентября 2011, 03:12 [#1]:

Похоже на скопипащенные вместе два сниппета.

Цитата (bugmenot):

раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.
Lolwut, причем тут файловая система?
виконання програми розпочинається з того самого мiсця, де призупинилося.

Paroonalitik

Paroonalitik (статус: Посетитель), 14 сентября 2011, 05:46 [#2]:

да, так и есть. и все таки, как реализовать-то?
Казаков Николай Константинович

Казаков Николай Константинович (статус: 1-ый класс), 14 сентября 2011, 09:17 [#3]:

Извините за первый пост, написанный абракадаброй, но это не моя вина, пытался отправить сообщение из почтовика )) что есть сказать по делу ))
1) запутанная конструкция if .. then .. else, лучше просто использовать if .. then в вашем случае по крайней мере, читабельнее будет
2) исполнение кода sl[3] скорее вызовет ошибку, поскольку происходит попытка считать! (не записать в нее) 4! (нумерация начинается с 0) строку.
3) добавление строк в переменную типа TStringList происходит методом Add
Paroonalitik

Paroonalitik (статус: Посетитель), 14 сентября 2011, 14:58 [#4]:

хочу отметить, что если разделить этот код на 2 части (запись из else и отображение в label), то они будут работать
bugmenot

bugmenot (статус: 3-ий класс), 14 сентября 2011, 20:45 [#5]:

with TStringList.Create() do
begin
  LoadFromFile('myfile');  
  { проверку сделать самостоятельно }
  Strings[42-1] := MyEdit.Text;
  MyLabel.Caption := MyEdit.Text;
  SaveToFile('myfile');
  Free();
end;
и прочесть книжку для начинающих
виконання програми розпочинається з того самого мiсця, де призупинилося.

Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 14 сентября 2011, 22:09 [#6]:

Цитата (bugmenot):

Lolwut, причем тут файловая система?

Тут или ФС или компоненты и библиотеки, но ни в одну полностью не подходит. Могу в другую переместить, но погоды не сделает.
bugmenot

bugmenot (статус: 3-ий класс), 15 сентября 2011, 02:26 [#7]:

Сразу скажу, чтобы соблюсти нейтральность - я категориями не пользуюсь и мне всё равно какая из них присвоена. Но:

Цитата (Ерёмин А.А.):

Тут или ФС

ума не приложу, где тут Вам видится ФС. Задача состоит в замене N-ой строки в текстовом файле. Что можно сделать:
* классической дельфёвой RTL (см. выше)
* хелперами TurboVision из которых выросла дельфёвая RTL
* стандартным текстовым I/O стандартного им. Иенсен ISO7185 Паскаля
* потоками с эмуляцией текстового I/O напр. TTextReader

Здесь всего один исходный файл, он же выходной, в сложном варианте придется создавать и удалять временный. Маловато для ФС, Вам не кажется?
виконання програми розпочинається з того самого мiсця, де призупинилося.

Paroonalitik

Paroonalitik (статус: Посетитель), 15 сентября 2011, 12:46 [#8]:

to bugmenot
посоветуйте пожалуйста книжку для начинающих.
bugmenot

bugmenot (статус: 3-ий класс), 15 сентября 2011, 18:21 [#9]:

Цитата (Paroonalitik):

посоветуйте пожалуйста книжку для начинающих.
Я всем советую Фаронова, потому что он профессиональный препод и издал уже много книг по Паскалю. Но наверное сами понимаете, что у меня не возникает уже необходимости читать вводный материал. И того, что листал в последнее время - Фленова ни в коем случае не читать. Архангельский возможно будет полезен позднее в качестве справочника, хотя лучше поставить себе словарь или переводчик и понемногу начинать справочник читать в оригинале. А вообще тема для отдельного вопроса, пусть рецензий накидают.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Казаков Николай Константинович

Казаков Николай Константинович (статус: 1-ый класс), 16 сентября 2011, 08:25 [#10]:

я за Фаронова, написано все четко, ясно и понятно

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 30 мая 2023, 14:24
Выполнено за 0.02 сек.
Рейтинг@Mail.ru