TStrigGrid von einer Zelle per Drag&Drop in eine ander kop.

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

TStrigGrid von einer Zelle per Drag&Drop in eine ander kop.

Beitrag von haderlump »

Hallo zusammen Ich müßte den Inhalt einer Zelle in eine andere kopieren. Am liebsten mit drag & drop.
Ich bin da aber ziemlich hilflos.
Ich habe im Delfi Kochbuch einen Artikel gefunden, der sich mit drag&drop befasst, allerdings wird da zwichen 2 Editierfeldern gezogen.
Ich habe versucht das für mich anzupassen.
Was hab ich schon gemacht:

Code: Alles auswählen

procedure TForm1.VokabelgitterMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Vokabelgitter.BeginDrag(false);
end

Das scheint zu gehen. wenn ich in das Feld klicke und die Maus bewege, ändert sich der Cursor.

Code: Alles auswählen

procedure TForm1.VokabelgitterDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if source is TStringGrid then Accept := true;
end;     

Was da passiert weiß ich nicht so recht, der Compiler akzeptiert es aber.
bevor ich die Zelle verlasse speichere ich erst noch die Spalten und Reihen in den Variablen "letzteSpalte,letzteReihe".

Code: Alles auswählen

procedure TForm1.VokabelgitterDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if source is TStringGrid then vokabelgitter.Cells[vokabelgitter.Col,vokabelgitter.Row] := vokabelgitter.Cells[letzteSpalte,letzteReihe];
end;   

Jetzt sollte es ja in der neuen Zelle stehen. tut es aber nicht.
Und die alte Zelle ist nun leer, soll aber auch nicht so sein.

Was läuft da falsch?

Gruß Fritz

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TStrigGrid von einer Zelle per Drag&Drop in eine ander k

Beitrag von sstvmaster »

guugst du hier: https://forum.lazarus.freepascal.org/in ... ic=22220.0

Unten im letzten Beitrag mit Beispiel.

EDIT: In dem Beispiel wird aber nur die Reihe per Drag/Drop verschoben.
Aber es zeigt dir schon mal die Richtung.

LG Maik
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TStrigGrid von einer Zelle per Drag&Drop in eine ander k

Beitrag von wp_xyz »

Mein eigenes Beispiel:

Der Vorgang beginn mit dem MouseDown-Ereignis, wenn die linke Taste gedrückt wird: BeginDrag. Das "false" bedeutet, dass die Maus erst über die im nächsten Parameter angegebene Distanz gezogen werden muss (Default ist 5). Das schützt vor unbeabsichtigtem Drag&Drop beim "verrutschten" Klicken. Mit Hilfe der Methode MouseToCell werden die Koordinaten der Zelle ermittelt, in der geklickt wurde - diese brauchen wir später zum Kopieren des Inhalts:

Code: Alles auswählen

procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Button = mbLeft) then begin
    StringGrid1.BeginDrag(false, 8);
    StringGrid1.MouseToCell(X, Y, OrigCol, OrigRow);
  end;
end

Während die Maus über den Bildschirm gezogen wird, signalisieren alle Controls unterhalb der Maus, ob sie für den Drop-Vorgang in Frage kommen. Dafür ist das Ereignis OnDragAccept verantwortlich. Dabei ist Source das Control unter der Maus (Sender ist das aktuell gezogene Object). Normalerweise reicht es aus abzufragen, ob Source gleich dem StringGrid ist. Darüber hinaus könnte man aber auch z.B. prüfen, ob die Zelle unter der Maus leer ist, so dass nichts überschrieben wird. Um die aktuelle Position zu erlauben, setzt man Accept auf true - Accept ist standardmäßig auf false, so dass nicht in Frage kommende Controls keinen OnDragOver-Handler benötigen.

Code: Alles auswählen

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source = StringGrid1 then
    Accept := true;
end;

Schließlich wird die Maus losgelassen. Nun kommt das Ereignis OnDragDrop. Die Methode MouseToCell ermittelt wieder die Spalten/Zeilen-Nummer der Zelle, die aktuell unter der Maus liegt. In diese Zelle schreiben wir den Inhalt der Ausgangszelle. Die Ausgangszelle wird gelöscht (oder auch nicht - je nachdem, was man will). In dem Beispiel habe ich auch eine Bestätigungs-Abfrage eingebaut:

Code: Alles auswählen

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  c, r: Integer;
begin
  StringGrid1.MouseToCell(X, Y, c, r);
  Caption := Format('X = %d, Y = %d | Col = %d, Row = %d', [X, Y, c, r]);
  if MessageDlg('Wirklich?', mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
    exit;
  StringGrid1.Cells[c, r] := StringGrid1.Cells[OrigCol, OrigRow];
  StringGrid1.Cells[OrigCol, OrigRow] := '';
end

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: TStrigGrid von einer Zelle per Drag&Drop in eine ander k

Beitrag von haderlump »

Danke ich schau mir das mal an.
Gruß Fritz

Antworten