Показать полную графическую версию : Оператор доступа в Delphi
Столкнулся с проблемой:
Пишу:
with label1, label2, label3 do
caption := 'метка';
В итоге значение "метка" применяется только объекту label3, а остальным нет.
В чём моя ошибка ?
Никогда не думал, что так можно написать. Что вы хотели сказать этим куском кода? Чтобы он выполнялся три раза для разных label? Я, конечно, delphi плохо знаю, но по-моему, так писать нельзя.
Prisoner
28-02-2004, 18:10
Просто такая запись эквивалентна следующей:
with label1 do
with label2 do
with label3 do
caption:='метка';
Почитайте справку по инструкции with - там есть описание такой штуки.
Так, я что-то не понял.
Если она эквивалентна, то почему же она не правильна?
Prisoner
28-02-2004, 20:22
Я рекомендовал прочесть то, что сказано на этот счет в помощи:
with obj1, obj2, ..., objn do statement
эквивалентна
with obj1 do
with obj2 do
...
with objn do
statement
In this case, each variable reference or method name in statement is interpreted, if possible, as a member of objn; otherwise it is interpreted, if possible, as a member of objn-1; and so forth.
Имеем: В этом случае каждое вхождение переменной или имени метода в statement интерпретируется, если возможно, как член objn; иначе интерепретируется, если возможно, как член objn-1 и так далее.
В вашем случае свойство caption можно поменять уже у самого низко расположенного по вложенности объекта TLabel... что в общем-то сразу видно из эквивалентного варианта кода.
Prisoner
А как следует написать, чтобы caption='' применилось для всех label'ов?
Prisoner
29-02-2004, 20:46
Установку свойств нескольких объектов можно сделать через RTTI функцию SetXXXProp, где XXX - мнемоника типа свойства и может быть Ord, Str, Float... а вот как реализовать обход компонентов для смены свойств уже дело конкретной задачи.
Для примера следующий обработчик клика на кнопку установит всем объектам на форме у которых есть свойство caption значение bla-bla-bla: procedure TForm1.Button1Click(Sender: TObject);
Var
i: integer;
PropInfo: PPropInfo;
begin
for i:=0 to Form1.ComponentCount-1 do
begin
PropInfo := GetPropInfo( Form1.Components[i].ClassInfo, 'Caption');
if PropInfo <> nil then
SetStrProp( Form1.Components[i], PropInfo, 'bla-bla-bla' );
end;
end;
В моем случае это было три надписи (TLabel).
PS для примера надо включить в раздел uses модуль TypInfo.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.