// Beim Ziehen mit gedrücktgehaltener linken Maustaste wird auf
// die Form ein Rahmen gezeichnet
(siehe dazu auch
// http://dbrsoftware.de/delphi/markier.php )
// Alle TButtons, welche sich innerhalb des Rahmens befinden,
// werden beim Loslassen der Maustaste der Reihe nach
// entsprechend ihrer Z-Oder
(siehe dazu auch
// http://www.dbrsoftware.de/delphi/zorder.php )
// softwareseitig angeklickt. Im Beispiel wurden
// 5 x 4 Buttons eingesetzt.


// Getestet mit D4 und D7 unter XP

unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls; 
 
type 
  TForm1 = class(TForm) 
    Button1: TButton;
    Button2: TButton; 
    Button3: TButton; 
    Button4: TButton; 
    Button5: TButton; 
    Button6: TButton; 
    Button7: TButton; 
    Button8: TButton; 
    Button9: TButton; 
    Button10: TButton; 
    Button11: TButton; 
    Button12: TButton; 
    Button13: TButton; 
    Button14: TButton; 
    Button15: TButton; 
    Button16: TButton; 
    Button17: TButton; 
    Button18: TButton; 
    Button19: TButton; 
    Button20: TButton;
    procedure FormCreate(Sender: TObject); 
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure Button1Click(Sender: TObject); 
  private 
    { Private-Deklarationen } 
  public 
    procedure zeichnen; 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.DFM} 
 
var 
  isdown: Boolean; 
  anfang, ende: TPoint; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  with Canvas do begin 
    Brush.Style := bsClear; 
    Pen.Mode := pmNotXor; 
    Pen.Color := clBlack; 
    Pen.Style := psDot; 
    Pen.Width := 1; 
  end; 
end; 
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if Button = mbLeft then begin 
    isdown := True; 
    anfang := Point(X, Y); 
    ende := Point(X, Y); 
  end; 
end; 
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
  if isdown then begin 
    zeichnen; 
    ende := Point(X, Y); 
    zeichnen; 
  end; 
end; 
 
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
var 
  r: TRect; 
  v, i: integer; 
begin 
  if isdown then begin 
    isdown := False; 
    refresh; 
    if anfang.x > X then begin 
      v := anfang.x; 
      anfang.x := X; 
      X := v; 
    end; 
    if anfang.y > Y then begin 
      v := anfang.y; 
      anfang.y := Y; 
      Y := v; 
    end; 
    for i := 0 to pred(componentcount) do 
      if components[i] is TButton then begin 
        if InterSectRect(r, rect(anfang.x, anfang.y, X, Y), 
          TButton(components[i]).BoundsRect) then 
          sendmessage(TButton(components[i]).handle, bm_click, 0, 0); 
      end; 
  end; 
end; 
 
procedure TForm1.zeichnen; 
begin 
  Canvas.Rectangle(anfang.X, anfang.Y, ende.X, ende.Y); 
end; 
 
// zum Testen: 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  showmessage(TButton(Sender).name + ' wurde angeklickt.'); 
end; 
 
end. 
 



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke