Thema: Delphi Drag and drop

Einzelnen Beitrag anzeigen

Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#15

Re: Drag and drop

  Alt 14. Feb 2004, 16:17
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat