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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2009, 15:36   #1
VladimirVB
Форумчанин
 
Аватар для VladimirVB
 
Регистрация: 12.10.2008
Сообщений: 131
Стрелка AddObject

Здравствуйте.
Помогите исправить ошибку. Ошибка показана ниже в тексте.
В TStringList я помещаю строку и в качестве объекта тоже строку.
Не получается извлечь строку, которая была помещена в качестве
объекта.

procedure TForm1.FormCreate(Sender: TObject);
var
t: TStringList;
begin
t := TStringList.Create;

StringGrid1.Cells[0,0] := 'Предметы';
StringGrid1.Cells[1,0] := 'Баллы';

t.AddObject('Физика', TObject('5'));
t.AddObject('Алегбра', TObject('3'));
t.AddObject('Химия', TObject('4'));

t.Sort;
StringGrid1.Cells[0,1] := t.Strings[0];
StringGrid1.Cells[1,1] := String(t.Objects[0]); //ошибка, что делать
end;
VladimirVB вне форума Ответить с цитированием
Старый 26.04.2009, 15:48   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

А здесь не надо помещать строку, баллы - это числа.
Поэтому проблему (в вашем случае) можно решить очень просто:
t.AddObject('Физика', TObject(5));
StringGrid1.Cells[1,1] := IntToStr(Integer(t.Objects[0]));
Скандербег вне форума Ответить с цитированием
Старый 26.04.2009, 20:06   #3
VladimirVB
Форумчанин
 
Аватар для VladimirVB
 
Регистрация: 12.10.2008
Сообщений: 131
По умолчанию

За ответ больше спасибо. Как то про это не подумал. Но все таки возможно ли при помощи AddObject поместить в TStringList строку, а затем ее извлечь.
VladimirVB вне форума Ответить с цитированием
Старый 29.04.2009, 17:38   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Да, можно. Только необходимо помнить, что t.Objects - это список (коллекция) ссылок, не более того. В случае Integer Delphi умеет конвертировать Integer в Pointer (и наоборот), поэтому предыдущий пример с баллами типа Integer работает.
Если нужна строка, то наиболее корректное решение, создать примитивный объект, который содержит только строку и им оперировать.
Код:
type
  TMyStr = class 
    S : String;
  end;

var
  SL : TstringList;

procedure TForm1.Button5Click(Sender: TObject);
var 
  S : TMyStr;
begin
  SL := TstringList.Create;

  S := TMyStr.Create;
  S.S := 'Первая строка в Objects StringList';
  SL.AddObject('Строка1', TMyStr(S));

  S := TMyStr.Create;
  S.S := 'Вторая строка в Objects StringList';
  SL.AddObject('Строка2', TMyStr(S));
end;

//пример доступа к строкам из коллекции
procedure TForm1.Button6Click(Sender: TObject);
begin
  Memo1.Lines.Add(TMyStr(SL.Objects[0]).S);
  Memo1.Lines.Add(TMyStr(SL.Objects[1]).S);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var I : Integer;
begin
  //не забыть пристрелить объекты, созданные ранее и указатели на которые хранятся в StringList
  for I := 0 to SL.Count-1 do 
    if SL.Objects[I] <> nil then
      TMyStr(SL.Objects[I]).Free;
  SL.Free;
end;

Последний раз редактировалось Скандербег; 29.04.2009 в 19:15.
Скандербег вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как прочитать данные, добавленные в Combobox методом AddObject SNUPY Общие вопросы Delphi 2 19.03.2009 20:58