In einer früheren Frage hier habe ich nach Drag & Drop innerhalb des Gridpanels gefragt.
Drag & Drop Steuerelemente in einem GridPanel
Die nächste Frage, die ich habe, ist, dass ich ein seltsames Verhalten habe, immer wenn ich versuche, Steuerelemente diagonal zu verschieben, wenn sie in der Nähe anderer Steuerelemente sind. Steuerelemente, die nicht verschoben werden sollen, verschieben sich Zellen. Auf und ab, seitwärts ist es in Ordnung. Aber diagonale Bewegungen, wenn die verschobenen Zellinhalte in derselben Zeile / Spalte mit anderen Zellen liegen, die Steuerelemente enthalten, werden unerwartete Verschiebungen verursachen. Ich habe versucht, beginupdate/endupdate die Verschiebungen passieren trotzdem. Es gibt eine LOCK-Funktion für das Gridpanel, die jedoch nichts sperrt. Es passiert, wenn der Drop auf einer leeren Zelle liegt, und sogar Zellen, die bereits Inhalte haben.
Hier ist das Testprojekt (Delphi 2010 ohne exe) http://www.mediafire.com/?xmrgm7ydhygfw2r
type
TForm1 = class(TForm)
GridPanel1: TGridPanel;
btn1: TButton;
btn3: TButton;
btn2: TButton;
lbl1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure GridPanelDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure btnDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure btnDragDrop(Sender, Source: TObject; X, Y: Integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure SetColumnWidths(aGridPanel: TGridPanel);
var
i,pct: Integer;
begin
aGridPanel.ColumnCollection.BeginUpdate;
pct:=Round(aGridPanel.ColumnCollection.Count/100);
for i := 0 to aGridPanel.ColumnCollection.Count - 1 do begin
aGridPanel.ColumnCollection[i].SizeStyle := ssPercent;
aGridPanel.ColumnCollection[i].Value := pct;
end;
aGridPanel.ColumnCollection.EndUpdate;
end;
procedure SetRowWidths(aGridPanel: TGridPanel);
var
i,pct: Integer;
begin
aGridPanel.RowCollection.BeginUpdate;
pct:=Round(aGridPanel.RowCollection.Count/100);
for i := 0 to aGridPanel.RowCollection.Count - 1 do begin
aGridPanel.RowCollection[i].SizeStyle := ssPercent;
aGridPanel.RowCollection[i].Value := pct;
end;
aGridPanel.RowCollection.EndUpdate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
btn1.OnDragOver := btnDragOver;
btn2.OnDragOver := btnDragOver;
btn3.OnDragOver := btnDragOver;
GridPanel1.OnDragOver := btnDragOver;
GridPanel1.OnDragDrop := GridPanelDragDrop;
btn1.OnDragDrop := btnDragDrop;
btn2.OnDragDrop := btnDragDrop;
btn3.OnDragDrop := btnDragDrop;
SetColumnWidths(GridPanel1);
SetRowWidths(GridPanel1);
end;
procedure TForm1.btnDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TButton);
end;
...