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

Вниз

with   Найти похожие ветки 

 
paveltersh   (2007-09-11 16:44) [0]

Когда и зачем with используют так:

with Button1, Edit1, Edit2 do
begin
...


Это для примера, мой код. Но зачем with предполагает наличия нескольких переменных? И как это можно использовать?

Приведите пожалуйста пару примеров.


 
DVM ©   (2007-09-11 16:46) [1]


with Button1, Edit1 do
begin
 Text := Caption;
end;


 
DVM ©   (2007-09-11 16:47) [2]

Но с этим надо быть аккуратным - чревато глюками при неверном применении.


 
paveltersh   (2007-09-11 16:49) [3]

Вот как раз глюки и интересуют, какова причина их появления? И где не стоит это использовать а где стоит?


 
Ega23 ©   (2007-09-11 16:49) [4]

Я, честно говоря, всего пару раз таким пользовался.
With dmMain, adsSomething do
begin

end;
где dmMain : TDataModule; adsSomething : TADODataSet.


 
{RASkov} ©   (2007-09-11 16:51) [5]

Примерно так:
with Canvas, Canvas.Font do begin
Color:=clRed; //Цвет фонта
Pen.Color:=clBlue;  //цвет карандаша
Rectangle();        // Канвас.Ректангл
TextOut();          // Канвас.ТекстОут
end;

А вообще это путаница если ты не понимаешь сути with.... и по первой использовать такие конструкции опасно...


 
{RASkov} ©   (2007-09-11 16:53) [6]

> [3] paveltersh   (11.09.07 16:49)
> Вот как раз глюки и интересуют, какова причина их появления?
> И где не стоит это использовать а где стоит?

Глюков там нет, глюки у автора при написании и не понимании сего механизма :)
Так же там учитывается порядок расположения идентификаторов.... примерно как в uses...


 
Сергей М. ©   (2007-09-11 16:53) [7]


> какова причина их появления?


Причина проста - компилятор не може понять, что конкретно от него требуют в WITH-блоке (неоднозначность трактовки обращений к одноименным св-вам/методам разных объектов), и трактует эти обращения "по-своему"


 
Dimaxx ©   (2007-09-11 16:54) [8]

Проще их не использовать. Кода это не добавит, а понятнее будет в разы при разборе кода (особенно если писался давно).


 
paveltersh   (2007-09-11 16:54) [9]

А если например так:

TRec1 = record
d1: string;
d2: Word;
end;

TRec2 = reocrd
 test: string;
 id: Word;
end;

with VarRec1, VarRec2 do
begin
 d1 := test;
 id := d2;


Что будет и чем плохо?

Или если
with Button1, Button2 do
Caption := "dddddd";


 
Сергей М. ©   (2007-09-11 16:57) [10]


> Что будет и чем плохо?


Компилятор не понимает, к полям какой конкретно из указанных записей ты обращаешься (то ли к VarRec1, то ли к VarRec2), плюет на "понимание" и вставляет код обращения к первой же записи в порядке их перечисления, т.е. к VarRec1


 
{RASkov} ©   (2007-09-11 16:58) [11]

> [9] paveltersh   (11.09.07 16:54)
> Или если
> with Button1, Button2 do
> Caption := "dddddd";

Вот сам же отличный пример "путаницы" привел :)
Чей кэпшен менять будем?
здесь ведь три варианта :)


 
Германн ©   (2007-09-11 16:59) [12]


>
> > Что будет и чем плохо?
>
>
> Компилятор не понимает, к полям какой конкретно из указанных
> записей ты обращаешься (то ли к VarRec1, то ли к VarRec2),
>  плюет на "понимание" и вставляет код обращения к первой
> же записи в порядке их перечисления, т.е. к VarRec1

Тут как раз путаницы никакой нет, поскольку названия полей не пересекаются.


 
{RASkov} ©   (2007-09-11 17:00) [13]

> Чей кэпшен менять будем?
> здесь ведь три варианта :)

Только не думай что он сменит сразу всем трем Caption значение на "ddddd"...
Третий вариант - это если этот код в методе формы, то Caption самой формы...


 
Ega23 ©   (2007-09-11 17:04) [14]

