Zu A habe ich eine Lösung gefunden:
Delphi-Quellcode:
PROCEDURE TMain.SelectRect;
VAR I:Integer; FObjects: Array of TObject;
procedure AddObjectAtEndOfList (const aObject : TObject);
begin
SetLength (FObjects, Succ (Length (FObjects)));
FObjects [High (FObjects)] := aObject;
end;
BEGIN
FOR I := 0 TO DesignPanel.ControlCount -1
DO BEGIN
IF NOT (DesignPanel.Controls[I].Name = '') // selector komponenten natürlich nicht!
THEN
IF PtInRect(DesignPanel.Surface.Controller.DragRect,
(CenterPoint(Rect(DesignPanel.Controls[I].Left,
DesignPanel.Controls[I].Top,
DesignPanel.Controls[I].Left+DesignPanel.Controls[I].Width,
DesignPanel.Controls[I].Top+DesignPanel.Controls[I].Height))))
THEN BEGIN
AddObjectAtEndOfList(DesignPanel.Controls[I]);
DesignPanel.Surface.SetSelected(FObjects);
END;
END;
END;
Eingebunden wird das ganze als oberstes im "OnSelectionChange".
Also ich ermittle den Mittlepunkt von jeder Komponente und schaue dann ob dieser Punkt im markierten Rechteck liegt.