Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1155213781
Ega23
2006-08-10 16:43
2006.10.08
конструкция Update ... Set ID=(Select)


6-1147710288
dmitrlast
2006-05-15 20:24
2006.10.08
Где б найти про IDFTPServer?


2-1158514780
Doblclick
2006-09-17 21:39
2006.10.08
Как в Richedit вставить strings?


2-1157710078
id
2006-09-08 14:07
2006.10.08
Работа с BLOB полями


2-1158766989
Image
2006-09-20 19:43
2006.10.08
Кто нибудь знает как сохранить форму вместе со всем содержимым в





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский