Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
ВнизПроблемма с указателем ... Не могу получить объект по ссылке Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c