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

Вниз

Почему не работает?   Найти похожие ветки 

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

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

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


 
Skier ©   (2003-01-14 19:12) [1]

>Noname2

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

Куча !

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



 
UltraFreak ©   (2003-01-14 19:14) [2]

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

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

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


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

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


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

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


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

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


 
Skier ©   (2003-01-14 19:33) [6]

>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-поля, но это
уже не принципиально...)



 
mrcat ©   (2003-01-14 19:36) [7]

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


TStringList
F1 -> Example


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

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


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

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


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

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


 
Roma ©   (2003-01-14 19:46) [11]

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

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

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


 
Anatoly Podgoretsky ©   (2003-01-14 20:31) [12]

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


 
Skier ©   (2003-01-15 10:48) [13]

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


 
R4D][   (2003-01-15 18:01) [14]

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


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

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

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


 
Skier ©   (2003-01-15 18:28) [16]

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


 
Anatoly Podgoretsky ©   (2003-01-15 21:28) [17]

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



Страницы: 1 вся ветка

Текущий архив: 2003.01.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
1-72291
EXE
2003-01-15 11:54
2003.01.23
Подскажите как поместить меню на панель инструментов


1-72274
Sniffer
2003-01-14 17:26
2003.01.23
Закрытие программы


3-72161
Jackal
2003-01-04 12:41
2003.01.23
Кодировка


1-72397
Dmitriy2003
2003-01-13 16:15
2003.01.23
Совместимость C++ , Delphi


4-72606
Evgeny
2002-12-06 10:54
2003.01.23
Файл CGI