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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 377

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

Здравствуйте! Продолжая вопрос 373 напишу новый. У меня есть три класса. Класс TDocument содержит в себе массив "объектных векторов" - ObjectsVector.
Итак первый ворос как мне получить колисчество этих "объектных векторов", таким образом:
Document.ObjectsVectors.Count, чтобы одновремено можно было обратиться к каждому "объектному вектору"?: Document.ObjectsVectors := TObjectsVector.create (Document.ObjectsVectors.Add)
И одновременно с этим получить количество линий в "объектном векторе"?:
Document.ObjectsVectors.Count
Заметьте, что я использую список линий, т.е. мне нужно реализовать только "интерфейс" к каждой линии:
Document.ObjectsVectors.VectorPoint.Count (получить количество точек в линии в i объектном векторе)
И последнее, получить доступ и изменить точку в линии:
Document.ObjectsVectors.VectorPoint[j].x := X
Document.ObjectsVectors.VectorPoint[j].y := Y
Я пробовал реализовывать через наследование, используя абстрактные методы, ничего не получилось, уже главу про класса прочил не один раз, не могу понять как это реализовано, например в tmemo (memo.Lines.count, memo.lines := s).
Может кто-нибудь объяснить как это реализуется?

Приложение:
  1. type
  2. PVector = ^TVector;
  3. TVector = packed record
  4. n: Word;
  5. pt: TArrPoint;
  6. C: TArrSingle;
  7. Sled: PVector;
  8. id: word;
  9. end;
  10. //-------------------------------------------------------------//
  11. TVectorPoint = class
  12. private
  13. //
  14. protected
  15. function GetCount(): word; virtual; abstract;
  16. function GetPoint(Index: word): TPoint; virtual; abstract;
  17. procedure SetPoint(Index: word; NewPoint: TPoint); virtual; abstract;
  18. public
  19. procedure Add(Point: TPoint); virtual; abstract;
  20. procedure Del(Index: word); virtual; abstract;
  21. procedure Clear(); virtual; abstract;
  22. property Count: word read GetCount;
  23. property Point[Index: word]: TPoint read GetPoint write SetPoint;
  24. end;
  25. //-------------------------------------------------------------//
  26. TObjectVector = class
  27. private
  28. FRoot, FLast: Pointer;
  29. FVectors: PVector;
  30. FCount: longword;
  31. FName: string;
  32. FVectorPoint: TVectorPoint;
  33. protected
  34.  
  35. function GetCount(): word; override;
  36. function GetPoint(Index: word): TPoint; override;
  37. procedure SetPoint(Index: word; NewPoint: TPoint); override;
  38.  
  39. public
  40. constructor Create();
  41. destructor Destroy(); override;
  42.  
  43. procedure AddVector(Point: TPoint);
  44. procedure DelVector(index: word);
  45.  
  46. procedure AddPoint(index: word; Point: TPoint);
  47. //procedure DelPoint(index: word);
  48. procedure Paint(Canvas: TCanvas);
  49.  
  50. //------------------------------//
  51. procedure Add(Point: TPoint); override;
  52. procedure Del(Index: word); override;
  53. procedure Clear(); override;
  54.  
  55. property VectorPoint: TVectorPoint read FVectorPoint;
  56. end;
  57.  
  58. TObjectsVector = array of TObjectVector;
  59.  
  60. TDocument = class
  61. private
  62. ObjectsVector: TObjectsVector;
  63. Count: word;
  64. //NetSize: word;
  65. protected
  66.  
  67. public
  68. constructor Create();
  69. destructor Destroy(); override;
  70.  
  71. procedure AddObject();
  72. procedure DelObject(index: word);
  73. //procedure AddPoint
  74.  
  75. procedure Paint(Canvas: TCanvas);
  76. end;
  77.  


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

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

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

