|
Вопрос # 373/ вопрос открыт / |
|
Здравствуйте! Мне необходимо написать два класса, один - класс "линия", второй - класс "объект". Класс объект состоит из массива линий. Вот задача заключается чтобы обеспечить безопасный доступ к каждому экземпляру линии через класс объект. Например, обращение должно быть примерно таким как идет обращение к строке в компоненте Memo:
Memo.Lines.Add
Memo.Lines := 'string'
i := Memo.Lines.Count
Memo.Lines.Clear
Т.е. мне нужен простенький примерчик, как релизовать подобное обращение...
 |
Вопрос задал: SMaks (статус: 1-ый класс)
Вопрос отправлен: 4 марта 2007, 00:17
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Я надеюсь, что объект линия вы в состоянии написать. А вот что бы написать объект, который будет их "содержать" воспользуемся стандарным классов TList (модуль Classes) или TObjectList (Contrls). Во втором случае вам не прийдётся думать о удалении объектов линия. Тоесть вам просто нужно написать наследника. В приложении есть наследник на базе TList
При этом я предполагаю, что клас TLine уже написан
Приложение: Переключить в обычный режим- unit TypedList;
-
- type
- TArrayLine = class (TList)
- private
- function GetItems(AIndex: Integer): TLine;
- procedure SetItems(AIndex: Integer; AItem: TLine);
- protected
- public
- constructor Create;
- destructor Destroy; override;
- procedure Clear; override;
- function Add(AItem: TLine): Integer;
- function Extract(AItem: TLine): TLine;
- function First: TLine;
- function IndexOf(AItem: TLine): Integer;
- procedure Insert(AIndex: Integer; AItem: TLine);
- function Last: TLine;
- function Remove(AItem: TLine): Integer;
- property Items[AIndex: Integer]: TLine read GetItems write SetItems; default;
- end;
-
- implementation
-
- constructor TArrayLine.Create;
- begin
- inherited Create;
- end;
-
- destructor TArrayLine.Destroy;
- begin
- Clear;
- inherited Destroy;
- end;
-
- procedure TArrayLine.Clear;
- var
- I: Integer;
- begin
- for I := Count - 1 downto 0 do begin
- Items[I].Free;
- Delete(I);
- end;
-
- inherited Clear;
- end;
-
- function TArrayLine.Add(AItem: TLine): Integer;
- begin
- Result := inherited Add(Pointer(AItem));
- end;
-
- function TArrayLine.Extract(AItem: TLine): TLine;
- begin
- Result := TLine(inherited Extract(AItem));
- end;
-
- function TArrayLine.First: TLine;
- begin
- Result := TLine(inherited First);
- end;
-
- function TArrayLine.IndexOf(AItem: TLine): Integer;
- begin
- Result := inherited IndexOf(Pointer(AItem));
- end;
-
- procedure TArrayLine.Insert(AIndex: Integer; AItem: TLine);
- begin
- inherited Insert(AIndex, Pointer(AItem));
- end;
-
- function TArrayLine.Last: TLine;
- begin
- Result := TLine(inherited Last);
- end;
-
- function TArrayLine.Remove(AItem: TLine): Integer;
- begin
- Result := inherited Remove(Pointer(AItem));
- end;
-
- function TArrayLine.GetItems(AIndex: Integer): TLine;
- begin
- Result := TLine(inherited Items[AIndex]);
- end;
-
- procedure TArrayLine.SetItems(AIndex: Integer; AItem: TLine);
- begin
- inherited Items[AIndex] := Pointer(AItem);
- end;
-
- 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. Приводить его реализацию - не вижу смысла.
-Вторая причина - просто нехотенье. Тут я беспомощен
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|