Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.08;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.051 c
15-1158217488
k2
2006-09-14 11:04
2006.10.08
"Методология повышения производительности вещественных и ..."


2-1157811368
POP
2006-09-09 18:16
2006.10.08
Потоки.. не в зуб ногой


11-1133818651
Vedun
2005-12-06 00:37
2006.10.08
Работа с базами данных


2-1159123064
vain
2006-09-24 22:37
2006.10.08
запуск прграммы


15-1158060195
Real
2006-09-12 15:23
2006.10.08
Реален ли CMP - Crimea Mastak Party?