通过过程delphi更改TColor属性(不起作用)

时间:2016-09-11 23:18:25

标签: delphi

有人可以解释为什么选项* 1不起作用? TKS

我在这里放了一个简单的代码,因为我想理解为什么代码不接受我在一个过程中传递TColor like指令

procedure TForm1.BitBtn1Click(Sender: TObject);
  procedure ChangeColor( Value : TColor );
  begin
     //*1
     Value := clRed;
  end;
begin
   //*1 IT DOESN'T WORK
   ChangeColor( Edit1.Color );
   ChangeColor( ComboBox1.Color );

//----------------------------------//

   //*2 IT WORKS
   Edit1.Color := clRed;
   ComboBox1.Color := clRed;
end;

谢谢

3 个答案:

答案 0 :(得分:4)

选项1不起作用,因为代码不会尝试将任何内容分配给控件的Color属性。它只是将颜色值传递给嵌套过程ChangeColor。嵌套过程唯一能做的就是为传递的参数赋值。

如果您希望在过程返回后读取传递给过程的参数,请阅读variable parameters

如果您希望在嵌套过程本身中更改控件的颜色,请另外阅读properties

答案 1 :(得分:3)

Sertac指出的限制的解决方法是使用function代替procedure

procedure TForm1.BitBtn1Click(Sender: TObject);

  function ChangeColor: TColor;
  begin
     Result := clRed;
  end;

begin
   Edit1.Color := ChangeColor;
   ComboBox1.Color := ChangeColor;
end;

我认为您想要使用过程而不是分配常量的原因是由于逻辑比显示的更复杂。

答案 2 :(得分:0)

您可以尝试使用RTTI:

uses System.TypInfo;

procedure UpdateColorProperty(Ctrl : TControl; const aColor : Tcolor);
var PropInfo : PPropinfo;
begin
  if aColor = clNone then Exit;
  if Assigned(Ctrl) then begin
    PropInfo := GetPropInfo(Ctrl, 'Color');
    if PropInfo <> nil then
      SetPropValue(Ctrl, 'Color', aColor);
  end;
end;
相关问题