![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление элементов в TStrings [D7, 95/98, XP]
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, а с точки зрения теории ООП вообще.