Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 373

/ вопрос открыт /

Здравствуйте! Мне необходимо написать два класса, один - класс "линия", второй - класс "объект". Класс объект состоит из массива линий. Вот задача заключается чтобы обеспечить безопасный доступ к каждому экземпляру линии через класс объект. Например, обращение должно быть примерно таким как идет обращение к строке в компоненте Memo:
Memo.Lines.Add
Memo.Lines := 'string'
i := Memo.Lines.Count
Memo.Lines.Clear
Т.е. мне нужен простенький примерчик, как релизовать подобное обращение...

SMaks Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SMaks (статус: 1-ый класс)
Вопрос отправлен: 4 марта 2007, 00:17
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Я надеюсь, что объект линия вы в состоянии написать. А вот что бы написать объект, который будет их "содержать" воспользуемся стандарным классов TList (модуль Classes) или TObjectList (Contrls). Во втором случае вам не прийдётся думать о удалении объектов линия. Тоесть вам просто нужно написать наследника. В приложении есть наследник на базе TList
При этом я предполагаю, что клас TLine уже написан

Приложение:
  1. unit TypedList;
  2.  
  3. type
  4. TArrayLine = class (TList)
  5. private
  6. function GetItems(AIndex: Integer): TLine;
  7. procedure SetItems(AIndex: Integer; AItem: TLine);
  8. protected
  9. public
  10. constructor Create;
  11. destructor Destroy; override;
  12. procedure Clear; override;
  13. function Add(AItem: TLine): Integer;
  14. function Extract(AItem: TLine): TLine;
  15. function First: TLine;
  16. function IndexOf(AItem: TLine): Integer;
  17. procedure Insert(AIndex: Integer; AItem: TLine);
  18. function Last: TLine;
  19. function Remove(AItem: TLine): Integer;
  20. property Items[AIndex: Integer]: TLine read GetItems write SetItems; default;
  21. end;
  22.  
  23. implementation
  24.  
  25. constructor TArrayLine.Create;
  26. begin
  27. inherited Create;
  28. end;
  29.  
  30. destructor TArrayLine.Destroy;
  31. begin
  32. Clear;
  33. inherited Destroy;
  34. end;
  35.  
  36. procedure TArrayLine.Clear;
  37. var
  38. I: Integer;
  39. begin
  40. for I := Count - 1 downto 0 do begin
  41. Items[I].Free;
  42. Delete(I);
  43. end;
  44.  
  45. inherited Clear;
  46. end;
  47.  
  48. function TArrayLine.Add(AItem: TLine): Integer;
  49. begin
  50. Result := inherited Add(Pointer(AItem));
  51. end;
  52.  
  53. function TArrayLine.Extract(AItem: TLine): TLine;
  54. begin
  55. Result := TLine(inherited Extract(AItem));
  56. end;
  57.  
  58. function TArrayLine.First: TLine;
  59. begin
  60. Result := TLine(inherited First);
  61. end;
  62.  
  63. function TArrayLine.IndexOf(AItem: TLine): Integer;
  64. begin
  65. Result := inherited IndexOf(Pointer(AItem));
  66. end;
  67.  
  68. procedure TArrayLine.Insert(AIndex: Integer; AItem: TLine);
  69. begin
  70. inherited Insert(AIndex, Pointer(AItem));
  71. end;
  72.  
  73. function TArrayLine.Last: TLine;
  74. begin
  75. Result := TLine(inherited Last);
  76. end;
  77.  
  78. function TArrayLine.Remove(AItem: TLine): Integer;
  79. begin
  80. Result := inherited Remove(Pointer(AItem));
  81. end;
  82.  
  83. function TArrayLine.GetItems(AIndex: Integer): TLine;
  84. begin
  85. Result := TLine(inherited Items[AIndex]);
  86. end;
  87.  
  88. procedure TArrayLine.SetItems(AIndex: Integer; AItem: TLine);
  89. begin
  90. inherited Items[AIndex] := Pointer(AItem);
  91. end;
  92.  
  93. end.


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 марта 2007, 00:57
Оценка за ответ: 5

Комментарий к оценке: Я просил написать два новых класса, т.е. не использовать стандартные.
В данно примере я не могу получить количество линий таким вызовом:
ArrayLine.Items.Count
и добавить элемент:
ArrayLine.Items.Add

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 4 марта 2007, 16:55; участников в обсуждении: 1.
Вадим К

Вадим К (статус: Академик), 4 марта 2007, 16:55 [#1]:

Вы пишете
>>таким вызовом: ArrayLine.Items.Count
Как это не можете? А вы пробывали? То,что эго нет в объявлении этого класса, не означает что его нет. Курим тему о наследовании и просвещаемся
>> и добавить элемент:ArrayLine.Items.Add
Ну и народ пошел
есть метод-функция
function Add(AItem: TLine): Integer;
которая может добавлять. Но вы наверное хотели вот так
function Add: TLine;
Ну так добавте и его и напишите вот такую реализацию
function TArrayLine.Add: TLine;
var l:TLine;
begin
l:=TLine.create;
Add(l);
result:=l;
end;
И всё. Почему я не написал такую реализацию? А вы просили именно такую?
Вы написали просто метод Add Как у мемо. Вот я его таким и реализовал. А то, что вы написали в замечании соответствует TViewList.Item. Так и надо писать. Телепаты у меня в отпуске на Канарах.

Причин неиспользования стандартных классов я вижу два.
- Вы пишете маленькое приложение и каждый байт у вас на вем золота. В таком случае открываем модуль Classes, копипастим класс TList. Приводить его реализацию - не вижу смысла.
-Вторая причина - просто нехотенье. Тут я беспомощен
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:31
Выполнено за 0.02 сек.