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

Вниз

Left side cannot be assigned to   Найти похожие ветки 

 
Skier ©   (2003-07-11 12:54) [0]

1)
var
AFindDialog : TFindDialog;
Begin
AFindDialog := TFindDialog.Create(nil);
//...................
with AFindDialog.Position do x := 0; //компилируется.
//...................
AFindDialog.CloseDialog;
End;

2)
var
AFindDialog : TFindDialog;
Begin
AFindDialog := TFindDialog.Create(nil);
//...................
AFindDialog.Position.x := 0; //Left side cannot be assigned to !
//...................
AFindDialog.CloseDialog;
End;

Поясните, пожалуйста, в чём разница...


 
Юрий Федоров ©   (2003-07-11 12:56) [1]

Чудеса !
Может там еще какой-нибудь X присутстует?


 
Skier ©   (2003-07-11 12:57) [2]

>Юрий Федоров © (11.07.03 12:56)
Нет. Проверял.


 
Юрий Федоров ©   (2003-07-11 13:05) [3]

Баг в delphi ?


 
MBo ©   (2003-07-11 13:08) [4]

Во втором случае ты обращаешься к полю свойства-записи, а методы доступа работают с с этой записью в целом!
В первом же ты получаешь запись-точку, меняешь ее X, но проверь после этого значение свойства. Оно не меняется!
ведь SetPosition не сработало!


 
Skier ©   (2003-07-11 13:09) [5]

>Юрий Федоров © (11.07.03 13:05)
Не знаю, но я скорее грешу на свою голову :)


 
Юрий Федоров ©   (2003-07-11 13:10) [6]

>>MBo © (11.07.03 13:08)
>>ведь SetPosition не сработало!

Ну ведь не должно так быть, то есть като это через одно место?
Должен быть четкий Left side cannot be assigned to в любом случае ИМХО


 
Skier ©   (2003-07-11 13:12) [7]


> ведь SetPosition не сработало!



with AFindDialog.Position do x := 123;
ShowMessage(IntToStr(AFindDialog.Position.x));

В итоге на экране имеет "123"


 
Юрий Федоров ©   (2003-07-11 13:12) [8]

>>MBo © (11.07.03 13:08)
SetPosition сработает по выходу из секции with ?


 
Palladin ©   (2003-07-11 13:16) [9]

встречается такое и в более приличных местах...

var
a:array of int64;
begin
setlength(a,1);
int64rec(a[0]).Cardinals[0]:=1;
end;

тоже самое...
D6


 
MBo ©   (2003-07-11 13:16) [10]

finddialog1.Position:=Point(5,5);
with finddialog1.position do x:=3;
caption:=inttostr(finddialog1.position.x);

получаю 5 (Delphi5)

>Юрий Федоров
Нет, в asm -коде для второй строки только GetPosition


 
Юрий Федоров ©   (2003-07-11 13:21) [11]

>>MBo © (11.07.03 13:16)
D6 аналогично


 
Юрий Федоров ©   (2003-07-11 13:23) [12]

caption:=inttostr(finddialog1.position.x) + "\ " + inttostr(x);
получаю 5 \ 3


 
Skier ©   (2003-07-11 13:24) [13]

>MBo © (11.07.03 13:16)
Да, точно, возвращает "мусор". В первый раз видимо просто
повезло.
А почему этот код вообЧе проходит, в отличии от 2) ?
Смысла в нём, как оказывается никакого (!)
Логика-то какая ?


 
MBo ©   (2003-07-11 13:54) [14]

>with finddialog1.position do x:=3;
...
call TFindDialog.GetPosition
move [ebp-$08], 00000003
по ebp-$08 лежит точка, в ее x пишется 3

ведь подобная конструкция может использоваться и так:

with finddialog1.position do somevar:=x;


 
Skier ©   (2003-07-11 13:59) [15]

>MBo © (11.07.03 13:54)

> ведь подобная конструкция может использоваться и так:
>
> with finddialog1.position do somevar:=x;

Конечно. Но всё-таки странно, что не запрещается то в чём
нет смысла.
(имею в виду with finddialog1.position do x := somevar;)


 
Толик   (2003-07-11 14:02) [16]

to Skier © (11.07.03 13:24)
Смысла в нём, как оказывается никакого (!)
Логика-то какая ?

А логика такая, что в секции with создается локальная переменная типа TPoint, в поле X которой и записывается значение 3. А после выхода из with её уже нет.

