Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.04;
Скачать: CL | DM;

Вниз

Проблемма с указателем ... Не могу получить объект по ссылке   Найти похожие ветки 

 
Dr. Well   (2003-08-25 12:15) [0]

Доброго времени суток, Мастера!!!

Много слышал, что указатели решают многие проблеммы простого программиста (только за пивом не ходят)...
Решил попробовать - все ОЧЕНЬ красиво, но не работает....

Может, кому не в падлу разобраться в проблемме, буду очень признателен.

я хотел реализовать следующую структуру:
Проект (Project)
|-Узлы (Node)
| |-Элементы (Element)
| | |-Опорные точки (ControlPoint)
| |-Провода (Wire)

На каждом уровне я хочу иметь доступ к любому объекту любого уровня

********************************************************************

type
TElementState = Byte;

TControlPoint = class (TObject)
cpID : Integer;
cpPosition : TPoint;
cpState : TElementState; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
cpElement : ^TObject; //@вот этот елемент я не могу отловить@
constructor Create(aID : Integer; aPosition : TPoint; aElement : TObject; aState : TElementState);
end; // TControlPoint

TElementType = Byte;

TElement = class (TObject)
eID : Integer;
eName : String[25];
eType : TElementType;
eImage : TImage;
eState : TElementState;
eControlPoints : array of TControlPoint;
eCPCount : Integer;
eNode : ^TObject;
// --- Semantic ---
eTime : Real;
// ===
constructor Create(aID : Integer; aName : String; aType : TElementType; aPosition : TPoint;
aState : TELementState; aNode : TObject; aParent : TWinControl);
procedure RePaint;
destructor Destroy;
end; // TElement

TWire = class (TObject)
wID : Integer;
wStartCP : ^TControlPoint;
wEndCP : ^TControlPoint;
wNode : ^TObject;
wPoints : array of TPoint;
constructor Create(aID : Integer; aStart, aEnd : TControlPoint; aNode : TObject);
procedure RePaint;
destructor Destroy;
end; // TWire

implementation

constructor TControlPoint.Create(aID: Integer; aPosition: TPoint;
aElement: TObject; aState: TElementState);
begin
cpID := aID;
cpPosition := aPosition; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
cpElement := @aElement; //@здесь я засовываю в указатель адрес элемента@
cpState := aState; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
end;

constructor TElement.Create(aID: Integer; aName: String; aType: TElementType; aPosition: TPoint;
aState: TELementState; aNode: TObject; aParent : TWinControl);
begin
eID := aID;
eName := aName;
eType := aType;
// --- Create Image ---
eImage := TImage.Create(aParent);
eImage.Parent := aParent;
eImage.Left := aPosition.X;
eImage.Top := aPosition.Y;
eImage.Tag:=eID;
eImage.Transparent := True;
// ===
eState := aState;
eNode := @aNode;
// --- Create Control Points ---
eControlPoints := nil;
eImage.Width:=40; //@@@
eImage.Height:=40; //@@@
SetLength(eControlPoints,3);//________________________________________ ___________@@@@_(Может, не SELF?????__
eControlPoints[0] := TControlPoint.Create(11,Point(Ofset,Round(eImage.Height/4)),Self,esIna ctive);
eControlPoints[1] := TControlPoint.Create(12,Point(Ofset,Round(eImage.Height*3/4)),Self,esI nactive);
eControlPoints[2] := TControlPoint.Create(13,Point(eImage.Width-Ofset,Round(eImage.Height/2 )),Self,esInactive);
end;

constructor TWire.Create(aID : Integer; aStart, aEnd : TControlPoint; aNode : TObject);
begin
wID := aID;
wNode := @aNode;
wStartCP := @aStart;
wEndCP := @aEnd;
wPoints := nil;
RePaint;
end;

