This program try to show something at least interesting about those components
on the form. You'll see that by the fact they're descendant of TWinControl they
can react like a Window. I mean they can be maximized, minimized and so on.
If you see a control that not respond to our commands it's because it doesn't
descend from TWinControl. I didn't try to deal with them. Well. I believe this
program is an open door to great ideas. There's a lot of components that could
take advantages of this to manipulate controls on the form. You know a long journey
starts on the first step. Here it is.
Show me anything great you could do out of these ideas.
Good work.
var Messing: TMessing;
n: Integer;
AllOfThem: Boolean = True;
implementation {$R *.DFM}
procedure TMessing.Procede(Sender: TObject); var n, Tag: Integer;
T: TComponent;
ParentClass: TClass;
OkToProcede: boolean;
Comando: Word;
HasTheFocus: Boolean; begin // As the menu itens do pratically the same thing we directed them all to here.
// Their tag properties are different so we could know who called us.
// Save this. We'll need it Tag := (Sender as TMenuItem).Tag; case (Sender as TMenuItem).Tag of // Oh! You just click options but you're already here. You didn't choose one
// yet so exit. 0: Exit; // Now we have the options. Change comando accordingly to reflect our option. 1: COMANDO := SW_MINIMIZE;
2: COMANDO := SW_MAXIMIZE;
3: COMANDO := SW_RESTORE;
4: COMANDO := SW_HIDE;
5: COMANDO := SW_SHOW;
6: COMANDO := SC_SIZE;
7: COMANDO := SC_MOVE;
8: COMANDO := SC_CLOSE;
9: Application.Terminate; end; // Now we know the command we are ready to procede..
// So we start looking for the components this form has. for n := 1 to ComponentCount do // Well componentCount starts with 1 begin // but ComponentsList starts with 0 (zero) so we make some adjustment T := Components[n - 1]; // Now we have the component in our T variable and can ask a few questions ParentClass := T.ClassParent; // We want to know its ClassParent. OkToProcede := ParentClass = TWinControl; // if it is descendant of TWinControl then it's ok to procede. while (ParentClass nil) and (OkToProcede = False) do
begin // Oh no! Not yet. Maybe it descends of a lower class that is
// descendant of TWinControl. So we keep going back in its "genealogical"
// tree to see if we can find TWinControl back there somewhere or get to nil. OkToProcede := ParentClass = TWinControl;
ParentClass := ParentClass.Classparent; end; // if we got to nil and didn't find TWinControl then we have nothing to do
// this component doen't accept our kinda of commands. if OkToProcede then
begin // Does it has the focus? HasTheFocus := (T as TWinControl).Focused; // If not AllOfThem and not has the focus so we break to the next one. if (not AllOfThem) and (not HasTheFocus) then Continue; if Tag then // There no SC_SIZE or SC_MOVE or SC_CLOSE command in here so we have to apart. ShowWindow((T as TWinControl).Handle, COMANDO) else // CloseWindow((T as TWinControl).Handle ); Doesn't work. It minimize them.
// But this one bellow works. It's possible to show them after closed but
// the controls loose some of their properties. Methinks it's dangerous (T as TWinControl).Perform(WM_SYSCOMMAND, COMANDO, 0); end; end; end;
// Changing our target procedure TMessing.TargetClick(Sender: TObject); begin
if (Sender as TMenuItem).Tag = 40 then
begin (Sender as TMenuItem).Caption := 'Target: the focused one';
(Sender as TMenuItem).Tag := 41;
AllofThem := False; end
else
begin (Sender as TMenuItem).Caption := 'Target: all components';
(Sender as TMenuItem).Tag := 40;
AllofThem := True; end; end;