Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]

> Оговорка: впрочем, возможно, что в новейших версиях Делфи
> появились и абстрактные классы как таковые, тут я пас.

Оговорка: впрочем, в новейших версиях Делфи появились и абстрактные классы как таковые.
:)


> или динамическую память надо освободить

Ничего не надо освобождать самому, память освободится можешь не беспокоится&#133


 
Германн ©   (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;


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

таковым класс делает наличие хоть одного абстрактного метода
А где это такое написано? Абстрактный класс это класс экземпляр которого нельзя создать. А создать экземпляр 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]

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

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

А вот этот 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? — Ты что, нет конечно&#133


 
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 «шалят».

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


> а наличие ключевого слова 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
1-1185553239
ins
2007-07-27 20:20
2007.10.14
TWebBrowser и правая кнопка мыши


15-1190012820
Layner
2007-09-17 11:07
2007.10.14
Владельцы MS Vista! Запустите прогу Utils, отработает ли у вас


3-1181203458
ina65
2007-06-07 12:04
2007.10.14
базы данных


15-1189770684
NeedForHelpAlways
2007-09-14 15:51
2007.10.14
Как сделать словарь терминов?


2-1190379982
Kolan
2007-09-21 17:06
2007.10.14
Почему Free не делает nil объекту?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский