Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Вниз
Удаление элементов в TStrings Найти похожие ветки
← →
SKIPtr (2007-09-11 23:24) [0]Этот тип относится к коллекциям Я всегда видел что в коллекциях заносился не элемент а указатель на него В TStrings должен заноситься не строка а указатель на неё а для строки берётся место из памяти При удалении строки из коллекции в Turbo Vision надо самому подумать о возращении не нужной переменной в кучу Происходит полное удаление в TStrings переменой при удалении элемента
← →
DrPass © (2007-09-12 00:06) [1]
> В TStrings должен заноситься не строка а указатель на неё
а) ANSI-строка в Delphi - это и есть указатель
б) А вопрос у тебя в чем? Или ты тут так, поделиться зашел?
← →
новичёк (2007-09-12 01:17) [2]еле понял, что тут написано...
TStrings - это абстрактный класс, там ничего не происходит. А вот если будешь использовать TStringList, то можешь не беспокоиться за память. За тебя все уже сделали. Строковая переменная, которую ты туда засунешь, будет жить независимо от "коллекции". Если интересно, почитай, как устроен тип String.
← →
Германн © (2007-09-12 01:43) [3]
> TStrings - это абстрактный класс, там ничего не происходит.
> А вот если будешь использовать TStringList
Вот ещё один пример путаницы в терминологии. TStrings не абстрактный класс, а базовый как неоднократно недавно говорил АП. Ведь все соответствующие проперти в компонентах типа TMemo, TListBox, TRichEdit... (перечисление всех тут не уместится) имеют тип TStrings.
А насчёт типа String ты прав.
← →
Джо © (2007-09-12 02:40) [4]Собственно, «абстрактными классами» в Делфи можно назвать разве что интерфейсы. Ну, или называть таковыми классы, имеющие ИСКЛЮЧИТЕЛЬНО ТОЛЬКО абстрактные методы. Что недостижимо.
Оговорка: впрочем, возможно, что в новейших версиях Делфи появились и абстрактные классы как таковые, тут я пас.
← →
SKIPtr (2007-09-12 03:05) [5]Я в основном говорил о TStrings который в TMemo Вопрос был в том при уничтожении строк ну напр Memo.Clear или Memo.Lines.Clear при исчезнавении указателя исчезнет сама строковая переменная или динамическую память надо освободить Turbo Vision при удалении строки надо выполнить DisposeStr Нужна ли такая команда в TStrings
← →
Германн © (2007-09-12 03:29) [6]
> SKIPtr (12.09.07 03:05) [5]
>
> Я в основном говорил о TStrings который в TMemo Вопрос был
> в том при уничтожении строк ну напр Memo.Clear или Memo.
> Lines.Clear при исчезнавении указателя исчезнет сама строковая
> переменная или динамическую память надо освободить Turbo
> Vision при удалении строки надо выполнить DisposeStr Нужна
> ли такая команда в TStrings
>
Именно твой вопрос я и имел в виду. Смущала лишь фраза
> надо самому подумать о возращении не нужной переменной в
> кучу
Переменную не надо никуда возвращать. Она как была где-то, так она там и осталась. А вот если для "некоего её содержимого" была выделена память, то эту память надо возвратить. Но для типа String это всё делает сама Дельфи.
← →
icWasya © (2007-09-12 09:32) [7]Кроме строк, в TStrings можно хранить и указатели на какие-то объекты.
Например
Strings.AddObject("One",Button1);
Strings.AddObject("Two",Button2);
Вот за этими объектами пользователь должен следить сам, никакого автоматического удаления не происходит.
← →
новичёк (2007-09-12 13:35) [8]
> Германн © (12.09.07 01:43) [3]
>
> Вот ещё один пример путаницы в терминологии. TStrings не
> абстрактный класс, а базовый...
>
Так и думал, что кто-нибудь придерется. Под абстрактным я имел ввиду класс, имеющий абстрактные методы, создавать экземпляры которого не имеет смысла.
Кстати в .NET так и делается. Класс имеющий абстрактные методы сам помечается abstract. И экземпляры его не создаются вообще.
> icWasya © (12.09.07 09:32) [7]
>
> Кроме строк, в TStrings можно хранить и указатели на какие-
> то объекты.
Не путай человека. В TMemo объекты хранят только извращенцы.
← →
Kolan © (2007-09-12 14:10) [9]> Оговорка: впрочем, возможно, что в новейших версиях Делфи
> появились и абстрактные классы как таковые, тут я пас.
Оговорка: впрочем, в новейших версиях Делфи появились и абстрактные классы как таковые.
:)
> или динамическую память надо освободить
Ничего не надо освобождать самому, память освободится можешь не беспокоится…
← →
Германн © (2007-09-12 14:15) [10]
> Kolan © (12.09.07 14:10) [9]
> Ничего не надо освобождать самому, память освободится можешь
> не беспокоится…
>
Троечник :(
← →
Kolan © (2007-09-12 14:27) [11]> Троечник :(
Что ты строки в memo каким-то образом освобождаешь вручную?
Что если я напишу:
S := "sdfs";
Memo1.Lines.Add(S);
А потом
Memo1.Lines.Clear;
Мне надо беспокоится об утечках?
← →
Германн © (2007-09-12 14:31) [12]
> Kolan © (12.09.07 14:27) [11]
>
> > Троечник :(
>
> Что ты строки в memo каким-то образом освобождаешь вручную?
>
>
А причем тут строки в мемо?
Ты же сказал
> > или динамическую память надо освободить
>
> Ничего не надо освобождать самому, память освободится можешь
> не беспокоится…
>
← →
Kolan © (2007-09-12 15:39) [13]> А причем тут строки в мемо?
Смотри внимательно пост автора:
> Я в основном говорил о TStrings который в TMemo Вопрос был
> в том при уничтожении строк ну напр Memo.Clear или Memo.Lines.Clear
> при исчезнавении указателя исчезнет сама строковая переменная
> или динамическую память надо освободить Turbo Vision при
> удалении строки надо выполнить DisposeStr Нужна ли такая
> команда в TStrings
← →
Ega23 © (2007-09-12 15:57) [14]
> Джо © (12.09.07 02:40) [4]
>
> Собственно, «абстрактными классами» в Делфи можно назвать
> разве что интерфейсы. Ну, или называть таковыми классы,
> имеющие ИСКЛЮЧИТЕЛЬНО ТОЛЬКО абстрактные методы.
А разве абстрактым классом не называется тот класс, у которого есть ХОТЯ БЫ ОДИН свой абстрактный метод и не перекрытый от предка?
В Сях и Джаве, если мне память не изменяет, экземпляр такого класса создать нельзя. В Delphi - иногда можно, но может к abstract error привести
← →
Игорь Шевченко © (2007-09-12 16:32) [15]Ega23 © (12.09.07 15:57) [14]
в Delphi нет понятия абстрактного класса. Есть понятие абстрактного метода.
Хотя, может в 2006 уже есть и абстрактный класс - надо знания обновить.
← →
Ega23 © (2007-09-12 16:42) [16]
> в Delphi нет понятия абстрактного класса. Есть понятие абстрактного
> метода.
Ну, я имел ввиду не конкретно в Delphi, а с точки зрения теории ООП вообще.
← →
clickmaker © (2007-09-12 16:49) [17]
> [15] Игорь Шевченко © (12.09.07 16:32)
> Ega23 © (12.09.07 15:57) [14]
>
> в Delphi нет понятия абстрактного класса
его нигде нет. Ни у нас, ни за рубежом.
таковым класс делает наличие хоть одного абстрактного метода
← →
clickmaker © (2007-09-12 16:51) [18]хотя в VB.NET ввели MustInherit
как замену сишному и сишарпному = 0 после объявления метода
← →
clickmaker © (2007-09-12 16:59) [19]а вообще нет... есть в плюсах и шарпе кейворд abstract для классов
хм... как-то оно ни разу не нужно было.. ну да ладно, пусть будет :)
← →
Kolan © (2007-09-12 17:00) [20]> Хотя, может в 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 17:04) [21]
> А создать экземпляр TStrings мне никто не мешает.
- Рабинович здесь живет?
- Нет
- А вы кто?
- Рабинович
- А почему говорите, что нет
- Так разве ж это жизнь...
← →
Anatoly Podgoretsky © (2007-09-12 17:06) [22]> Kolan (12.09.2007 17:00:20) [20]
Моя просветительская деятельность начинает приносить плоды.
А насчет того, что негде использовать абстрактный класс, еще как где - он является шаблоном для построения других классов.
← →
Ega23 © (2007-09-12 17:17) [23]Кстати, именно из-за "косяка" Delphi по возможности создания класса с абстрактным методом, почти перестал ими пользоваться. В базовом классе просто virtual ставлю с пустым обработчиком (типа, как в базовом TDataLink)
уже несколько раз накалывался на abstract error. Причём даже так: у всех потомков перекрыл абстрактный метод, всё нормально, ничего не забыл. Но по Complete Class at cursor эта сволочь inherited ставит по-умолчанию. А вот этот inherited не всегда вспоминаешь убрать.
← →
Kolan © (2007-09-12 17:52) [24]> А насчет того, что негде использовать абстрактный класс,
> еще как где
Я что-то не найду где я говорил что его нельзя использовать… Я говорю, что в теории его нельзя инстанцировать.
А вот этот 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? — Ты что, нет конечно…
← →
Anatoly Podgoretsky © (2007-09-12 19:10) [25]> Kolan (12.09.2007 17:52:24) [24]
> Я что-то не найду где я говорил что его нельзя использовать… Я говорю, что в теории его нельзя инстанцировать.
Нельзя и именно поэтому он абстрактный.
← →
Palladin © (2007-09-12 19:14) [26]мда... формализацию абстрактного класса в студию пожалуйста...
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;
← →
Palladin © (2007-09-12 19:15) [27]ну и конечно выводить предупреждение
← →
Kolan © (2007-09-12 21:47) [28]> а наличие ключевого слова abstract лишь позволяет не писать
Давай отделим теорию от Delphi. В Delphi не толькоabstract
(для классов) работает не верно(не так как в справке и в теории), еще иprivate
сprotected
«шалят».
мда… формализацию абстрактного класса в студию пожалуйста…
В смысле? Тебе привести ссылку откуда я вязл что абстрактный класс — это класс который нельзя инстанцировать?
> а наличие ключевого слова abstract лишь позволяет не писать
Опять же ключевое слово это применяется к методам и к классам, ты про что?
← →
SKIPtr (2007-09-12 22:18) [29]Спасибо что в горячей дискусии дали ответ на вопрос
В Turbo Pascal абстракта не было так и делали пустой метод наверно хотели упростить а вон как повернулась
Щас не понятно только одно TStrings абстракт и пользоваться им можно только через потомка но Memo им ползуется напрямую или TStrings несколько вариантов
← →
palva © (2007-09-12 22:46) [30]> Memo им ползуется напрямую или TStrings несколько вариантов
Memo использует для хранения строк поле какого-то типа, порожденного от TStrings, но property Lines работающее с этим полем имеет тип TStrings. Это не криминал.
← →
palva © (2007-09-12 22:49) [31]Ага! TMemoStrings называется. Попробуйте следующий код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(Memo1.Lines.ClassName)
end;
← →
SKIPtr (2007-09-13 04:49) [32]АГА пишут в книгах одно а там совсем другое
← →
Kolan © (2007-09-13 09:37) [33]> АГА пишут в книгах одно а там совсем другое
Чтобы разобраться вам надо понять что такое полиморфизм. Про это написано в любой книге по ООП.
Как только разберётесь поймете что то, что там(в мемо) объявлен класс TStrings еще не значит что экземпляр именно этого класса на самом деле создан.
← →
palva © (2007-09-13 11:45) [34]> АГА пишут в книгах одно а там совсем другое
Обижаешь, начальник. Все по-честному. Цитирую строку из
C:\Program Files\Borland\Delphi7\Source\Vcl\StdCtrls.pas
property Lines: TStrings read FLines write SetLines;
Это свойство вводится в TCustomMemo - предке TMemo. Оно имеет тип TStrings.
Так что создать TStrings может быть и нельзя, но можно создать его потомка и возвратить его в свойстве или переменной типа TStrings.
А если про книжки, то в большинстве из них пишут рецепты, как надо писать, чтобы работало. Если вас интересует подноготная, то читайте другие книжки или исходники.
← →
SKIPtr (2007-09-13 19:52) [35]Спасибо palva © (13.09.07 11:45) [34] напомнили мне что такое полиморфизм а то давно с этим не сталкивался
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.043 c