Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2011, 14:12   #1
Новичок!
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 35
Печаль Не работает сохранение из Memo

Есть код
Код:
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
memo1.lines.SaveToFile(inttostr(a)+'t.zmt');
memo2.Lines[0]:=inttostr(form2.left);
memo2.Lines[1]:=inttostr(form2.Top);
memo2.Lines[2]:=inttostr(form2.tag);
memo2.Lines.SaveToFile(inttostr(a)+'.zmt');
inc(a);
end;
Первый файл сохраняется нормально, сколько бы не было строк. А во второй файл сохраняются только первые две строки, третья не сохраняется. Почему?
Новичок! вне форума Ответить с цитированием
Старый 19.10.2011, 14:50   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Через Add() пробовали добавлять строки в memo2?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 19.10.2011, 14:51   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Кто? Нет, Вы скажите, КТО Вас учил обращаться к элементам динамического массива без проверки того, что там есть элементы, индексы которых Вы указываете.

Уж, хотя бы так поступите (хотя это тоже быдлокод, но хоть работать будет)!
Код:
memo1.lines.SaveToFile(inttostr(a)+'t.zmt');
while memo2.Lines.Count<3 do memo2.Lines.Append('пустая строка');
memo2.Lines[0]:=inttostr(form2.left);
memo2.Lines[1]:=inttostr(form2.Top);
memo2.Lines[2]:=inttostr(form2.tag);
memo2.Lines.SaveToFile(inttostr(a)+'.zmt');
inc(a);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.10.2011, 15:02   #4
Новичок!
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Кто? Нет, Вы скажите, КТО Вас учил обращаться к элементам динамического массива без проверки того, что там есть элементы, индексы которых Вы указываете.
В смысле? Я ведь как раз в строки и вносил данные. Зачем проверять то что в них что-то есть если это в них точно есть?
Новичок! вне форума Ответить с цитированием
Старый 19.10.2011, 15:03   #5
Новичок!
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 35
По умолчанию

Vanta11a, спасибо. Так вроде работает
Новичок! вне форума Ответить с цитированием
Старый 19.10.2011, 15:51   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
В смысле? Я ведь как раз в строки и вносил данные. Зачем проверять то что в них что-то есть если это в них точно есть?
мда.. налицо явное недопонимание...

попытаюсь вкратце, "на пальцах", объяснить, в чём Вы заблуждаетесь.. Хотя, конечно, лучше бы Вам книжки по основам Delphi проштудировать..

смотрите. есть объект Memo2.Lines (тип это TStrings: TStrings is an abstract base class for objects that represent a list of strings. - т.е. это класс, представляющий СПИСОК строк).
Этот список может НЕ СОДЕРЖАТЬ ни одной строки. Может содержать одну строчку, может - две и т.д...
Если список НЕ СОДЕРЖИТ ни одной строчки, то обращение к несуществующей строке не даст никакого результата! (почему оно не вызовет ошибку - это можно посмотреть в исходниках. Имхо, это было бы логичнее. Но авторы, написавшие работу с TStrings (TStringList) посчитали, что так программисту будет проще и легче.
Поэтому, когда у Вас нет в списке ни одной строки, а Вы пишете Lines[0] := xxxxx
то никакой ошибки не будет. НО И СТРОКА в список НЕ ДОБАВИТСЯ!
Для добавления строки в список существуют методы
.Lines.Add(<строчка>) и
.Lines.Append(<строчка>)

(чем эти методы отличаются и какие ещё есть методы Вы легко можете посмотреть в штатном хелп файле к Delphi).


Цитата:
Vanta11a, спасибо. Так вроде работает
а что, мой вариант из #3 не сработал?..

Очень подозреваю, что Ваш код должен бы выглядеть так:
Код:
  memo1.lines.SaveToFile(inttostr(a)+'t.zmt');
  memo2.Lines.Clear; {очистили содержимое списка строк}
  memo2.Lines.Append(inttostr(form2.left));
  memo2.Lines.Append(inttostr(form2.Top));
  memo2.Lines.Append(inttostr(form2.tag));
  memo2.Lines.SaveToFile(inttostr(a)+'.zmt');
...
ну и последнее. если Вы используете memo2 исключительно для того, чтобы сохранить строчки в файл, то это Вы ЗРЯ. Гораздо удобнее, проще, эффективнее, быстрее и надёжнее использовать для этого простой TStringList (его можно создавать/удалять прямо в процедуре на кнопке (предпочтительнее), а можно и создать один раз при создании формы и удалить при уничтожении формы...

выглядеть это будет так:
Код:
procedure TForm2.BitBtn1Click(Sender: TObject);
var TS : TStringList;
begin
  memo1.lines.SaveToFile(inttostr(a)+'t.zmt');
  TS := TStringList.Create;
  try
    TS.Append(inttostr(form2.left));
    TS.Append(inttostr(form2.Top));
    TS.Append(inttostr(form2.tag));
    TS.SaveToFile(inttostr(a)+'.zmt');
  finally
    TS.Free;
  end;
  inc(a);
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.10.2011, 11:29   #7
Новичок!
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 35
Хорошо

Цитата:
мда.. налицо явное недопонимание...

попытаюсь вкратце, "на пальцах", объяснить, в чём Вы заблуждаетесь.. Хотя, конечно, лучше бы Вам книжки по основам Delphi проштудировать..

смотрите. есть объект Memo2.Lines (тип это TStrings: TStrings is an abstract base class for objects that represent a list of strings. - т.е. это класс, представляющий СПИСОК строк).
Этот список может НЕ СОДЕРЖАТЬ ни одной строки. Может содержать одну строчку, может - две и т.д...
Да да да. Я уже понял что ляпнул хрень
Этот код мне понравился
Код:
procedure TForm2.BitBtn1Click(Sender: TObject);
var TS : TStringList;
begin
label1.caption:=memo1.text;
memo1.visible:=false;
bitbtn1.Visible:=false;
  memo1.lines.SaveToFile(inttostr(unit1.a)+'t.zmt');
  TS := TStringList.Create;
  try    
    TS.Append(inttostr(form2.left));
    TS.Append(inttostr(form2.Top));
    TS.Append(inttostr(form2.tag));
    TS.SaveToFile(inttostr(unit1.a)+'.zmt');
    label1.Caption:=ts.text;
  finally
    TS.Free;
  end;
end;
всё супер работает

Последний раз редактировалось Новичок!; 20.10.2011 в 11:47.
Новичок! вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильно работает свойство Memo.CaretPos Armorer Общие вопросы Delphi 9 24.05.2011 18:26
Сохранение текста типа Memo без создания отдельных файлов Haladdin БД в Delphi 23 30.12.2010 13:14
Сохранение данных с Memo chepic Помощь студентам 4 22.02.2010 18:08
проверка изменений в Memo и сохранение Костян Пират Общие вопросы Delphi 5 20.03.2009 22:27