Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление элементов в TStrings [D7, 95/98, XP]


Страницы:   1 2

SKIPtr ©   (2007-09-11 23:24:00) 

Этот тип относится к коллекциям Я всегда видел что в коллекциях заносился не элемент а указатель на него В TStrings должен заноситься не строка а указатель на неё а для строки берётся место из памяти При удалении строки из коллекции в Turbo Vision надо самому подумать о возращении не нужной переменной в кучу Происходит полное удаление в TStrings переменой при удалении элемента


SKIPtr   (2007-09-13 19:52:00) [1]

Спасибо palva ©   (13.09.07 11:45) [34] напомнили мне что такое полиморфизм а то давно с этим не сталкивался


palva   (2007-09-13 11:45:00) [2]

> АГА пишут в книгах одно а там совсем другое
Обижаешь, начальник. Все по-честному. Цитирую строку из
C:\Program Files\Borland\Delphi7\Source\Vcl\StdCtrls.pas

   property Lines: TStrings read FLines write SetLines;

Это свойство вводится в TCustomMemo - предке TMemo. Оно имеет тип TStrings.
Так что создать TStrings может быть и нельзя, но можно создать его потомка и возвратить его в свойстве или переменной типа TStrings.
А если про книжки, то в большинстве из них пишут рецепты, как надо писать, чтобы работало. Если вас интересует подноготная, то читайте другие книжки или исходники.


Kolan   (2007-09-13 09:37:00) [3]

> АГА пишут в книгах одно а там совсем другое

Чтобы разобраться вам надо понять что такое полиморфизм. Про это написано в любой книге по ООП.

Как только разберётесь поймете что то, что там(в мемо) объявлен класс TStrings еще не значит что экземпляр именно этого класса на самом деле создан.


SKIPtr   (2007-09-13 04:49:00) [4]

АГА пишут в книгах одно а там совсем другое


palva   (2007-09-12 22:49:00) [5]

Ага! TMemoStrings называется. Попробуйте следующий код:

procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(Memo1.Lines.ClassName)
end;


palva   (2007-09-12 22:46:00) [6]

> Memo им ползуется напрямую или TStrings несколько вариантов
Memo использует для хранения строк поле какого-то типа, порожденного от TStrings, но property Lines работающее с этим полем имеет тип TStrings. Это не криминал.


SKIPtr   (2007-09-12 22:18:00) [7]

Спасибо что в горячей дискусии дали ответ на вопрос

В Turbo Pascal абстракта не было так и делали пустой метод наверно хотели упростить а вон как повернулась

Щас не понятно только одно TStrings абстракт и пользоваться им можно только через потомка но Memo им ползуется напрямую или TStrings несколько вариантов


Kolan   (2007-09-12 21:47:00) [8]

> а наличие ключевого слова abstract лишь позволяет не писать

Давай отделим теорию от Delphi. В Delphi не только abstract(для классов) работает не верно(не так как в справке и в теории), еще и privateс protected«шалят».

мда… формализацию абстрактного класса в студию пожалуйста…
В смысле? Тебе привести ссылку откуда я вязл что абстрактный класс — это класс который нельзя инстанцировать?


> а наличие ключевого слова abstract лишь позволяет не писать

Опять же ключевое слово это применяется к методам и к классам, ты про что?


Palladin   (2007-09-12 19:15:00) [9]

ну и конечно выводить предупреждение


Palladin   (2007-09-12 19:14:00) [10]

мда... формализацию абстрактного класса в студию пожалуйста...

TClass1=Class
 Procedure Proc1; Virtual; Abstract;
End;

TClass2=Class
Procedure Proc1; Virtual;
Endl

Procedure TClass2.Proc1;
Begin
// а просто абстрактный
End;


ну и? что и где здесь?
не стоит спорить с Джо (Це М) [4]
а наличие ключевого слова abstract лишь позволяет не писать

Procedure TClass2.Proc1;
Begin
// а просто абстрактный
End;


Anatoly Podgoretsky   (2007-09-12 19:10:00) [11]

> Kolan  (12.09.2007 17:52:24)  [24]

> Я что-то не найду где я говорил что его нельзя использовать… Я говорю, что в теории  его нельзя инстанцировать.

Нельзя и именно поэтому он абстрактный.


Kolan   (2007-09-12 17:52:00) [12]

> А насчет того, что негде использовать абстрактный класс,
> еще как где

Я что-то не найду где я говорил что его нельзя использовать… Я говорю, что в теории  его нельзя инстанцировать.

А вот этот inherited не всегда вспоминаешь убрать.
TMyClass = class abstract
 public
   procedure MyAbstProc; virtual; abstract;
 end;

 TDesClass = class(TMyClass)
 public
   procedure MyAbstProc; override;
 end;


procedure TDesClass.MyAbstProc;
begin
 inherited;
 ShowMessage('sdf');
end;


Ты что хочешь сказать что выше указыный код приведет к abstract error? — Ты что, нет конечно…


Ega23   (2007-09-12 17:17:00) [13]

Кстати, именно из-за "косяка" Delphi по возможности создания класса с абстрактным методом, почти перестал ими пользоваться. В базовом классе просто virtual ставлю с пустым обработчиком (типа, как в базовом TDataLink)

уже несколько раз накалывался на abstract error. Причём даже так: у всех потомков перекрыл абстрактный метод, всё нормально, ничего не забыл. Но по Complete Class at cursor эта сволочь inherited ставит по-умолчанию. А вот этот inherited не всегда вспоминаешь убрать.


Anatoly Podgoretsky   (2007-09-12 17:06:00) [14]

> Kolan  (12.09.2007 17:00:20)  [20]

Моя просветительская деятельность начинает приносить плоды.
А насчет того, что негде использовать абстрактный класс, еще как где - он является шаблоном для построения других классов.


clickmaker   (2007-09-12 17:04:00) [15]


> А создать экземпляр TStrings мне никто не мешает.

- Рабинович здесь живет?
- Нет
- А вы кто?
- Рабинович
- А почему говорите, что нет
- Так разве ж это жизнь...


Kolan   (2007-09-12 17:00:00) [16]

> Хотя, может в 2006 уже есть и абстрактный класс — надо знания
> обновить.

Я же говорю есть.

BDS2006:
If a class is marked abstract, then it cannot be instantiated directly using the Create constructor.

Но это:
TMyClass = class abstract
end;

TMyClass.Create;


компилится … почемуто. — Видно недоделали…

таковым класс делает наличие хоть одного абстрактного метода
А где это такое написано? Абстрактный класс это класс экземпляр которого нельзя создать. А создать экземпляр TStrings мне никто не мешает.


clickmaker   (2007-09-12 16:59:00) [17]

а вообще нет... есть в плюсах и шарпе кейворд abstract для классов
хм... как-то оно ни разу не нужно было.. ну да ладно, пусть будет :)


clickmaker   (2007-09-12 16:51:00) [18]

хотя в VB.NET ввели MustInherit
как замену сишному и сишарпному = 0 после объявления метода


clickmaker   (2007-09-12 16:49:00) [19]


> [15] Игорь Шевченко ©   (12.09.07 16:32)
> Ega23 ©   (12.09.07 15:57) [14]
>
> в Delphi нет понятия абстрактного класса

его нигде нет. Ни у нас, ни за рубежом.
таковым класс делает наличие хоть одного абстрактного метода


Ega23   (2007-09-12 16:42:00) [20]


> в Delphi нет понятия абстрактного класса. Есть понятие абстрактного
> метода.


Ну, я имел ввиду не конкретно в Delphi, а с точки зрения теории ООП вообще.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо