Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];
Внизtstrings Найти похожие ветки
← →
Sergioni (2006-09-20 01:05) [0]Привет Мастерам!
мне нужно временное хранилище строк, думаю использовать tstrings
при попытке использования вылетает ошибка abstract error
как же правильно использовать?
я делаю так:
объявляю в public
str:tstrings;
в formcreate
str:=tstrings.create;
и дальше добавляю str.add("string");
← →
Шпиён (2006-09-20 01:11) [1]используй наследника - TStringList
TStrings contains abstract methods and should not be directly instantiated.
← →
Sergioni (2006-09-20 01:12) [2]использовал, то же самое..
← →
SPACE!! (2006-09-20 01:16) [3]var
str : TstringList;
begin
str : TstringList.Create;
end;
Причем можно увидеть такое
var
str : Tstrings;
begin
str : TstringList.Create;
end;
так-как TstringList является потомком от Tstrings ошибки не возникнет.
← →
cp.Silver © (2006-09-20 01:18) [4]TStrings - это абстрактный класс и, следовательно, создать объект абстрактного класса нельзя.
Делай так:
...
var
str: TStrings;
...
str:= <bold>TStringList</bold>.Create;
str.add("string");
...
После окончания работы не забудь вызватьstr.free;
← →
SPACE!! (2006-09-20 01:19) [5]
> использовал, то же самое..
Этого неможет быть ...
← →
Sergioni (2006-09-20 01:34) [6]СПАСИБКИ!
попробовал еще раз - получилось!
но вот следующий баг:
загружаю в него строки из файла (получается 917)
потом в цикле обрабатываю строки
for i:=1 to str.count do
begin
....
str.strings[i-1]...
....
end;
как только доходит до 916 возникает ошибка...
в чем дело - не пойму.. :(
← →
cp.Silver © (2006-09-20 01:38) [7]Памяти не хватает (скорее всего). У меня тоже такая история была. Проверь сколько exe занимает места в памяти до и после загрузки данных в str
← →
Sergioni (2006-09-20 01:41) [8]почти не меняется..
← →
alex-drob © (2006-09-20 01:42) [9]for i:=0 to str.count-1 do
← →
Sergioni (2006-09-20 01:58) [10]
> alex-drob
нерациональный алгоритм, объясняю:
если str.count = 0 - то цикл выполнится 1 раз и при обращении к str.strings[i] будет ошибка
а если начинать с i=1 то при str.count равном 0 цикл будет завершен сразу...
← →
MBo © (2006-09-20 06:23) [11]>нерациональный алгоритм, объясняю:
>если str.count = 0 - то цикл выполнится 1 раз
Это ты сам придумал? А неправильно.
← →
Думкин © (2006-09-20 06:52) [12]> Sergioni (20.09.06 01:34) [6]
Your Error is Top secret?
← →
Zeqfreed © (2006-09-20 07:26) [13]> [10] Sergioni (20.09.06 01:58)
«Я плакал».
Правильный цикл выглядит так:if (List.Count > 0) then
for i := 0 to List.Count - 1 do begin
end;
← →
MBo © (2006-09-20 07:29) [14]>Zeqfreed
А для чего if ?
← →
Zeqfreed © (2006-09-20 07:33) [15]> [14] MBo © (20.09.06 07:29)
Блин, всегда писал :) Сегодня благодаря доброму человеку с ником MBo прочитал справку:If initialValue is greater than finalValue in a for...to statement, or less than finalValue in a for...downto statement, then statement is never executed.
Спасибо :)
← →
Loginov Dmitry © (2006-09-20 07:53) [16]MBo © (20.09.06 7:29) [14]
А для чего if ?
Тоже года четыре назад так писал, пока не объяснили, что беззнаковые переменные нехорошо использовать в качестве счетчика цикла.
← →
MBo © (2006-09-20 08:02) [17]>что беззнаковые переменные нехорошо использовать в качестве счетчика цикла.
Это точно. Легко получить ошибку - пусть не трудноуловимую, но иногда обескураживающую
← →
Sergioni (2006-09-21 01:46) [18]for i:=1 to str.count do
begin
....
str.strings[i-1]...
....
end;
а что сдесь не правильно?
← →
Sergioni (2006-09-21 02:04) [19]
> MBo © (20.09.06 06:23) [11]
Что не правльно?
поясни плиз..
← →
Sergioni (2006-09-21 02:06) [20]
> Zeqfreed © (20.09.06 07:26) [13]
поясни правильность твою и неправльность мою..
хочется знать, можеет я что не так написал ..
и отчего "плакал"?
← →
Eraser © (2006-09-21 02:18) [21]> [18] Sergioni (21.09.06 01:46)
> а что сдесь не правильно?
1. Убого.
2. Избыточность кода.
> если str.count = 0 - то цикл выполнится 1 раз и при обращении
> к str.strings[i] будет ошибка
это утвержение не правильно, т.к. не соответствует действительности, т.е., по-просу говоря, чушь.
← →
SergP © (2006-09-21 02:23) [22]> [18] Sergioni (21.09.06 01:46)
> for i:=1 to str.count do
> begin
> ....
> str.strings[i-1]...
> ....
> end;
>
> а что сдесь не правильно?
Теоретически в приведенном коде все правильно. Хотя для ясности лучше смотрелось бы:
for i:=0 to str.count-1 do
begin
....
str.strings[i]...
....
end;
Но не видно остального кода...
А вдруг ты вздумал в цикле удалять какие-нить строки или еще чего с ними вытворять....?
← →
Германн © (2006-09-21 02:23) [23]
> Sergioni (21.09.06 02:06) [20]
Тогда приведи весь код! Без ... и с определением функции(процедуры, метода).
← →
MBo © (2006-09-21 05:15) [24]>Что не правльно?
Этот фрагмент в общем-то правильный, но нестандартный, и на каждом шаге лишняя работа по вычислению i-1 может делаться.
Ведь если индексы идут от 0 до Count-1, то и цикл логично по этому диапазону делать, да и читающий код его мгновенно воспримет.
← →
Думкин © (2006-09-21 06:32) [25]Описание возникающей ошибки таки секретно.
Палач! Щипцы!
← →
Sergioni (2006-09-21 09:13) [26]ошибка больше не появлялась, хотя код не изменялся...
но файл другой..
← →
Sergioni (2006-09-21 09:49) [27]спасибо всем: вы меня убедили использовать i:=0 ....(для данного обсуждения) :)
> Думкин © (21.09.06 06:32) [25]
вот код, ошибка возникает если в конце файла несколько переводов строки (нажали ентер несколько раз), если их нет- то все нормально..
ошибка (аксес виолейшн)
как только доходит до такой строки, то даже проверки не возникает внутрь цикла не заходит - сразу выбрасывает ошибку...
Streetlist:TStringList;
procedure tform1.loadstreets;
var s:string;
begin
assignfile(streetfile,"c:\streets.txt");
Reset(streetfile);
Streetlist.Clear;
while not eof(streetfile) do
begin
Readln(streetfile,s);
Streetlist.Add(AnsiUpperCase(s));
end;
CloseFile(streetfile);
end;
function tform1.Search_microdistrict(Arow:Integer; var streets:integer) : string;
var
i,streetsfound:integer;
microdistrictstr,cellstr,tempmicrodistrict:string;
begin
microdistrictstr:="";
cellstr:=AnsiUpperCase(StringGrid1.Cells[1,Arow]);
streetsfound:=0;
for i:=0 to Streetlist.Count-1 do
begin
if Streetlist.Strings[i][1] = "*" then
tempmicrodistrict:=Streetlist.Strings[i]
else
begin
if pos(Streetlist.Strings[i],cellstr) > 0 then
begin
Inc(streetsfound);
if pos(tempmicrodistrict,microdistrictstr) = 0 then
microdistrictstr:=microdistrictstr+tempmicrodistrict+" ";
end;
end;
end;
streets:=streetsfound;
Result:=microdistrictstr;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
y,streetsN:integer;
begin
loadstreets;
for y:=1 to AdvStringGrid1.rowcount do
begin
AdvStringGrid1.Cells[3,y]:=Search_microdistrict(y,streetsN);
AdvStringGrid1.ints[4,y]:=streetsN;
end;
end;
← →
MBo © (2006-09-21 10:01) [28]>procedure tform1.loadstreets;
Раз используешь TStringList - прочитай справку по нему, есть метод LoadFromFile
> if Streetlist.Strings[i][1] = "*"
И что будет при пустой строке?
Используй Pos, или просто проверяй строки на пустоту и не обрабатывай
> if Streetlist.Strings[i][1] = "*" then
tempmicrodistrict:=Streetlist.Strings[i]
tempmicrodistrict бессмысленно присваивать - оно не используется
← →
Sergioni (2006-09-21 10:52) [29]>>tempmicrodistrict бессмысленно присваивать - оно не используется
if pos(tempmicrodistrict,microdistrictstr) = 0 then
microdistrictstr:=microdistrictstr+tempmicrodistrict+" ";
а это что?
← →
Sergioni (2006-09-21 11:00) [30]можно конечно запоминать номер нужной строки в streetlist вместо tempmicrodistrict...
← →
ЮЮ © (2006-09-21 11:08) [31]if Streetlist.Strings[i][1] = "*" then
у пустой строки, что и имет в случае, если в конце файла несколько переводов строки нет 1-го символа. Пустый строки вообще незачем разбиратьfor i:=0 to Streetlist.Count-1 do begin
if Trim(Streetlist.Strings[i]) = "" then Continue;
← →
MBo © (2006-09-21 11:21) [32]>а это что?
это в другой, взаимоисключающей ветке If-a
← →
Sergioni (2006-09-21 12:12) [33]>>это в другой, взаимоисключающей ветке If-a
и что с того?
>>tempmicrodistrict бессмысленно присваивать - оно не используется
не пойму, как это оно не используется??
разве что в некоторые моменты...
если эту переменную убрать, то, что, ничего не изменится что-ли?
есть предложения?
← →
Sergioni (2006-09-21 12:14) [34]с пустыми строками я разберусь, это не проблема..
(по идее их не должно быть)
← →
Думкин © (2006-09-21 12:26) [35]
> не пойму, как это оно не используется??
> разве что в некоторые моменты...
А если Streetlist.Strings[0][1]<>"*" то какое значение у него будет при первом проходе?
← →
ЮЮ © (2006-09-21 12:33) [36]вот код, ошибка возникает если в конце файла несколько переводов строки (нажали ентер несколько раз), если их нет- то все нормально..
ошибка (аксес виолейшн)
как только доходит до такой строки, то даже проверки не возникает внутрь цикла не заходит - сразу выбрасывает ошибку...
с пустыми строками я разберусь, это не проблема..
(по идее их не должно быть)
А что тогда здесь мы делаем? По коду пытаемся понять алгоритм и структуру данных?
← →
Sergioni (2006-09-21 12:48) [37]во-первых:
такое значение будет при первом проходе (таков формат файла)
ЗЫ этим обозночаются названия районов
если нет * - то это название улиц которые пренадлежат району после которого они идут..
нужно искать в таблице названия улиц и в соответствующей ячейке обозначать какой это район
ЗЫ в одной ячейке (где название улицы) может быть несколько улиц разных районов и одинаковых (одинаковые районы в обозначении соотв ячейки повтороять не нужно)
← →
Sergioni (2006-09-21 12:59) [38]>>ЮЮ © (21.09.06 12:33) [36]
как только доходит до такой строки, то даже проверки не возникает, внутрь цикла не заходит - сразу выбрасывает ошибку...
по идее если строка пустая добавилась в лист, то (их предположим три в конце листа) цикл дойдя до первой пустой строки должен пустить внутрь кода цикла (чтобы проверить) так ведь?
предположим первая пустая строка - это номе 501, а всего 503 в листе строк, то при подходе к 501 цикл завершается не пройдя во внутрь для сравнения пустая строка или нет..
← →
ЮЮ © (2006-09-21 13:04) [39]
> (таков формат файла)
каков?
ЗЫ в одной ячейке (где название улицы) может быть несколько улиц
Т.е. на входе:
Улица1гоРайона, ДругаяУлица1гоРайона, Улица2гоРайона,ТретьяУлица1гоРайона
на выходе
1йРайон, 2Район
Ланный представлены в текстовом фале
*1йРайон
Улица1гоРайона
ДругаяУлица1гоРайона
ТретьяУлица1гоРайона
*2йРайон
Улица2гоРайона
И у тебя проблема реализацией арголитма?
← →
ЮЮ © (2006-09-21 13:06) [40]У пустой строки нет Streetlist.Strings[0][1]
А есть исключение и вылет не только из цикла, но из процедуры, метода, едо вызвавшего и т.д. пока кто-нибудь не подавит его
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.04 c