Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Кто-нибудь может объяснить это? [D7]


kull ©   (2003-02-04 15:33:00) 

Почему не компиляется данная конструкция?


procedure TForm1.FormCreate(Sender: TObject);
begin
if Assigned(TreeView1.Items[0].getNextSibling) then Exit;
end;


Выдает: "Variable required"


kull   (2003-02-04 19:26:00) [1]


> Assigned(TreeView1.Items[0].getNextSibling()) - компилится
>
> Assigned(TreeView1.Items[0].getNextSibling()) - нет

поправочка

Assigned(TreeView1.Items[0].getNextSibling()) - компилится
Addr(TreeView1.Items[0].getNextSibling()) - нет


kull   (2003-02-04 19:25:00) [2]


> Игорь Шевченко © (04.02.03 18:19)


Да и к тому же Addr и Assigned это разные вещи.

причем здесь Addr

судя по хелпу:
function Addr(X): Pointer;
function Assigned(const P): Boolean;

Assigned(TreeView1.Items[0].getNextSibling()) - компилится
Assigned(TreeView1.Items[0].getNextSibling()) - нет


gsu   (2003-02-04 19:15:00) [3]

сорри, челюсти


gsu   (2003-02-04 19:14:00) [4]

>> Просто остальные разжевать не могут.
не у всех же такие чеслюсти (-:|~


kull   (2003-02-04 19:12:00) [5]


> Игорь Шевченко © (04.02.03 18:19)

Просто остальные разжевать не могут.


Игорь Шевченко   (2003-02-04 18:19:00) [6]

kull © (04.02.03 17:38)

> Наконец-то нашелся человек, который что-то понимает.


Наконец-то нашелся человек, который разжевывает и в рот кладет.


kull   (2003-02-04 17:38:00) [7]


> Романов Р.В. © (04.02.03 17:29)

Вот, спасибо большое! Наконец-то нашелся человек, который что-то понимает.
Теперь-то до меня дошло. Виноват ступил. :)


Романов Р.В.   (2003-02-04 17:29:00) [8]

Возьмем для примера некоторую функцию AA
TTestF = function: TTreeNode;

function AA: TTreeNode;
begin
Result := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
d: TTestF;
begin
d := AA;

// Проверим существует ли функция?
if Assigned(d) then
ShowMessage("Function Assigned")
else
ShowMessage("Function Not Assigned");

// А теперь проверим результат этой функции.
if Assigned(d()) then
ShowMessage("Result Assigned")
else
ShowMessage("Result Not Assigned");
end;

Так что по аналогии
if Assigned(TreeView1.GetNodeAt(0,0)) проверяет результат функции, а
if Assigned(TreeView1.Items[0].getNextSibling) приводит к ошибке, т.к. TreeView1.Items[0].getNextSibling не является ни указателем на переменную ни указателем на процедуру.


kull   (2003-02-04 16:48:00) [9]


> Игорь Шевченко © (04.02.03 16:40)

еще раз:

if Assigned(TreeView1.GetNodeAt(0,0)) then Exit;

компиляется.


Игорь Шевченко   (2003-02-04 16:40:00) [10]

This error message occurs when you try to take the address of an expression or a constant.

program Produce;
var
I: Integer;
PI: ^Integer;
begin
PI := Addr(1);
end.

A constant like 1 does not have a memory address, so you cannot apply the operator or the Addr standard function to it.

program Solve;
var
I: Integer;
PI: ^Integer;
begin
PI := Addr(I);
end.

You need to make sure you take the address of variable.


kull   (2003-02-04 16:25:00) [11]


> {GetNextSibling conflicts with C++ macro}

Ну и что это значит?
Я что в C++ нахожусь?


Digitman   (2003-02-04 16:08:00) [12]

нет, не прав

цитирую

function getNextSibling: TTreeNode; {GetNextSibling conflicts with C++ macro}

Борланд сам предупреждает об этом

мог бы и сам взглянуть)))


kull   (2003-02-04 16:01:00) [13]


> Digitman © (04.02.03 15:55)

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


Digitman   (2003-02-04 15:55:00) [14]

сделай так

if Assigned(TreeView1.Items[0].GetNextSibling()) then Exit;

и не парься с преобразованиями)


kull   (2003-02-04 15:49:00) [15]

И еще в догонку:

procedure TForm1.FormCreate(Sender: TObject);
begin
if Assigned(TTreeNode(TreeView1.Items[0].getNextSibling)) then Exit;
end;


Тоже отлично компиляется...


gsu   (2003-02-04 15:49:00) [16]

Ура, вперед на новые подвиги ... (-:|~


kull   (2003-02-04 15:46:00) [17]


> Игорь Шевченко © (04.02.03 15:36)

Unit

System

Category

pointer and address routines

Delphi syntax:

function Assigned(const P): Boolean;


> oomneeq © (04.02.03 15:39)


См. F1

А как вам это?

procedure TForm1.FormCreate(Sender: TObject);
begin
if Assigned(TreeView1.GetNodeAt(0,0)) then Exit;
end;


Компиляется на ура, TreeView1.GetNodeAt(0,0) тоже функция.


oomneeq   (2003-02-04 15:39:00) [18]


Assigned принимает аргументом переменную (пусть даже и процедурного ТИПА), а ты подсовываешь ему функцию




Игорь Шевченко   (2003-02-04 15:36:00) [19]

F1 - Assigned


Наверх

Титульная страница Поиск, карта сайта Написать письмо