Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
1-77844
Cr@zy-EyE
2003-07-12 17:54
2003.07.24
Invalid Pointer Operation


8-78012
MrN
2003-03-29 19:40
2003.07.24
Звуковые кодеки


1-77925
Непомню
2003-07-10 14:37
2003.07.24
SynEdit и Delphi 7


1-77829
warrior
2003-07-09 22:58
2003.07.24
Delphi & Excel


3-77716
Cranium
2003-07-03 09:00
2003.07.24
---|Ветка была без названия|---





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский