Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Внизсамый простейший вопрос - свой var на основе TStrings Найти похожие ветки
← →
malamba (2003-08-21 14:35) [0]Я что-то совсе поглупел:
как сделать свою переменную типа TStrings.
Я делаю
var
str: TStrings
...
str. create;
И вот здесь вылетает все. Напрочь.
Мелочь, а противно.
Как бороться?
← →
stone (2003-08-21 14:37) [1]TStrings - абстрактный класс
str: TStringList;
← →
Vlad (2003-08-21 14:40) [2]если уж на то пошло, то str:=TStrings.Create
← →
default (2003-08-21 14:46) [3]или
var
Str: TStrings;
begin
Str := TStringList.Create
тогда только чтобы юзать "новшества" TStringList надо вып0ать приведение к этому типу
← →
malamba (2003-08-21 14:54) [4]Я тоже был такой:
str:=TStrings.Create;
Вылетало.
Если использовать не абстрактный класс, а TStringList - я смогу передать его в какой-нибудь ComboBox?
Чем хорош TStrings:
ComboBox.Items:= str ( которая есть TStrings).
Да и вообще...
← →
Digitman (2003-08-21 15:05) [5]
> Чем хорош TStrings:
> ComboBox.Items:= str ( которая есть TStrings).
недопустима такая конструкция !
а вот такая
ComboBox.Items.Assign(str)
вполне допустима) ... и ни в коем случае не спрашивай - почему)
← →
Reindeer Moss Eater (2003-08-21 15:08) [6]> ComboBox.Items:= str ( которая есть TStrings).
недопустима такая конструкция !
Она очень даже допустима. Потому как Items - свойство это.
← →
malamba (2003-08-21 15:14) [7]Виноват, вылетало не на создании, а на
str.Add(Field[0].AsString);
"Чувстувую, что здесь какая-то логическая несообразность, но не могу понять где..."
← →
Reindeer Moss Eater (2003-08-21 15:16) [8]str.Add(Field[0].AsString);
Str - указатель никуда не указывающий.
← →
VAleksey (2003-08-21 15:18) [9]
> malamba (21.08.03 15:14)
В голове.
PS
А почему опять в базах данных - то вопрос?? Какое отношение он к БД имеет???
← →
malamba (2003-08-21 15:26) [10]А это разве не "Общие вопросы?"
Как в анекдоте : "А я что сказал?"
Ой, Модератор, я дико извиняюсь!!!! Плюсик мне, плюсик...
А Кстати, о плюсиках:
str.Add(Field[0].AsString); - как не указывающий?
Стандартная процедура записи в TString.
str создана перед этим.
Кстати, вот в чем была проблема :
var
Str: TStrings;
begin
Str := TStringList.Create
Defaul был прав - в любом случае нужно создавать под TStringList, хотя переменная и TStrings
← →
Romkin (2003-08-21 15:36) [11]2Digitman как ни странно, присвоение Items напрямую вполне допустимо. По крайней мере в D6 :)
procedure TCustomCombo.SetItems(const Value: TStrings);
begin
if Assigned(FItems) then
FItems.Assign(Value)
else
FItems := Value;
end;
procedure TCustomMemo.SetLines(Value: TStrings);
begin
FLines.Assign(Value);
end;
Ну и так далее :)))
← →
VAleksey (2003-08-21 15:39) [12]
> Romkin © (21.08.03 15:36)
Вот этим программисты Borland и вносят сумятицу в ряды простых смертных.
← →
Romkin (2003-08-21 15:41) [13]А исходники на что?!
← →
default (2003-08-21 15:43) [14]он про то, что простые смертные в исходники не заглядывают, IMO
← →
Reindeer Moss Eater (2003-08-21 15:45) [15]Вот этим программисты Borland и вносят сумятицу в ряды простых смертных.
Тем, что используют парадигму свойств?
← →
Карелин Артем (2003-08-21 15:48) [16]>>присвоение Items напрямую вполне допустимо
Только при освобождении Str освободится и ComboBox.Items!!
Да и функция вообще-то есть стандартная с таким именем.
← →
Digitman (2003-08-21 15:49) [17]
> Romkin
> Reindeer Moss Eater
приношу извинения.
действительно - допустима.
каюсь, поленился посмотреть в stdctrls.pas, почему-то показалось (по аналогии с некоторыми иными классами), что Items просто фиксирует ссылку, а не вызывает тот же Assign()
← →
Reindeer Moss Eater (2003-08-21 15:53) [18]Карелин Артем © (21.08.03 15:48) [16]
>>присвоение Items напрямую вполне допустимо
Только при освобождении Str освободится и ComboBox.Items!!
С чего бы это вдруг ему освободиться?
← →
Карелин Артем (2003-08-22 10:51) [19]Reindeer Moss Eater © (21.08.03 15:53)
Запускаем:
procedure TForm1.Button1Click(Sender: TObject);
var ss: TStrings;
begin
ss:=TStrings.Create;
ss:=ComboBox1.Items;
ss.Free;
end;
При попытке раскрытия комбобокса получаем AV!!
← →
Юрий Федоров (2003-08-22 10:58) [20]>>Карелин Артем © (22.08.03 10:51) [19]
Ну уж отлюбой глупости механизм get\set для св-в защитить не может :-)
Мало того, что грохнул поле ComboBox1.Items (и это при живом-то объекте!), так еще и утечку памяти дропустил :-)
← →
Reindeer Moss Eater (2003-08-22 11:03) [21]Карелин Артем ©
У автора вопроса случай похожий, но совершенно иной.
У него TStrings - это свойство класса. Именно это обстоятельство не приведет к убиению.
← →
Карелин Артем (2003-08-22 11:05) [22]Юрий Федоров © (22.08.03 10:58)
Это к тому, что без Assign не обойтись. Ну а в случае такого кода и try ... finally не даст положительного эффекта.
← →
Юрий Федоров (2003-08-22 11:09) [23]>>Карелин Артем © (22.08.03 11:05) [22]
А как ты себе представляешь Assign для св-ва TStrings на чтение ?
На запись все понятно(так и сделано), а при чтении придется копию объекта создавать - в результате внешний код превратится в настоящий бардак - после каждого обращения к св-ву придется вызывать деструктор :-)
← →
Song (2003-08-22 18:34) [24]Использование TStrings допустимо только на ссылке т.е.:
Function SomeFunc(Str: TStrings);
Begin
...
End;
SomeFunc(CheckListBox1.Items); например,
но недопустимо в тех операциях где ожидается создание экземпляра класса и/или его использование.
← →
malamba (2003-08-22 18:50) [25]Автора, автора!!
ComboBox.Items.Assign(Str);
ComboBox.ItemIndex:=0;
Работает-с.
Но вот что не ндравится - задал вопрос о коллекциях его на месте расстрелляли. Да-с, господа, прямо на моих глазах...
Так вот я о чем:
Есть список элементов. Каждый элемент имеет свой подсписочек.
В чем все это лучше держать?
Вроде бы нашел, что коллекция лучше - меньше кода, все уже встроено.
НО класс TCollection как правильно создать?
В форме у меня кой-чего создается, обрабатываеться, заодно создаю описанный в другом модуле класс коллекции - и на тебе - вылетает ошибка, что создать низзя.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c