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

Вниз

TStrings - странный клас какой-то   Найти похожие ветки 

 
Teren   (2004-01-02 01:51) [0]

Вроде как TStrings это класс. Тогда почему к элементам, которые он хранит можно обращаться запросто вот так Strings1[i]?
Это ведь неправильно!

По идее, если Strings1: array of TStrings;
тогда как раз можно обращаться Strings1[i]...

И главное, в коде TStrings не поймешь - как они так сделали, что можно обращаться к классу, как к массиву...


 
Undert ©   (2004-01-02 01:56) [1]


> Teren


Читай хелп по Property


 
Teren   (2004-01-02 01:58) [2]

Причем здесь Property ?!


 
raidan ©   (2004-01-02 01:59) [3]

Поверь мне, все очень просто :)))
Обрати внимание на скромное слово default; после property strings[index:integer] что-то-там-еще...
Это скромное слово говорит о том, что свойство strings[index:integer] является свойством по-умолчанию и его не обязательно писать после точки. Написание strings[1] эквивалентно strings1.strings[1] :)
О как.


 
Teren   (2004-01-02 01:59) [4]

Причем здесь Property ?!


 
Teren   (2004-01-02 02:01) [5]

а-а-а... понятно


 
raidan ©   (2004-01-02 02:02) [6]

Балда.
Читай исходники, там все есть.
И исходники класса TStrings там тоже есть.
Если не втыкаешь, купи книжку.
Если книжка не поможет, то это клинический случай.
Сорри, но, мля :((
Причем здесь propery...
Да просто так...
Тусуются тут эти проперти понимаешь-ли...


 
raidan ©   (2004-01-02 02:03) [7]

Сорри :)
Наорал :)
Зря :)


 
ИМХО ©   (2004-01-02 02:38) [8]

У тебя такое часто? ;)


 
raidan ©   (2004-01-02 04:10) [9]

Нет. Только когда кто-то не понимает, ему объясняют, а он не понимает, понимаешь ли :)
Или это я ошибочно думаю, что не понимает :)
В общем, ишо раз сорри :)


 
Teren   (2004-01-02 14:32) [10]

1) А что будет если так:

TMyClass = class
private
FSome: TMyClass;
public
property Some: TMyClass read FSome write FSome; default;
end;


Тогда если MyClass1: TMyClass, то

при обращении к MyClass1:= TMyClass(Pnt)

что произойдет?

2) В TStrings есть абстрактные методы - Put, Get. Почему тогда можно создать экземпляр класса TStrings?


 
SPeller ©   (2004-01-02 14:46) [11]


> А что будет если так:

Ничего необычного. А что ты хотел получить?


> что произойдет?

Преобразование типов. Переменная Pnt преобразуется к типу TMyClass.


 
Teren   (2004-01-02 14:59) [12]

SPeller
ты не понял. Ведь получится, что MyClass1 имеет тип TMyClass, и его свойство по умолчанию (к которому можно обращаться просто по имени экземпляра класса) тоже имеет тип TMyClass!

К чему произойдет обращение тогда, к MyClass1 как к экземпляру класса или к MyClass1.Some? Вот в чем вопрос!


 
Palladin ©   (2004-01-02 22:42) [13]


> Teren (02.01.04 14:59) [12]

Ты откомпилировать пробовал прежде чем спрашивать.
Заканчивай дурью маятся и иди учи матчасть.


 
Teren   (2004-01-02 22:56) [14]

>Palladin © (02.01.04 22:42) [13]

А-а-а! Свойство по умолчанию должно быть массивом! Тогда да, никакой путаницы с экземпляром класса не будет! Если MyClass1 значит к самому классу обращаются, а если MyClass1[i] - то значит к свойству класса по умолчанию! Верно?


 
Stilgar ©   (2004-01-02 23:08) [15]

Palladin имеет в ввиду, что свойством по умолчанию может быть только массив (см. Тейкстеру и Пачеко).

> 2) В TStrings есть абстрактные методы - Put, Get. Почему
> тогда можно создать экземпляр класса TStrings?

Создать класс можно. Пользоватся нельзя.


 
Teren   (2004-01-02 23:17) [16]

А я думал, что создавать абстрактные классы нельзя! Ведь для этого и есть ключевое слово abstract - показывает методы, которые должны быть обязательно быть перекрыты в наследниках. А вот от наследников уже можно создавать экземпляры. Разве не так?

>Создать класс можно. Пользоватся нельзя

как это?


 
Fantasist ©   (2004-01-02 23:32) [17]


> Пользоватся нельзя.


Пользовать тоже можно, в каком-то смысле. Вызывать абстрактные методы нельзя.


 
kaif ©   (2004-01-03 00:52) [18]

Абстрактных классов нет. Есть абстрактные методы. И классы, у которых большинство методов абстрактные, часто называют абстрактными классами (например, TDataSet). Но это нестрогий способ говорить. Абстрактный метод можно добавить к любому классу. Если я добавлю абстрактный метод к потомку класса TButton, это не значит, что я не смогу больше создавать экземляры такого класса. Просто я не смогу вызывать этот метод на этом уровне, так как у него пока нет реализации.


 
Teren   (2004-01-03 00:58) [19]

Блин, ну я ведь точно где-то читал! Какие-то классы нельзя создать - можно только создать их потомков... что это за классы тогда?! Я думал абстрактные


 
default ©   (2004-01-03 01:17) [20]

"Какие-то классы нельзя создать - можно только создать их потомков... что это за классы тогда?! "
создаются не классы, а объекты(экземпляры классов)
а создавать можно любые объекты, другое дело что в этом нет смысла(типа TStrings)
"Я думал абстрактные"
в принципе не обязательно, так как можно описать класс у которого все или часть методов будут "пустыми"(ничего не делают) и создавать такой объект может тоже не иметь смысла(в нём не описана нужная функциональность)


 
Teren   (2004-01-03 14:09) [21]

>другое дело что в этом нет смысла(типа TStrings)

как это нет смысла? Вот свойство TListBox.Items имеет тип TStrings!


 
Vuk ©   (2004-01-03 14:15) [22]

to Teren:
>Вот свойство TListBox.Items имеет тип TStrings!
А если посмотреть ListBox.Items.ClassName? :o)


 
default ©   (2004-01-03 17:34) [23]

Teren (03.01.04 14:09) [21]
это формально, реально же создаётся TStringList, подумай для чего так сделано


 
Teren   (2004-01-03 18:24) [24]

>А если посмотреть ListBox.Items.ClassName? :o)

TListBoxStrings... а почему ?! Как это? Ведь сказано

property Items: TStrings read FItems write SetItems;

P.S. Шаманы...


 
Sandman25 ©   (2004-01-03 18:29) [25]

[24] Teren (03.01.04 18:24)

Из той же оперы:
в обработчиках, например, кнопки в роли Sender выступает кнопка (тип TButton), а не TObject, как описано в методе. И ничего, работает :)


 
Teren   (2004-01-03 18:34) [26]

Ну правильно, ибо TObject и TButton это обычные Pointer

И можно написать TButton(Sender)


 
Sandman25 ©   (2004-01-03 18:47) [27]

[26] Teren (03.01.04 18:34)

Вот и со Strings можно так же: TStrings(ListBox.Items)


 
Vuk ©   (2004-01-03 19:07) [28]

>P.S. Шаманы...
Неа. Полиморфизм.


 
Teren   (2004-01-04 00:36) [29]

Подождите, я ничего не понял.

>TStrings(ListBox.Items)

нафига...бр-р-р... объясните мне одно. Ведь в описании четко написано:

property Items: TStrings

Каким образом тогда Items стала неким TListBoxStrings? И где этот TListBoxStrings описан вообще?


 
Sergey_Masloff   (2004-01-04 00:41) [30]

Teren (04.01.04 00:36) [29]
А чего тут понимать? TStrings абстрактный класс реализующий некий интерфейс (не путать с COM-интерфейсами) работы со списком(собственно говоря массивом) строк. Экземпляр TStrings как таковой не создается а создается один из его потомков которые реализует методы описаные в TStrings и управляет памятью выделяемой для хранения элементов. Одним из таких потомков и является TListBoxStrings. Items стала TListBoxStrings-ом в конструкторе. Открой исходник да посмотри - проблем-то. Благодаря пиратам с доступом к исходникам VCL проблем в России нет. Что может и плохо - так как к бесплатному и отнощение... соответствующее. Впрочем, это я отвлекся.


 
Teren   (2004-01-04 01:26) [31]

А почему бы тогда сразу не сделать

Items: TListBoxStrings ?


 
default ©   (2004-01-04 02:01) [32]

Teren (04.01.04 01:26) [31]
а вот тут собаку зарыли


 
Teren   (2004-01-04 14:46) [33]

НУ блин и расскажите секрет! Или намекните что ли...


 
Sergey_Masloff   (2004-01-04 15:07) [34]

>НУ блин и расскажите секрет! Или намекните что ли...
Прочти книжку. Ну ты ж не станешь просить чтобы тебе объяснили как вычислить интеграл не изучив элементарной арифметики. Тут та же история ну скажут тебе почему в этом частном случае так - и что толку?


 
Anatoly Podgoretsky ©   (2004-01-04 15:10) [35]

Намек, это чтобы было совместимо с любыми наследниками от TStrings


 
Teren   (2004-01-05 16:25) [36]

>Намек, это чтобы было совместимо с любыми наследниками от TStrings

Чтобы удобнее было делать наследника от TListBox? Чтобы можно было использовать любой тип в Items, хоть наследника TListBoxStrings, хоть наследника от TStrings, верно?


 
Vuk ©   (2004-01-05 16:53) [37]

to Teren:
Для того, чтобы можно было написать, например, так:
ListBox.Items := Memo.Lines;


 
default ©   (2004-01-05 16:56) [38]

Vuk © (05.01.04 16:53) [37]
если бы Items-ы обоих классов имели тип TStringList например так тоже можно было бы сделать...не лучший пример


 
Anatoly Podgoretsky ©   (2004-01-05 17:06) [39]

Пример как раз правильный и наверно лучший
А в твоем варианте, например можно будет присвоить это, нельзя будет присвоить strings


 
default ©   (2004-01-05 17:20) [40]

"Пример как раз правильный и наверно лучший"
лучший был бы если бы справа от присвоения стоял наследник TStrings(в явном виде)



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

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

Наверх




Память: 0.56 MB
Время: 0.014 c
1-93555
Ramario
2004-01-14 12:38
2004.01.29
Средняя кнопка мыши


3-93347
raptorus
2004-01-04 13:06
2004.01.29
Есть ли компонент позволяющий выделить несколько значений поля БД


1-93454
snake1977
2004-01-16 10:21
2004.01.29
Как правильно закрыть форму


14-93681
Knight
2004-01-06 21:18
2004.01.29
А что в mpeg-ах?


1-93575
zioza
2004-01-15 11:03
2004.01.29
ПОДСКАЖИТЕ как создать нестандартную кнопку