![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
tstrings [D2005, XP]
Sergioni © (2006-09-20 01:05:00)Привет Мастерам!
мне нужно временное хранилище строк, думаю использовать tstrings
при попытке использования вылетает ошибка abstract error
как же правильно использовать?
я делаю так:
объявляю в public
str:tstrings;
в formcreate
str:=tstrings.create;
и дальше добавляю str.add('string');
Sergioni (2006-09-23 10:53:00) [1]
> А как же:
>
> MBo © (21.09.06 10:01) [28]
>
> > if Streetlist.Strings[i][1] = '*'
> И что будет при пустой строке?
и это спешка...
> Было бы неплохо услышать, что должен делать алгоритм, тогда
> можно анализировать код.
нужно искать в таблице (в первой колонке) названия улиц и в соответствующей
ячейке (в второй колонке напротив ячеек первой колонки) обозначать какой это район
сравнение улиц делать с списком онных в файле..
ЗЫ в одной ячейке (где название улицы) может быть несколько
улиц разных районов и одинаковых (одинаковые районы в обозначении
соотв ячейки повтороять не нужно)
вот что нужно делать..
а имена улиц и названия районов содержаться в файле
формат файла я описал выше
илицы пренадлежат тому району под которым они расположены в файле..
район обозначен *
Думкин (2006-09-22 05:55:00) [2]> Sergioni (21.09.06 13:34) [41]
> ЮЮ © (21.09.06 13:06) [40]
>
> а вот это уже дело!!
> спасибо, недоглядел...
> вот что значит спешка...
> проблемы с эти нет у меня...
> был баг с [i][1] для пустой строки..
> весьма благодарен, что ты его заметил...
А как же:
MBo © (21.09.06 10:01) [28]
> if Streetlist.Strings[i][1] = '*'
И что будет при пустой строке?
ЮЮ (2006-09-22 03:10:00) [3]
>
> было бы неплохо услышать что-то по алгоритму который уже
> имеется если исключить пустые строки...
Было бы неплохо услышать, что должен делатьалгоритм, тогда можно анализировать код.
Sergioni (2006-09-21 13:34:00) [4]ЮЮ © (21.09.06 13:06) [40]
а вот это уже дело!!
спасибо, недоглядел...
вот что значит спешка...
просто предпологалось, что пустых строк не должно быть, то так было случайно, но все-же это ошибка...
*район
ул
ул
ул
*2район
ул
ул
ул
>>И у тебя проблема реализацией арголитма?
yне понял вопроса
проблемы с эти нет у меня...
был баг с [i][1] для пустой строки..
весьма благодарен, что ты его заметил...
я писал ночью сонный в спешке вот и не углядел..
было бы неплохо услышать что-то по алгоритму который уже имеется если исключить пустые строки...
ЮЮ (2006-09-21 13:06:00) [5]У пустой строки нет Streetlist.Strings[0] [1]
А есть исключение и вылет не только из цикла, но из процедуры, метода, едо вызвавшего и т.д. пока кто-нибудь не подавит его
ЮЮ (2006-09-21 13:04:00) [6]
> (таков формат файла)
каков?
ЗЫ в одной ячейке (где название улицы) может быть несколькоулиц
Т.е. на входе:
Улица1гоРайона, ДругаяУлица1гоРайона, Улица2гоРайона,ТретьяУлица1гоРайона
на выходе
1йРайон, 2Район
Ланный представлены в текстовом фале
*1йРайон
Улица1гоРайона
ДругаяУлица1гоРайона
ТретьяУлица1гоРайона
*2йРайон
Улица2гоРайона
И у тебя проблема реализацией арголитма?
Sergioni (2006-09-21 12:59:00) [7]>>ЮЮ © (21.09.06 12:33) [36]
как только доходит до такой строки, то даже проверки не возникает, внутрь цикла не заходит - сразу выбрасывает ошибку...
по идее если строка пустая добавилась в лист, то (их предположим три в конце листа) цикл дойдя до первой пустой строки должен пустить внутрь кода цикла (чтобы проверить) так ведь?
предположим первая пустая строка - это номе 501, а всего 503 в листе строк, то при подходе к 501 цикл завершается не пройдя во внутрь для сравнения пустая строка или нет..
Sergioni (2006-09-21 12:48:00) [8]во-первых:
такое значение будет при первом проходе (таков формат файла)
ЗЫ этим обозночаются названия районов
если нет * - то это название улиц которые пренадлежат району после которого они идут..
нужно искать в таблице названия улиц и в соответствующей ячейке обозначать какой это район
ЗЫ в одной ячейке (где название улицы) может быть несколько улиц разных районов и одинаковых (одинаковые районы в обозначении соотв ячейки повтороять не нужно)
ЮЮ (2006-09-21 12:33:00) [9]вот код, ошибка возникает если в конце файла несколько переводов строки (нажали ентер несколько раз), если их нет- то все нормально..
ошибка (аксес виолейшн)
как только доходит до такой строки, то даже проверки не возникает внутрь цикла не заходит - сразу выбрасывает ошибку...
с пустыми строками я разберусь, это не проблема..
(по идее их не должно быть)
А что тогда здесь мы делаем? По коду пытаемся понять алгоритм и структуру данных?
Думкин (2006-09-21 12:26:00) [10]
> не пойму, как это оно не используется??
> разве что в некоторые моменты...
А если Streetlist.Strings[0][1]<>'*' то какое значение у него будет при первом проходе?
Sergioni (2006-09-21 12:14:00) [11]с пустыми строками я разберусь, это не проблема..
(по идее их не должно быть)
Sergioni (2006-09-21 12:12:00) [12]>>это в другой, взаимоисключающей ветке If-a
и что с того?
>>tempmicrodistrict бессмысленно присваивать - оно не используется
не пойму, как это оно не используется??
разве что в некоторые моменты...
если эту переменную убрать, то, что, ничего не изменится что-ли?
есть предложения?
MBo (2006-09-21 11:21:00) [13]>а это что?
это в другой, взаимоисключающей ветке If-a
ЮЮ (2006-09-21 11:08:00) [14]if Streetlist.Strings[i] [1]= '*' then
у пустой строки, что и имет в случае, если в конце файла несколько переводов строкинет 1-го символа. Пустый строки вообще незачем разбирать
for i:=0 to Streetlist.Count-1 do begin
if Trim(Streetlist.Strings[i]) = '' then Continue;
Sergioni (2006-09-21 11:00:00) [15]можно конечно запоминать номер нужной строки в streetlist вместо tempmicrodistrict...
Sergioni (2006-09-21 10:52:00) [16]>>tempmicrodistrict бессмысленно присваивать - оно не используется
if pos(tempmicrodistrict,microdistrictstr) = 0 then
microdistrictstr:=microdistrictstr+tempmicrodistrict+' ';
а это что?
MBo (2006-09-21 10:01:00) [17]>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 09:49:00) [18]спасибо всем: вы меня убедили использовать 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;
Sergioni (2006-09-21 09:13:00) [19]ошибка больше не появлялась, хотя код не изменялся...
но файл другой..
Думкин (2006-09-21 06:32:00) [20]Описание возникающей ошибки таки секретно.
Палач! Щипцы!