Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Оператор доступа в Delphi (http://forum.oszone.net/showthread.php?t=29960)

LedWorm 27-02-2004 20:12 206530

Столкнулся с проблемой:

Пишу:

with label1, label2, label3 do
       caption := 'метка';

В итоге значение "метка" применяется только объекту label3,  а остальным нет.

В чём моя ошибка ?

antonym 28-02-2004 02:34 206531

Никогда не думал, что так можно написать. Что вы хотели сказать этим куском кода? Чтобы он выполнялся три раза для разных label? Я, конечно, delphi плохо знаю, но по-моему, так писать нельзя.

Prisoner 28-02-2004 18:10 206532

Просто такая запись эквивалентна следующей:
Код:

with label1 do
   with label2 do
       with label3 do
           caption:='метка';

Почитайте справку по инструкции with - там есть описание такой штуки.

LedWorm 28-02-2004 19:34 206533

Так, я что-то не понял.
Если она эквивалентна, то почему же она не правильна?

Prisoner 28-02-2004 20:22 206534

Я рекомендовал прочесть то, что сказано на этот счет в помощи:
Цитата:

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... что в общем-то сразу видно из эквивалентного варианта кода.

UZER 29-02-2004 10:33 206535

Prisoner
А как следует написать, чтобы caption='' применилось для всех label'ов?

Prisoner 29-02-2004 20:46 206536

Установку свойств нескольких объектов можно сделать через 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.


Время: 04:46.

Время: 04:46.
© OSzone.net 2001-