Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2008, 19:42   #1
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
Восклицание Проблема с TStrings

Код:
procedure TForm1.FormClick(Sender: TObject);
var
        Strings:TStrings;
begin
        Strings:=TStrings.Create;
        Strings.Add('123'); // сдесь ошибка Abstract Error
        Strings.Clear;
        Strings.Free;
end;
Подскажите в чём дело!
Никки вне форума Ответить с цитированием
Старый 14.02.2008, 19:45   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

TStrings - Это помойму абстрактный класс. надо:
Код:
procedure TForm1.FormClick(Sender: TObject);   
var   
        Strings:TStrings;   
begin   
        Strings:=TStringList.Create;   
        Strings.Add('123'); // сдесь ошибка Abstract Error   
        Strings.Clear;   
        Strings.Free;   
end;
pu4koff вне форума Ответить с цитированием
Старый 14.02.2008, 20:19   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
Хорошо

Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.

Код:
procedure TForm1.FormCreate(Sender: TObject);
var S:TStringList;
begin
S:=TStringList.Create; // Создание переменной
s.Add('123');  // Добавление
s.Sort; // Сортировка
s.SaveToFile('1.txt'); // Сохранение
s.LoadFromFile('2.txt'); // Загрузка
s.Clear; // Очистка
s.Free; // Закрытие переменной
end;
С этим типом у Вас проблем станет меньше.
Тип похож на TStrings (тот что у Memo.TStrings).
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 14.02.2008, 20:47   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.
С этим типом у Вас проблем станет меньше.
Тип похож на TStrings (тот что у Memo.TStrings).
вапще-то суть, что я написал, что ты - одна и та же. TStringList - наследник от TStrings, так что можно описать переменную как TStrings, а уже при создании объекта указывать нужный тип. Тип не похожь на тип Memo, а это тот же самый тип. Это то же самое, что кто-то запомнит собаку как млекопитающее, а кто-то как животное. собака от этого не изменица.
pu4koff вне форума Ответить с цитированием
Старый 15.02.2008, 15:53   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.

С этим типом у Вас проблем станет меньше.
Air, не очень хороший совет. Проблем станет меньше, а работы больше.

В приведенном примере еще ладно, но как думаете, в исходниках VCL почему в методах для объявления параметров используются абстрактные классы ?
alexBlack вне форума Ответить с цитированием
Старый 15.02.2008, 17:10   #6
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
вапще-то суть, что я написал, что ты - одна и та же. TStringList - наследник от TStrings, так что можно описать переменную как TStrings, а уже при создании объекта указывать нужный тип. Тип не похожь на тип Memo, а это тот же самый тип. Это то же самое, что кто-то запомнит собаку как млекопитающее, а кто-то как животное. собака от этого не изменица.
Хм... Мы не о биологии говорим, а разница в том, что TMemo на форме распологать нужно,а TStringList в памяти "помещается".
P.S. а почему тогда ощибку так же пометили "Strings.Add('123'); // сдесь ошибка Abstract Error"?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 15.02.2008, 17:15   #7
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Air, не очень хороший совет. Проблем станет меньше, а работы больше.

В приведенном примере еще ладно, но как думаете, в исходниках VCL почему в методах для объявления параметров используются абстрактные классы ?
М-м...ДА, а Вы глянь те на 1 сообщение, то что от "Никки", там ни каким боком и не сказано про VCL.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 16.02.2008, 15:12   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
М-м...ДА, а Вы глянь те на 1 сообщение, то что от "Никки", там ни каким боком и не сказано про VCL.
Был не понят. Попробую поподробнее. Я не о посте Никки, а о Вашем совете. Сравните ответ Po4koff и Ваш.

Объявлять переменные можно и нужно абстрактного класса. А вот создавать объекты нужно используя только конкретный класс. Советовать использовать всегда только конкретные классы - это ошибка, хотя это безусловно работает. Но это как-раз та самая ошибка проектирования, которая нам так дорого обходится в дальнейшем.

Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше - для каждого конкретного класса.

То есть Ваш пример отличен и, надеюсь, у Никки все получилось, но, не в обиду будет сказано, Вашему совету "использовать всегда тип TStringList, потому что меньше проблем" следовать не нужно.
alexBlack вне форума Ответить с цитированием
Старый 16.02.2008, 16:34   #9
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Был не понят. Попробую поподробнее. Я не о посте Никки, а о Вашем совете. Сравните ответ Po4koff и Ваш.

Объявлять переменные можно и нужно абстрактного класса. А вот создавать объекты нужно используя только конкретный класс. Советовать использовать всегда только конкретные классы - это ошибка, хотя это безусловно работает. Но это как-раз та самая ошибка проектирования, которая нам так дорого обходится в дальнейшем.

Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше - для каждого конкретного класса.

То есть Ваш пример отличен и, надеюсь, у Никки все получилось, но, не в обиду будет сказано, Вашему совету "использовать всегда тип TStringList, потому что меньше проблем" следовать не нужно.
Учитывая приведённые Вами данные, я предположил, что использование одной переменной (скажем "D") тита TStream в разных частях кода можно использовать как TFileStream и TMemoryStream.

К примеру:
Код:
...
var D:TStream;
begin
 D:=TFileStream.Create('C:\1.txt',fmOpenWrite);
 d.Write('sdsdsd',6);
 d.Free;

 d:=TMemoryStream.Create;
 d.LoadFromFile('C:\1.txt');
 d.SaveToFile('C:\2.txt');
 d.Free;
end;
однако не так.

<Цитата>
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше - для каждого конкретного класса.
<Конец цитаты>

Из этого я понял, что можно обьявить один тип TStream, а не описывать каждый, с отдельной переменной.

К примеру:
Код:
Var F:TFileStream;
     M:TMemoryStream;
...
Я Вас правильно понял?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 16.02.2008, 20:21   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Хм... Мы не о биологии говорим, а разница в том, что TMemo на форме распологать нужно,а TStringList в памяти "помещается".
P.S. а почему тогда ощибку так же пометили "Strings.Add('123'); // сдесь ошибка Abstract Error"?
это был может не очень удачный пример разницы между написанным вами и мной. вапще-то TMemo - это контрол, у которого есть свойство типа TStrings, который создаеца как TStringList. Да и по Вашему мемо в памяти не помещается?)
ЗЫ. прост убить забыл камент
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как правильно работать с массивом TStrings Air Общие вопросы Delphi 6 19.12.2007 17:55
проблема с *.chm FAiver Свободное общение 5 28.09.2007 21:01
Функции и TStrings tebeen Паскаль, Turbo Pascal, PascalABC.NET 7 18.09.2007 20:09