procedure TWire.RePaint;
var
eX, eY : Word;
CP : TControlPoint;
El : TElement;
begin
CP := (wStartCP^ as TControlPoint); // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
El := (CP.cpElement^ as TElement); // @!!!!! в этой строке Access Violation at address XXXXXX ...@
eX:=El.eImage.Left; // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
eY:=El.eImage.Top;
(wNode^ as TNode).nCanvas.MoveTo(eX+wStartCP^.cpPosition.X,eY+wStartCP^.cpPositio n.Y);
CP := (wEndCP^ as TControlPoint);
El := (CP.cpElement^ as TElement);
eX:=El.eImage.Left;
eY:=El.eImage.Top;
(wNode^ as TNode).nCanvas.LineTo(eX+wEndCP^.cpPosition.X,eY+wEndCP^.cpPosition.Y) ;
end;

******************************************************

В данном случае я не могу получить доступ из Опорной точки к содержащему ее элементу...

Жду помощи...


 
Skier ©   (2003-08-25 12:19) [1]

cpElement : ^TObject; -> cpElement : TObject; (это для начала)
В соответствии с этим исправь текст программы.


 
Юрий Федоров ©   (2003-08-25 12:22) [2]

cpElement : ^TObject - это указатель на указатель на объект
cpElement : TObject - это указатель на объект
Думаю, тебе все-таки нужен указатель на объект


 
Dr. Well   (2003-08-25 12:24) [3]

Не понял, так ведь тогда это не будет указателем. И мне придется тягать его за собой всю дорогу, обновлять постоянно перед каждым обращением...
Мне нужна именно ссылка (работающая)


 
Skier ©   (2003-08-25 12:27) [4]

>Dr. Well (25.08.03 12:24) [3]
cpElement : TObject - это и есть (типизированный) указатель на объект (4 байта)

Видимо ты путаешь Pascal с Object Pascal (он же Delphi Language)


 
Erik Ivanov   (2003-08-25 12:30) [5]

Думаю, что стоит подумать о количестве элементов. Сколько их будет. И нужен ли последовательный перебор отсортированых обектов. Я для таких случеев использовал масив + Record. Хотя можно и все указатели на обекты запихоть в масив. Все зависит от задачи.
P.S.
"Много слышал, что указатели решают многие проблеммы простого программиста"
И самое первое их этих "решений" Access violation! Если это возможно то лучше неиспользовать или использовать как можно меньше и осторожнее.


 
Юрий Федоров ©   (2003-08-25 12:31) [6]

cpElement : TObject; ->
SizeOf(cpElement) = 4 ->
cpElement - это типизированный поинтер.
...
cpElement := @aElement; //@здесь я засовываю в указатель адрес элемента@...
А стековая переменная aElement умирает по выходу из процедуры...
Ты запомнил указатель вникуда


 
Dr. Well   (2003-08-25 12:31) [7]

от оно как...
ну что ж, раз два человека одновременно сказали одно и то же, надо будет пробовать...
Спасибо огромное, приду домой, обязательно исправлю и пропробую.

а что мне вот здесь писать???

constructor TControlPoint.Create(aID: Integer; aPosition: TPoint;
aElement: TObject; aState: TElementState);
begin
cpID := aID;
cpPosition := aPosition;
!!!????? cpElement := @aElement; //@здесь я засовываю в указатель адрес элемента@
cpState := aState; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
end;


 
Юрий Федоров ©   (2003-08-25 12:33) [8]

cpElement := aElement;


 
Dr. Well   (2003-08-25 12:39) [9]

СПАСИБО всем БОЛЬШОЕ...
Пойду исправлять... Если не получится - приду завтра...
Всем удачи!!!



Страницы: 1 вся ветка

Текущий архив: 2003.09.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-10967
SergP
2003-08-15 08:07
2003.09.04
У меня этот форум не работает. Что делать?


1-10701
ddghy
2003-08-24 17:57
2003.09.04
Компонент в Delphi для работы с Excel?


1-10750
Эл
2003-08-24 19:26
2003.09.04
Создание своих визуальных компонентов


1-10714
Micah'GF
2003-08-20 10:58
2003.09.04
Переменная в классе


6-10863
Hamelion
2003-06-23 22:19
2003.09.04
Как через IdFTP скопировать файл на Ftp сервер???