Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-10905
Zhenka
2003-08-12 09:11
2003.09.04
Помогите разобраться с файлами


4-11016
АТ
2003-07-04 13:03
2003.09.04
Помогите с синтаксисом сообщения WM_SETTEXT


14-10874
Axis_of_Evil
2003-08-14 16:23
2003.09.04
---|Ветка была без названия|---


1-10821
Mazer
2003-08-21 19:01
2003.09.04
Перенос процедур главного модуля в несколько других...


3-10641
DarkBlade
2003-08-11 22:53
2003.09.04
проблема с подключением базы данных к CBuilder





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский