Большой Воронежский Форум
» Программирование>Проблема с TStrings (Дельфи)
SuHar` 11:13 20.12.2006
Возникла проблема с переменной класса TStrings. Написал процедуру, которая будет заполнять строки переменной этого типа:
var
i: integer;
s: TStrings;
begin
i:=0;
s:=TStringList.Create;
s[i]:='текст';
s[i+1]:='текст';
s[i+2]:='текст';
s[i+3]:='текст';
s.SaveToFile('имя файла');
end;

При обращении к данной процедуре программа выдает ошибку следующего содержания:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EStringListError with message 'List index out of bounds (0)'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Я еще в пограммировании совсем "зеленый", так что прошу не ст*****ся, а помочь - программу нужно напистаь срочно, а у меня вот такая программа. Заранее благодарен. [Ответ]
ExeLab 11:19 20.12.2006
А какая цель должна быть у программы? Може это можно решить другим способом?! [Ответ]
SuHar` 11:22 20.12.2006
ExeLab, да генератор тестов я пишу. Эта процедура в общем для создания теста, вопросы в файл добавляет. Если можно по другому - то подскажите или помогите все-таки решить проблему с TStrings. [Ответ]
ExeLab 11:27 20.12.2006
Хочешь, попробуй не со стрингами работать, а с мемо. Memo1.lines.add('текст'). Тут проблем не будет! Могу более конкретно код дать! Хотя тут все элементарно! [Ответ]
SuHar` 11:34 20.12.2006

Сообщение от ExeLab:
Хочешь, попробуй не со стрингами работать, а с мемо. Memo1.lines.add('текст'). Тут проблем не будет! Могу более конкретно код дать! Хотя тут все элементарно!

Хорошая идея... Один вопрос - как сохранять строку Memo1.lines.add('текст') в строку текстового файла? [Ответ]
delphist 11:35 20.12.2006
Нельзя использовать такую конструкцию:
s[i+1]:='текст';
так как память невыделенна.
Попробуй использовать:
s.Add('текст');
s.Add('текст');
s.SaveToFile('имя файла'); [Ответ]
SuHar` 11:38 20.12.2006

Сообщение от delphist:
Нельзя использовать такую конструкцию:
s[i+1]:='текст';
так как память невыделенна.
Попробуй использовать:
s.Add('текст');
s.Add('текст');
s.SaveToFile('имя файла');

Процедура s.Add будет совершать переход на следующую строку? Т.е.:
s.Add('Раз');
s.Add('Два');
Будет ли результатом этого следующее: s[0]=Раз, s[1]=Два? Если да - то это как раз то, что мне нужно [Ответ]
SuHar` 11:41 20.12.2006
delphist, спасибо, проверил - как раз то, что я искал!
Всем спасибо!!! [Ответ]
SuHar` 11:45 20.12.2006
Что-то я совсем туплю... Как определить - сколько строк уже создано в переменной TStrings? [Ответ]
delphist 11:58 20.12.2006
Помоему есть свойство
s.count;
если его применить
var
o: integer;
begin
o:=s.count;
end;
в переменной o будет записанно число строк которое уже созданно. Но это свойство только для чтения, тоесть нельзя указать сколько строк должно быть, например s.count:=20; вызовет ошибку. [Ответ]
SuHar` 12:06 20.12.2006
delphist, ага - мне как раз и нужно только ПРОЧИТАТЬ, сколько строк уже есть. Спс [Ответ]
SuHar` 12:17 20.12.2006
Сегодня видать не мой день Пытаюсь сохранить данные в файл: s.SaveToFile('имя файла'); - выдает сцука, что файл занят другим процессом. Не могу понять в чем дело
(файл создавал с помощью FileCreate) [Ответ]
gloomdemon 13:24 20.12.2006
Сухарь, после создания через FileCreate, FileClose вызывал?
Да, если неошибаюсь, SaveToFile создаёт файл если его нет. [Ответ]
SuHar` 14:23 20.12.2006
gloomdemon, в том то и дело, что не вызывал! Уже нашел ошибку - FileCreate убрал вообще, SaveToFile создает сам файл, если его не существует. [Ответ]
KODer 14:50 20.12.2006
Сухарь, может ты просматриваешь файл какой нибудь сторонней программой?
Напиши сюда полностью вызов FileCreate() с параметрами. [Ответ]
SuHar` 14:59 20.12.2006
Да все работает уже! Спс всем. модеры - тему можете прибить [Ответ]
Kikoz 12:08 21.12.2006
Ребята, я конечно понимаю, что вы новички и все такое... И желаю вам стать побыстрее крутыми.. Но почему вы не читаете хелпов, книг... Они и правда рулез...
Хера толку, что строку
s[i]:='текст';
заменили на
s.Add('текст');
надо ж понять, что произшло, и почему в первом случае все стухалось. [Ответ]
ХАРЧО 13:27 21.12.2006
Kikoz, +1 и респект. [Ответ]
Бух 13:37 21.12.2006

Сообщение от Kikoz:
надо ж понять, что произшло, и почему в первом случае все стухалось.

Потому и стухалось, что нельзя напрямую памяти (а s[i] это указатель на часть массива памяти выделенного под s), так вот, нельзя указателю присваивать значение. Это значение надо записывать в память. Для этого и существует специальная функция, которая называется Add. В Делфи почти нет возможности работать с указателями, потому обычно программеры и напарываются на такие штуки. [Ответ]
Kikoz 14:06 21.12.2006
Бух, мне можешь не объяснять [Ответ]
K1l 19:07 19.01.2007

Сообщение от SuHar`:
Возникла проблема с переменной класса TStrings. Написал процедуру, которая будет заполнять строки переменной этого типа:
var
i: integer;
s: TStrings;
begin
i:=0;
s:=TStringList.Create;
s[i]:='текст';
s[i+1]:='текст';
s[i+2]:='текст';
s[i+3]:='текст';
s.SaveToFile('имя файла');
end;

При обращении к данной процедуре программа выдает ошибку следующего содержания:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EStringListError with message 'List index out of bounds (0)'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Я еще в пограммировании совсем "зеленый", так что прошу не ст*****ся, а помочь - программу нужно напистаь срочно, а у меня вот такая программа. Заранее благодарен.

Почему переменную он обьявил как s: TStrings;
А в неё записывал адрес s:=TStringList.Create;
Должно было быть так:
var
i: integer;
s: TStrings;
begin
i:=0;
s:=TStrings.Create;
s.add:='текст1';
s.add:='текст2';
s.add:='текст3';
s.add:='текст4';
s.SaveToFile('имя файла');
end;

s[i]:='текст'; неправильна поскольку s хранит адрес TStrings и вместо этого адреса он хотел написать 'текст', поэтому и выскакивала ошибка. [Ответ]
Kikoz 19:21 19.01.2007
чего-то я пассажа про TStringList.Create не понял...
Кстати, TStringList еще и зачищать надо [Ответ]
AIM-9M 11:43 20.01.2007

Сообщение от K1l:
Почему переменную он обьявил как s: TStrings;
А в неё записывал адрес s:=TStringList.Create;
Должно было быть так:
var
i: integer;
s: TStrings;
begin
i:=0;
s:=TStrings.Create;
s.add:='текст1';
s.add:='текст2';
s.add:='текст3';
s.add:='текст4';
s.SaveToFile('имя файла');
end;
s[i]:='текст'; неправильна поскольку s хранит адрес TStrings и вместо этого адреса он хотел написать 'текст', поэтому и выскакивала ошибка.

Молодой человек, изучайте матчасть, прежде чем писать ересь по форумам:

Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated. [Ответ]
Вверх