У вас в голове откровенно каша. Вы хотите использовать абстракный класс, не реализовав эти методы.
К примеру, у вас ест
procedure Add(Point: TPoint); virtual; abstract;
Этот метод вызвать нельзя.!
Его можно вызвать только в наследнике, который его реализует.
Во вторых, непонятно ваше желания использовать списки. Это даст медленый произвольный доступ к элементам и подсчёт общего количества элементов.
Также мне непонятен метод procedure AddObject();
Куда он добавляет? Что добавляет?
Назначение TVectorPoint, которому нужно реализовать заданую функциональность, вообще стоит боком Его назначение для меня загадка. Он как 5 колесо для воза. Ещё раз скажу, у вас большие проблемы с проектированием классов.
К тому же я не понимаю разницу между методами
procedure AddVector(Point: TPoint);
procedure AddPoint(index: word; Point: TPoint);
А также фунциональность, которая на них положена.
Нужно перепроектировать классы.
А потом реализовать методы.

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

Комментарий к оценке: Да я все перепробовал, этот код - уже переделывался много раз, а также я прекрасно знаю, что абстрактные методы нельзя вызывать, я лишь пытался его перекрыть в потомке. Используя списки - я выгрываю в добавлении, удалении в середину элементов. Посчет элементов производиться заранее. Вот я этим и занимаюсь: пытаюсь спроектировать удобный и защищенный класс. Вообщем я задал конкретный вопрос! Я не прошу писать здоровые классы, мне нужно всего лишь небольшой примерчик, полностью поясняющий суть.

Ответ #2. Отвечает эксперт: min@y™

Набросал ОЧЕНЬ сильно упрощённый примерчик, буквально на коленке. Это не руководство к действию, но я работаю уже много лет именно так. См. приложение.

Приложение:
  1.  
  2. interface
  3.  
  4. type
  5.  
  6. TLine = class
  7. private
  8. FBeginPt,
  9. FEndPt: TPoint;
  10. public
  11. constructor Create(const ABegin, AEnd: TPoint);
  12. property BeginPt: TPoint read FBeginPt write FBeginPt;
  13. property EndPt: TPoint read FEndPt write FEndPt;
  14. end;
  15.  
  16.  
  17. TLineList = class(TList)
  18. public
  19. function AddLine(const ABegin, AEnd: TPoint): TLine;
  20. end;
  21.  
  22. {
  23.  
  24.  
  25. TLineList.Count;
  26.  
  27.  
  28. TLineList.Move;
  29.  
  30. }
  31.  
  32. implementation
  33.  
  34. constructor TLine.Create(const ABegin, AEnd: TPoint);
  35. begin
  36. inherited;
  37. FBeginPt:= ABegin;
  38. FEndPt:= AEnd;
  39. end;
  40.  
  41. function AddLine(const ABegin, AEnd: TPoint): TLine;
  42. begin
  43. Result:= TLine.Create(ABegin, AEnd);
  44. end;


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 5 марта 2007, 09:11
Оценка за ответ: 4


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

Всего сообщений: 2; последнее сообщение — 5 марта 2007, 09:20; участников в обсуждении: 2.
Вадим К

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

Ваши классы ужасно спроектированы. Мне не совсем понятны некоторые методы. Если вы хотите получить более подробный коментарий - стучите в асю.
Примерчик - по данному коду его сочинить нельзя, так как классы просто нерабочие. Хотя я может немного ощибаюсь, так как я не видел реализаций методов. Но я не видел наследников.
А оценка. Лучше бы вы не ставили её, так как это оценка вам, а не мне.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 5 марта 2007, 09:20 [#2]:

СОРРИ, так как писал на коленке, забыл кое-что:
function TLineList.AddLine(const ABegin, AEnd: TPoint): TLine;
begin
Result:= TLine.Create(ABegin, AEnd);
Self.Add(Pointer(Result));
end;

{
Доступ к элементам:
var
BP: TPoint;
begin
BP:= TLine(TLineList[Index]).BeginPt;
end;
}
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

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

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