ShowMessage(IntToStr(FindDialog.Position.X)); // некое значение
with FindDialog.Position do begin //создаём копию TPoint
X := 1; //присвоение локальной переменной TPoint.X !!!
ShowMessage(IntToStr(X)); // видим 1
end;
ShowMessage(IntToStr(FindDialog.Position.X)); //снова старое значение



 
Толик   (2003-07-11 14:06) [17]

добавление к Толик (11.07.03 14:02)
Смысл в этом такой же как и в передаче параметров в ф-ю по ССЫЛКЕ или по ЗНАЧЕНИЕЮ.


 
Skier ©   (2003-07-11 14:08) [18]

>Толик (11.07.03 14:02)
А я настаиваю ! :)
Если "снова старое значение", то где же логика, я-то например, хочу присвоить значение именно FindDialog.Position.X, и
главное компилятор ничего не пишат (ну даже хинтов не пишет)
...И получаю "гранату" !


 
Толик ©   (2003-07-11 14:17) [19]

to Skier © (11.07.03 14:08)

Насчёт компиляторных hint"ов - согласен: потому и используется with а не вызов функции, что хочется менять не локальное значение, а то которое «передаётся». Но видимо в Borland"е решили по другому и не стали заморачиваться и реализовали with а"ля вызов функции. В этом случае вариант 1) из Skier © (11.07.03 12:54) вполне имеет смысл. А вот то, что он нафиг никому не нужен - это уже другой разговор! :)


 
Skier ©   (2003-07-11 14:22) [20]

>Толик © (11.07.03 14:17)

> ». Но видимо в Borland"е решили по другому и не стали заморачиваться
> и реализовали with а"ля вызов функции.

Ну и кто они после этого ?! :)


 
Anatoly Podgoretsky ©   (2003-07-11 16:35) [21]

Все правильно, нет такого свойства, есть свойство Position типа TPoint вот только его и можешь присвоить или через вспомогательную переменную, что и делается когда используется конструкция with это хорошо объяснил Толик (11.07.03 14:02)

Там могло быть и более сложное составное свойство с доступом через функцию.

Skier © (11.07.03 14:22)
Нормальные они.


 
Skier ©   (2003-07-14 10:01) [22]

>Толик (11.07.03 14:02)
мне кажется что используется (в случае Positon) не локальная переменная, а запись активации функции GetPositon, IMHO, так
точнее...


 
Song ©   (2003-07-14 10:21) [23]

А мне кажется, что это одна из ситуаций, которую просто не пропустил компилятор, хотя построить для неё код возможно, что и подтверждается в случае с With.


 
Lord Warlock ©   (2003-07-14 11:02) [24]


> Skier ©


а ты смотрел, как они это св-во назначают в примере

TFindDialog.Position:=Point(x,y).

у меня была похожая ситуация, когда писал свои классы. Было св-во - запись. Приведенная выше ситуация срасбатывала безукоризненно, но припопытке записать что-то в любое поле этой записи - фикус. Читать - пожалуйста, а писать - нет..


 
Skier ©   (2003-07-14 11:05) [25]

>Lord Warlock © (14.07.03 11:02)

> Читать - пожалуйста, а писать - нет..

О чём и речь...


 
Lord Warlock ©   (2003-07-14 11:17) [26]

Я выходил из положения немного дурным способом - создавал сва-ва по именам полей в записи, и описывал их чтение-установку (класс все-таки мой был, чего хотел, то и делал), так что пользуся приведением Point(..) и не парься :)


 
Skier ©   (2003-07-14 11:22) [27]

>Lord Warlock © (14.07.03 11:17)
Да, нет ты не так понял, или я неверно выразился.
Вопрос изначально стоял не "как это обойти ?", а "почему 1), а 2) нет ?"


> создавал сва-ва по именам полей в записи, и описывал их
> чтение-установку

Для этой цели хорошо подходят индексированные св-ва...


 
Lord Warlock ©   (2003-07-14 11:29) [28]

Ну на это пожалуй уже ответил Толик ©, тут добавить особо нечего, просто я встречался с этим на практике.


> Для этой цели хорошо подходят индексированные св-ва...


Это они и были - массив записей.



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

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

Наверх




Память: 0.53 MB
Время: 0.013 c
14-78064
Knight
2003-07-06 12:52
2003.07.24
Модем и молния...


14-78073
Кен
2003-07-06 02:27
2003.07.24
ОРТ представляет : Терракты и КВН - вместе веселее


1-77931
Aleksandr
2003-07-10 15:47
2003.07.24
Как правильно вычислить координаты текста для потомка TLabel?


14-78093
kamchatik
2003-07-08 10:31
2003.07.24
Компонент DBGrid и событие OnCellClick


14-78076
Е-Моё имя
2003-07-07 17:21
2003.07.24
работа в МоскваСити