Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 94. - Hromadná změna vlastností komponent

Jan Šindelář - 11.6.2003

Hromadná změna vlastností komponent

Již několikrát jsem dostal dopis s dotazem, jak například hromadně zapínat či vypínat Hinty u komponent. Nejen u všech najednou, ale třeba jen u tlačítek. A nebo jak nějaké komponenty naráz zneviditelnit a podobně. Všechno se to týká stejného problému, kterým je hromadná změna určitých vlastností komponent. A to si přesně dneska ukážeme.

Samotný postup je vlastně velmi jednoduchý, nejedná se o nic mimořádného, ale právě podobné drobnosti často začátečníky mohou trápit. Pro celou akci si vytvoříme proceduru, která bude mít jako parametry jednak typ komponenty, jejíž vlastnosti budeme měnit, dále jméno této vlastnosti a konečně její číselnou hodnotu. V samotném těle procedury pak najdeme cyklus, který postupně projde všechny komponenty z našeho formuláře a má-li pro danou komponentu změna požadovaného parametru smysl (tj. takový parametr vůbec pro komponentu existuje), provede ji.

Zde tedy následuje kompletní zdrojový kód. Ten tentokrát obsahuje i deklarace řady prvků, které nejsou vlastně nijak funkčně využity (konkrétně je to dvakrát Label a Edit a jednou Memo). Ty jsou v kódu umístěny pochopitelně pouze ze zkušebních důvodů jak bude příklad fungovat a můžete použít cokoliv podle vlastní potřeby.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TypInfo, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure SetProperties(ClassName, Prop: string; Value: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SetProperties(ClassName, Prop: string; Value: Integer);
var
  i: integer;
  PropInfo: PPropInfo;
  Component: TComponent;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    Component := Components[i];
    if (Component is TControl) and ((Component.ClassName = ClassName) or (ClassName = `AllComponents`)) then
    begin
      PropInfo := GetPropInfo(Component.ClassInfo, Prop);
      if Assigned(PropInfo) then SetOrdProp(Component, PropInfo, Integer(Value));
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetProperties(`AllComponents`, `ShowHint`, 0);
  SetProperties(`TEdit`, `visible`, 0);
  SetProperties(`TMemo`, `Enabled`, 0);
  SetProperties(`TLabel`, `Autosize`, 1);
end;

end.

Na konci zdrojáku můžete vidět i jednoduchý příklad použití jako událost stisku tlačítka. První řádek vypne zobrazování již v úvodu zmiňované bublinkové nápovědy pro všechny komponenty, druhý řádek zajistí zmizení (zneviditelnění) všech komponent Edit z formuláře, třetí řádek "disabluje" komponenty Memo a poslední řádek zapne vlastnost Autosize pro všechny komponenty Label.