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

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

Почему не работает? [D5, Win95/98]


Noname2 ©   (2003-01-14 19:10:00) 

var
q: Tstrings;
begin
q.add("qqqqqqq");
end;

какието ощибки...
подскажите как сделать переменную типа Tstrings и заполнять ее


Anatoly Podgoretsky   (2003-01-15 21:28:00) [1]

Skier © (15.01.03 18:28)
Таким исключение могут быть члены класса, как контейнеры, во всех остальных случаях стоит задуматься об дизайне, за 8 лет работы с Дельфи, ни разу не потребовалось, потому что не не путаюсь повторно использовать, это прямой путь к ошибкам.


Skier   (2003-01-15 18:28:00) [2]

>Anatoly Podgoretsky
В этом куске кода это безусловно не обязательно,
но иногда (в более сложном коде:) ) возникает необходимость
проверки указателя на nil, чтобы убедиться что или объект ещё
не создан или он уже убит...


Anatoly Podgoretsky   (2003-01-15 18:11:00) [3]

Skier © (15.01.03 10:48)
Криминалом конечно не является, зачем сбрасывать вот в чем вопрос?

R4D][ (15.01.03 18:01)
Тебе про кровь писали?


R4D][   (2003-01-15 18:01:00) [4]

>Anatoly Podgoretsky
А зачем здесь нужны другие наследники TStrings? Насколько я понял, другие классы, кроме TStringList, здесь не понадобятся, в то же время, прямое объявление TStringList делает код более понятным, наглядным для новичка. Да и ошибки потом будет легче искать. Так что все-таки, как мне кажется, сразу объявлять TStringList более рационально в данном случае.


Skier   (2003-01-15 10:48:00) [5]

>Anatoly Podgoretsky
Это говорит о правиле сбрасывания указателя, на освобождённый
объект, что не является криминалом...


Anatoly Podgoretsky   (2003-01-14 20:31:00) [6]

R4D][ (14.01.03 19:45)
Нет_ не рационально, не забываем про полиморфизм и не ограничиваем себя только TStringsList, а вот это - FreeAndNil(q), как правило это говорит о плохом проектировании программы и желании повторного использования, что как правило кончается плохо, поиском трудно уловимых ошибок.


Roma   (2003-01-14 19:46:00) [7]

> Skier © (14.01.03 19:33)
F - это обычно префикс private-поля, но это уже не принципиально...

Не обязательно private, просто - поля (от англ. field - поле), для отличия полей от свойств (у которых в Delphi не принято ставить префикс). Но это уже совсем не принципиально... ;)

PS: Это сообщение не для Скайера, а просто комментарий...


R4D][   (2003-01-14 19:45:00) [8]

Не хочу показаться необязательным, но здесь это не критично, да и, все же, объявить TStringList вместо TStrings, более рационально, но, вообще, ты несомненно прав.


Skier   (2003-01-14 19:38:00) [9]

>R4D][
1) Освобождение объекта никогда не бывает лишним !
(тем более что у него нет владельца)
2) когда идёт работа с памятью то её освобождение
надо защищать на случай возникновения исключения
(конечно в этом куске кода оно вряд ли возникнет :), но
использование блока try-finally-end в случаях выделения
памяти должно войти в кровь...:) )


Noname2   (2003-01-14 19:38:00) [10]

Всем большое спасибо


mrcat   (2003-01-14 19:36:00) [11]

Noname2 (14.01.03 19:10)
...
какието ощибки...
...


TStringList
F1 -> Example


Skier   (2003-01-14 19:33:00) [12]

>Noname2
Можно.
Сделай переменную типа Tstrings полем формы...

TForm1 = class(TForm)
private
FStrings : TStrings;
//..................
end; //

//.................

procedure TForm1.FormCreate(Sender: TObject);
begin
FStrings := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(FStrings); //или просто FStrings.Free;
end;

Если тебе нужно чтобы поле FStrings было видно и
в других модулях, то перенеси его в раздел public

TForm1 = class(TForm)
public
FStrings : TStrings;
//..................
end;

(конечно, F - это обычно префикс private-поля, но это
уже не принципиально...)


R4D][   (2003-01-14 19:31:00) [13]

Дело в том, что TStrings - абстрактный класс, а одна из его реализаций - это TStringList(это я пояснил код Skier"a), смею предположить, что для NoName2 - он несколько непонятен. Вопрос к Skier"у: Зачем объявлять переменную типа TStrings и добавлять лишний FreeAndNil и try...finally, если можно сразу объявить TStringList? Так что можно по-легче.


Noname2   (2003-01-14 19:25:00) [14]

> Skier ©
а можно как-то сделать, чтобы переменная Tstrings надолго хранила информацию, а не только в блоке try...finally ?
Она мне надо как глобальная


Skier   (2003-01-14 19:15:00) [15]

>UltraFreak
Похоже на шутку...:)


UltraFreak   (2003-01-14 19:14:00) [16]

Не уверен, но попробуй:

var
q:tstrings;
begin
q:=tstrings.create;
q.add("aaa");
q.add("bbb");
q.add("ccc");
q.free;
end;

Или что-то в этом роде...


Skier   (2003-01-14 19:12:00) [17]

>Noname2

> какието ощибки...

Куча !

var
q: Tstrings;
begin
q := TStringList.Create;
try
q.add("qqqqqqq");
finally
FreeAndNil(q)
end; //try
end;


Наверх

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