Возникла проблема с переменной класса 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('текст');
надо ж понять, что произшло, и почему в первом случае все стухалось.
[Ответ]
Сообщение от Kikoz:
надо ж понять, что произшло, и почему в первом случае все стухалось.
Потому и стухалось, что нельзя напрямую памяти (а s[i] это указатель на часть массива памяти выделенного под s), так вот, нельзя указателю присваивать значение. Это значение надо записывать в память. Для этого и существует специальная функция, которая называется Add. В Делфи почти нет возможности работать с указателями, потому обычно программеры и напарываются на такие штуки.
[Ответ]
Сообщение от 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.
[Ответ]