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

Вниз

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

Наверх





Память: 0.51 MB
Время: 0.041 c
1-1183370769
Krants
2007-07-02 14:06
2007.10.07
ToolsApi в своих приложениях


15-1189356433
Beastie Boys
2007-09-09 20:47
2007.10.07
про выделенный сервер


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


2-1189415064
Washington
2007-09-10 13:04
2007.10.07
Кнопка выхода


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





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