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

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

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

Beitragvon haderlump » 22. Aug 2019, 05:24 TStrigGrid von einer Zelle per Drag&Drop in eine ander kop.

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
haderlump
 
Beiträge: 167
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon sstvmaster » 22. Aug 2019, 15:35 Re: TStrigGrid von einer Zelle per Drag&Drop in eine ander k

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
sstvmaster
 
Beiträge: 240
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.6 + Trunk 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 22. Aug 2019, 17:19 Re: TStrigGrid von einer Zelle per Drag&Drop in eine ander k

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
wp_xyz
 
Beiträge: 3085
Registriert: 8. Apr 2011, 08:01

Beitragvon haderlump » 24. Aug 2019, 09:03 Re: TStrigGrid von einer Zelle per Drag&Drop in eine ander k

Danke ich schau mir das mal an.
Gruß Fritz
haderlump
 
Beiträge: 167
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried