Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Вниз

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(в явном виде)


 
Vuk   (2004-01-05 17:21) [41]

to default:
>если бы Items-ы обоих классов имели тип TStringList например так
>тоже можно было бы сделать...
Можно было бы если бы... Но ни TMemoStrings ни TListBoxStrings не являются наследниками TStringList.


 
default   (2004-01-05 17:24) [42]

Vuk © (05.01.04 17:21) [41]
вы не поняли с АП)фиг с ним...


 
Vuk   (2004-01-05 17:38) [43]

to default:
>лучший был бы если бы справа от присвоения стоял наследник
>TStrings(в явном виде)
А его там что, нет? :o) В примере как раз и есть два наследника TStrings с принципиально разным методом доступа к строкам...


 
default   (2004-01-05 17:52) [44]

Vuk © (05.01.04 17:38) [43]
я имел ввиду чтоб было типа
xxx.ItemstTStringsProperty := ItemsTPotomokTStrings
возможно, а
xxx.ItemstTStringListProperty := ItemsTPotomokTStrings
нет
а то что "внутри" они разные это понятно...
а пример
xxx.ItemstTStringsProperty := ItemsTStrings
совершенно не показателен
он скажет на такой пример ну и что?
если бы весто TStrings было TStringList, то так тоже можно было бы сделать...


 
Teren   (2004-01-06 22:41) [45]

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


Теперь понятно! Хотя на самом деле Memo.Lines - это TMemoStrings

Наконец - то я кажется начал понимать нафига этот полиморфизм нужен :)


 
Teren   (2004-01-06 22:57) [46]

Хотя у меня опять вопросы...

TMemoStrings имеет свойство Memo (TCustomMemo). Собственно говоря, в Memo и хранятся все данные TMemoStrings

Но TMemoStrings не имеет конструктора. Значит, он наследует конструктор от TStrings, тот наследует от TPersistent, а тот от TObject!
Тогда вопрос - а где создается экземпляр класса Memo, объявленный в TMemoStrings?


 
Teren   (2004-01-06 23:08) [47]

P.S. Такой еще маленький вопросик - в TMemo в published есть строка "property ReadOnly;"
Почему ReadOnly выделен жирным шрифтом, и если нажать CTRL то не являетс ссылкой?
А остальные ссылкой показываются, но по ссылке не переходит

P.S. Ну и уж совсем такой вопросик. В модуле stdctrls есть строка "uses Messages, {$IFDEF LINUX} WinUtils, {$ENDIF}"
Так вот все модули я могу посмотреть, а WinUtils нет. Также не переходит по ссылке.


 
Vuk   (2004-01-06 23:30) [48]

>Тогда вопрос - а где создается экземпляр класса Memo,
>объявленный в TMemoStrings?
Все происходит с точностью до наоборот. TMemo создает TMemoStrings и присваивает полю в созданном экземпляре ссылку на себя.


 
Teren   (2004-01-07 00:13) [49]

Vuk, блин! А я то запутался немного...

а как насчет Teren (06.01.04 23:08) [47]. Никто не подскажет?


 
Fantasist   (2004-01-07 01:26) [50]


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


Так оно и есть. Только в языке Делфи понятие абстрактного класса отсутсвует. В тех языках где оно присутсвует, например в Java, где они объявляются в явном виде и в С++, где они становятся таковыми имея хотя бы один абстрактный метод, их создавать нельзя. Хотя возможно есть языки где есть возможность инстанцировать и абстрактные классы.



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

Форум: "Потрепаться";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.007 c
14-93624
Думкин
2004-01-09 07:15
2004.01.29
С днем рождения! 9 января.


6-93601
Dr. Well
2003-11-24 17:21
2004.01.29
У пользователя, под которым запущена программа - права только на


14-93679
termos
2004-01-09 09:43
2004.01.29
Закрытие портов на локальной машине


14-93666
BorisMor
2004-01-07 21:34
2004.01.29
Немного политики


1-93515
Looo
2004-01-18 20:00
2004.01.29
Повторяющиеся действия





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский