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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2012, 07:36   #1
linuxoid
 
Регистрация: 08.05.2009
Сообщений: 4
По умолчанию Работа с объектами в RichEdit

Добрый день.

Пытаюсь добавить объект в компонент RichEdit, а потом и получить доступ к этому объекту с помощью следующего кода:

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  Word: TWord;
begin
  RichEdit1.Lines.Clear;
  Word := TWord.Create(Edit1.Text);
  RichEdit1.Lines.AddObject('222',Word);
  Label2.Caption := TWord(RichEdit1.Lines.Objects[0]).FWord;
end;
Но при выполнении мне выдается сообщение об ошибке:

Access violation at address ... in module 'Project1.exe'

Подскажите пжл - что делаю не так? Спасибо.
linuxoid вне форума Ответить с цитированием
Старый 23.03.2012, 10:07   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
ShowMessage(IntToStr(RichEdit1.Lines.AddObject('222',Word)));
индекс точно 0?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.03.2012, 13:55   #3
linuxoid
 
Регистрация: 08.05.2009
Сообщений: 4
По умолчанию

Да точно ноль. Проверил через ShowMessage и показалось окно с индексом 0, а потом все равно ошибка
linuxoid вне форума Ответить с цитированием
Старый 25.03.2012, 06:53   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Беда в том, что класс TStrings "абстрактный" и применяют его только как класс-заготовку. В нем метод AddObject виртуальный и ничего не делает (отсюда у автора и ошибка - Lines.Objects[index] всегда есть nil), а метод Add вообще абстрактный. Все классы, которым нужен TStrings обязательно его наследуют и переопределяют все или часть его методов.

И TMemo, и дельфийская надстройка TRichEdit над виндовым RichEdit - переопределяют этот класс в "в свою пользу". А в этом классе уже нет места ссылкам на "объекты".

Давненько, однако, тоже попал в сложное положение, когда надо было иметь на каждую строку RichEdit'а по объекту и пришлось создавать TStringList и орудовать им в части объектов, синхронизируя действия со строками и в обоих объектах одновременно .

P.S. А то что Delphi показывает в хинте при наводке мыши на слово Lines: "Classes.TStrings", так это на его совести .
Прик вне форума Ответить с цитированием
Старый 26.03.2012, 11:55   #5
linuxoid
 
Регистрация: 08.05.2009
Сообщений: 4
По умолчанию

Интересно. Спасибо. Проверил ради интереса на объекте ListBox - и там это работает без проблем. Другими словами вот так все отлично:

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  Word: TWord;
begin
  Word := TWord.Create(Edit1.Text);
  ListBox1.Items.AddObject('222',Word);
  Label2.Caption := TWord(ListBox1.Items.Objects[0]).FWord;
end;
linuxoid вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с объектами Word в C++ Ладушка Общие вопросы C/C++ 3 22.09.2015 16:51
Работа с динамическими объектами medved6216 Общие вопросы Delphi 3 17.11.2011 19:08
Работа с объектами dr.Chas Общие вопросы Delphi 1 25.05.2010 17:45
Работа с классами и объектами Shavminator Общие вопросы Delphi 7 18.12.2009 04:11
Работа с объектами NeXuLoN Помощь студентам 6 03.12.2009 07:45