Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как узнать, что Stringlist был создан


Автор: MadCoder 10.5.2008, 22:59
Здравствуйте!

Всем известно, что перед работой со StringList'ом его необходимо создать (List:=TStringlist.Create). А как проверить, что Stringlist был создан и с ним можно работать? smile 

Автор: THandle 10.5.2008, 23:02
Код

if Assigned(StringList) then


?

Добавлено @ 23:03
http://forum.vingrad.ru/forum/topic-209296/kw-forms-form-%D1%84%D0%BE%D1%80%D0%BC%D0%B0.html

Какая разница? Что форма, что StringList...

Автор: Poseidon 10.5.2008, 23:04
Цитата(MadCoder @  10.5.2008,  22:59 Найти цитируемый пост)
А как проверить, что Stringlist был создан и с ним можно работать?
А как можно работать не создав? Я имею ввиду как можно писать в коде какую-то операцию со Stringlist, если не написал его создания?

Автор: Albinos_x 10.5.2008, 23:36
Poseidon, 
хм... может у него глобальная переменная и работа с нескольких обработчиков, которые независимы друг от друга, поэтому и трубуется проверка...

Автор: Poseidon 11.5.2008, 00:19
Цитата(Albinos_x @  10.5.2008,  23:36 Найти цитируемый пост)
 может у него глобальная переменная и работа с нескольких обработчиков
Если StringList в глобальной переменной, то его нужно создавать в OnCreate!

Автор: ama_kid 11.5.2008, 13:52
Цитата(MadCoder @  10.5.2008,  22:59 Найти цитируемый пост)
как проверить, что Stringlist был создан и с ним можно работать?
мой любимый метод, гы   smile 
Код
try
 List.Add('123');
except
 List:=TStringList.Create(nil);
 List.Add('123');
end;


Автор: Poseidon 11.5.2008, 15:05
Цитата(ama_kid @  11.5.2008,  13:52 Найти цитируемый пост)
мой любимый метод
Я конечно извеняюсь, но твой любимый метод - извращение. Создавать специально ошибку и потом ее отлавливать...  smile 

Автор: ama_kid 11.5.2008, 15:21
Цитата(Poseidon @  11.5.2008,  15:05 Найти цитируемый пост)
Я конечно извеняюсь, но твой любимый метод - извращение
совершенно верно, это мой любимый извращенный метод  smile 

Автор: MetalFan 12.5.2008, 08:23
Цитата(ama_kid @  11.5.2008,  15:21 Найти цитируемый пост)
это мой любимый извращенный метод

...который может привести к непредсказуемым последствиям.
проверка на assigned не всегда применим. это относится к локальным и неинициализироваемым глобальным переменным.
глобальные переменные - зло)

Автор: Sanchezzz 12.5.2008, 08:35
Автору совет не используй все в глобальных пользуйся 
public или private
сделай функцию проверки создан ли Stringlist тем же самым assigned не знаю я не когда не проверяю создан ли Stringlist просто тупо использую ибо всегда создается а при необходимости уничтожаю.

Автор: pseud 12.5.2008, 09:47
Цитата(Poseidon @  11.5.2008,  00:19 Найти цитируемый пост)
Если StringList в глобальной переменной, то его нужно создавать в OnCreate!


простите в OnCreate какого класса?

Добавлено через 5 минут и 32 секунды
Цитата(Sanchezzz @  12.5.2008,  08:35 Найти цитируемый пост)
я не когда не проверяю создан ли Stringlist просто тупо использую ибо всегда создается а при необходимости уничтожаю.


пример 

Код

try
  метод вызвавший Exception
  ...
  StringList1 := TStringList.Create;
except
  обработали Exception
end;
...
StringList1.Add('куку');


к сожалению StringList1 не создастся и StringList1.Add вызовет Exception

никто не знает в каком месте случится Исключительная ситуация.

Добавлено через 7 минут и 2 секунды
Цитата(Sanchezzz @  12.5.2008,  08:35 Найти цитируемый пост)
 а при необходимости уничтожаю.


надо уничтожать не при необходимости, а обязательно. и если это локальная переменная (свойство) то желательно в деструкторе класса (если нет другой необходимости)

Автор: MadCoder 12.5.2008, 10:04
В зависимости от некоторых данных создается и загружается либо Форма 1, либо Форма 2. В форме 1 создается TStringlist, который заполняется данными. Форма 2 может создаваться как из формы 1, так и независимо (без создания Формы 1).

В зависимости от того, есть ли данные в StringList'е, форма 2 читает данные из него, либо выполняет другие действия.

Сейчас это реализовано с помощью try... except, что лично мне кажется пальцем, которым затыкают дырку, вместо того, чтобы залатать ее заплаткой.

Лучший вариант по моему скромному мнению Assigned, всем спасибо за помощь! smile 

Автор: Poseidon 12.5.2008, 10:17
Цитата(pseud @  12.5.2008,  09:47 Найти цитируемый пост)
простите в OnCreate какого класса?
TForm

Вообще, как уже было сказано, глобальные переменные - не хороший тон. Но если все же уже созданы, то создаем Stringlist в TForm.OnCreate, освобождаем в TForm.OnDestroy. Да, может получится так, что память будет занята бестолку. Но зато мы не получим ошибок. А вообще я не представляю себе ситуацию, в которой необходимо проверять создан-ли список или нет. 

Автор: pseud 12.5.2008, 14:24
Цитата(Poseidon @  12.5.2008,  10:17 Найти цитируемый пост)
 то создаем Stringlist в TForm.OnCreate, освобождаем в TForm.OnDestroy


думаю правильнее будет сказать:
создаем в конструкторе, освобождаем в деструкторе
не всяк класс имеет OnCreate/OnDestroy


Цитата(Poseidon @  12.5.2008,  10:17 Найти цитируемый пост)
А вообще я не представляю себе ситуацию, в которой необходимо проверять создан-ли список или нет


я ее простовато но описал в предыдущем своем посте

Автор: Poseidon 12.5.2008, 15:09
Цитата(pseud @  12.5.2008,  14:24 Найти цитируемый пост)
я ее простовато но описал в предыдущем своем посте
В предыдущем твоем посте ошибка в самом коде. Написал бы так:


Код

StringList1 := TStringList.Create;
try
  метод вызвавший Exception
  ...
except
  обработали Exception
end;
...
StringList1.Add('куку');

ничего бы не было.

Автор: pseud 12.5.2008, 15:19
Цитата(Poseidon @  12.5.2008,  15:09 Найти цитируемый пост)
В предыдущем твоем посте ошибка в самом коде. Написал бы так:


это была не ошибка а частный случай, который не подразумевал твоей обертки.
безусловно ты говоришь правильно.

это безупречная конструкция:
Код

List1 := TStringList.Create;
try
  ...
  List1.Add;
  ...
finally
  List1.Free;
end;


но пример я все таки приведу, где нам понадобится Assigned
чтобы ты не говорил

Цитата

А вообще я не представляю себе ситуацию, в которой необходимо проверять создан-ли список или нет


Код

function TForm1.GetListAsString(ATitle: string; AList: TStringList = nil): string;
begin
  Result := ATitle;
  if Assigned(AList) then
    Result := Result + ': ' + AList.CommaText;
end;

Автор: Poseidon 12.5.2008, 15:57
Цитата(pseud @  12.5.2008,  15:19 Найти цитируемый пост)
но пример я все таки приведу, где нам понадобится Assigned
Приведи еще пример вызова приведенной функции, и я тебе покажу что без проверки можно обойтись  smile 

Автор: MadCoder 12.5.2008, 16:03
Код

StringList1 := TStringList.Create;
try
  метод вызвавший Exception
  ...
except
  обработали Exception
end;
...
StringList1.Add('куку');

В том то и дело, что мне не нужно создавать TStringlist, если он не создан, мне нужно определить, был ли он создан.

Автор: Poseidon 12.5.2008, 16:17
Цитата(MadCoder @  12.5.2008,  16:03 Найти цитируемый пост)
В том то и дело, что мне не нужно создавать TStringlist, если он не создан, мне нужно определить, был ли он создан.
Вопрос упирается не в то, что тебе нужно, а в то, зачем тебе это! Любой код можно построить так, что ты будешь точно знать, что Stringlist создан или не создан. Поэтому проверку производить не нужно.

А вообще, думаю, суть вопроса раскрыта. Спрашивалось "Как", ответили что через Assigned. Рациональность этого способа - это уже другая тема.

Автор: MadCoder 12.5.2008, 16:23
Цитата(Poseidon @ 12.5.2008,  16:17)
Цитата(MadCoder @  12.5.2008,  16:03 Найти цитируемый пост)
В том то и дело, что мне не нужно создавать TStringlist, если он не создан, мне нужно определить, был ли он создан.
Вопрос упирается не в то, что тебе нужно, а в то, зачем тебе это! Любой код можно построить так, что ты будешь точно знать, что Stringlist создан или не создан. Поэтому проверку производить не нужно.

А вообще, думаю, суть вопроса раскрыта. Спрашивалось "Как", ответили что через Assigned. Рациональность этого способа - это уже другая тема.

Зачем я написал выше. Как в этом случае можно заранее знать, был ли он создан или нет?

Автор: THandle 12.5.2008, 16:28
Народ, что спорить то? Хочется человеку проверять - пусть проверяет на здоровье. Ответ был дан в 1 посте. smile 

ЗЫ: сам всегда пользуюсь конструкцией вида:

Код

var
  s : TStringList;
begin
  s := TStringList.Create;
  try
    //some code
  finally
    s.Free;
  end
end;

Автор: pseud 13.5.2008, 09:29
Poseidon, я ж привел 2й пример. какой ты упорный. тебе не нравится именно Assigned? ну можно написать
Код

if List <> nil then


Poseidon, 
THandle, 
ну есть свойство в классе кочующее от предка к наследнику, от наследника к наследнику_наследника и наследник_наследника хочет знать в каком-то методе, не очистил ли наследник (допустим написанный другим прогером) это свойство. (третий пример)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)