Форум: "Начинающим";
Текущий архив: 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.042 c