Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

tstrings [D2005, XP]


Страницы:   1 2 3

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]

Описание возникающей ошибки таки секретно.

Палач! Щипцы!


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо