Zitat:
Ich kann eine Zeile in einen Bereich eines Grids ziehen, wo nichts ist. Dann kommt
Exception.
warn fehler im enddrag, arow-1 wird nicht abgefangen, war ja auch nur ne notlösung.
habs jetzt anders gemacht, bei mir wird das nix mit dragmode=dmautomatic, da ich dann nix mehr auswählen kann. also wieder dmmanuel und im mousedown der Grids:
Delphi-Quellcode:
procedure TForm1.StringGridMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
TStringGrid(Sender).BeginDrag(false,10);
end;
und die drag-methoden (erlauben auch mehrere Zeilen):
Delphi-Quellcode:
procedure TForm1.StringGridDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
//Drag and drop im gleichem Stringgrid nichtakzeptieren
accept := (Source is TStringGrid) and (source<>Sender);
end;
procedure TForm1.StringGridDragDrop(Sender, Source: TObject; X,
Y: Integer);
Var StSource,StSender:TStringGrid;
RowVon, RowBis,i,destrow,dummy :integer;
begin
StSource := Source as TStringGrid;
StSender := Sender as TStringGrid;
//welche Zeilen sind im Source ausgewählt
rowVon := StSource.Selection.top;
rowBis := StSource.Selection.Bottom;
//wohin einfügen?
StSender.MouseToCell(x,y,dummy,destrow);
//da immer nur eine zusammenhängende Markierung möglich ist, gehts hier mit For einfacher
//aber rückwärts, wegen dem löschen
for i:=rowbis downto Rowvon do
begin
//Zeile einfügen oder anhängen
if destrow=-1 then
begin
//anhängen
StSender.RowCount:=StSender.RowCount+1;
//datenkopieren
StSender.Rows[StSender.RowCount-1].Assign(StSource.Rows[i]);
end
else
begin
//einfügen
TStringGridExt(StSender).InsertRow (destrow);
//datenkopieren
StSender.Rows[destrow].Assign(StSource.Rows[i]);
end;
//zeile löschen
TStringGridExt(StSource).DeleteRow (i);
end;
end;
ich füge die Zeilen an den betreffenden Stellen ein, nur am Ende anhängen is doof
mit diesem Code geht aber dein insertrow nicht mehr richtig. habs auch noch geändert:
Delphi-Quellcode:
procedure TStringGridExt.InsertRow(ARow: Longint);
var i:integer;
begin
RowCount := RowCount + 1;
for i:=RowCount-1 downto arow do
rows[i].Assign(rows[i-1]);
end;
Mfg Frank