А ещё очень может подкосить, когда подсказкой пользуешься.
Был у меня компонентик, которому PopupMenu забыл в published вывести. А он был в protected.
И, как следствие:
procedure TForm1.InitAll;
begin
 With MyComponent do
  begin
    PopupMenu := ...;
  end;
end;


Ошибку полдня искал.


 
{RASkov} ©   (2007-09-11 17:07) [15]

> [14] Ega23 ©   (11.09.07 17:04)

Вот это наверное самое страшное место в этой "штуке" :)
Так как нет запрета писать такие глупые вещи как

with TButton.Create do WindowState:=wsMinimized;
:о)


 
Вася Правильный   (2007-09-11 17:08) [16]


> здесь ведь три варианта :)

больше :)
вдруг кто-то хочет сразу всем кнопкам один капшн присвоить


 
Сергей М. ©   (2007-09-11 17:09) [17]


> {RASkov} ©   (11.09.07 17:00) [13]


ТОчно)

Это уже у меня глюки, а не у компилятора)


 
{RASkov} ©   (2007-09-11 17:11) [18]

> [16] Вася Правильный   (11.09.07 17:08)
> больше :)

В данном месте

> with Button1, Button2 do
> Caption := "dddddd";

сказать правельнее не меньше двух вариантов :)

А если точно и такой код:
procedure TForm.ButtonClick();
begin
 with Button1, Button2 do Caption:="dddd";
end;

То только три варианта :)


 
DVM ©   (2007-09-11 17:15) [19]


> То только три варианта :)

Если это обычный TForm, конечно, а не что другое с тем же именем.


 
{RASkov} ©   (2007-09-11 17:17) [20]

> Компилятор не понимает, к полям какой конкретно из указанных
> записей ты обращаешься (то ли к VarRec1, то ли к VarRec2)
> , плюет на "понимание" и вставляет код обращения к первой
> же записи в порядке их перечисления, т.е. к VarRec1

Вообще-то там идет с первой и так далее пока есть такое поле в перечисленных переменных
и возьмет последнюю переменную из перечисленных переменных с таким полем....
(криво как-то получилось объяснить, но надеюсь понято правильно) :)


 
{RASkov} ©   (2007-09-11 17:19) [21]

> [19] DVM ©   (11.09.07 17:15)

:)
Именно так. Но и если не обычный, но тоже имеет свойство Caption, то все равно три
Конечно же обычный имелось ввиду...
:о)


 
DVM ©   (2007-09-11 17:19) [22]


> {RASkov} ©   (11.09.07 17:17) [20]

Да, точно, последнее берет, я и не знал.

procedure TForm1.Button1Click(Sender: TObject);
begin
with label1, label2, label3 do
 begin
   caption := "12345";
 end;
end;

Меняется у Label3


 
Palladin ©   (2007-09-11 17:25) [23]


> DVM ©   (11.09.07 17:19) [22]

справка рулит


 
DVM ©   (2007-09-11 17:28) [24]


> справка рулит

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


 
Anatoly Podgoretsky ©   (2007-09-11 19:00) [25]

> paveltersh  (11.09.2007 16:44:00)  [0]

Такое лучше не использовать, а если вообще не понимаешь, то совсем не использовать.


 
новичёк   (2007-09-11 20:11) [26]

with Button1, Edit1, Edit2 do

это сокращенное написание

with Button1 do
 with Edit1 do
   with Edit2 do

Поиск идентификатора начнется с последнего вложения.


 
{RASkov} ©   (2007-09-11 20:36) [27]

> [26] новичёк   (11.09.07 20:11)
> Поиск идентификатора начнется с последнего вложения.

+1
Вот это наверное лучше и доходчивее, чем [20]. Сенькс :)



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

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

Наверх




Память: 0.53 MB
Время: 0.028 c
2-1189098457
Progr
2007-09-06 21:07
2007.10.07
Вопрос по БД


15-1189131844
Slider007
2007-09-07 06:24
2007.10.07
С днем рождения ! 7 сентября 2007 пятница


15-1189499209
iam
2007-09-11 12:26
2007.10.07
Написание тестов до самого кода


6-1170777738
M@kc
2007-02-06 19:02
2007.10.07
idMessage.Subject


2-1189359041
user1024
2007-09-09 21:30
2007.10.07
Проблема со шрифтами в TWebBrowser