![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не работает? [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;