Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.008 c