Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bilder per Drag & Drop sortieren (https://www.delphipraxis.net/159115-bilder-per-drag-drop-sortieren.html)

needatip 15. Mär 2011 09:14

Bilder per Drag & Drop sortieren
 
Hallo,
ich lade Bilder von Positionen anhand folgender MSSQL/ADO Tabellen in ein Gridpanel

Tabelle POSITION
ID : int - Primary key
BEZ : string
.....

Tabelle BILDER
ID : int - Primary key
IDPOSITION : int // Ref-Index auf Tabelle Position.ID
SORT : int (Sortierreihenfolge, wird analog bereits beim Einfügen pro Bild von 1 bis x angelegt)

Delphi-Quellcode:
procedure Form1.FormActivate(Sender: TObject);
var
  i: integer;
begin
  with qryBilder do // ADOQery
  begin
    SQL.Clear;
    SQL.Add('SELECT * FROM BILDER WHERE IDPOSITION = :IDPOSITION ORDER BY SORT');
    Parameters.ParamByName('IDPOSITION').Value := PosDSet.FieldByName('ID').Value; //PosDSet ist das DataSet für die Positionen
    Open;
  end;
  LoadPics(PosDSet.FieldByName('ID').AsInteger); // LoadPics aufrufen und Bilder der entspr. Position in das Gridpanel laden
end;

procedure TfmPosPics.LoadPics(POSID: integer); // Prozedur zum laden der Bilder in das Gridpanel
var
  img: TImage;
  Pfad, Bild: string;
begin
  Pfad := 'c:\Bilder\';
  qryBilder.First;
  // Gridpanel leeren
  GridPanel1.ControlCollection.Clear;
  while not qryBilder.Eof do
  begin
    img := TImage.create(Self);
    img.Parent := GridPanel1;
    img.AutoSize := false;
    img.Stretch := true;
    img.Tag := qryBilder.FieldByName('ID').Value;
    img.Width := 100;
    img.height := 80;
    Bild := Pfad + TRIM(qryBilder.FieldByName('ID').text) + '.jpg';
    img.Picture.LoadFromFile(Bild);
    img.Cursor := crHandPoint;
    img.DragMode := dmManual;
    img.OnDragOver := MyDragOver;
    img.OnDragDrop := MyDragDrop;
    img.OnMouseDown := MyMouseDown;
    img.OnClick := ImgTemplateClick;
    qryBilder.Next;
  end;
end;

//Prozedur für DragOver
procedure Form1.MyDragOver
  (Sender, Source: TObject;
  X, Y: Integer; State: TDragState;
  var Accept: Boolean);
begin
  Accept := (Source is TImage);
end;

// Prozedur für DragDrop
procedure Form1.MyDragDrop
  (Sender, Source: TObject; X, Y: Integer);
var
  tImg: TImage;
  Picx, Picy : integer;
begin
  Picx := (Sender as TImage).Tag;
  Picy := (Source as TImage).Tag;
  tImg := TImage.Create(Self);
  tImg.AutoSize := false;
  tImg.Stretch := true;
  tImg.Picture.Assign((Sender as TImage).Picture); // Ziel-Bild zwischenspeichern
  if Source is TImage then
    try
      (Sender as TImage).Picture.Assign((Source as TImage).Picture);
      (Source as TImage).Picture.Assign(tImg.Picture); // Zwischengespeichertes Bild einfügen
      end;
    finally
      tImg.Free;
    end;
  LoadPics(PosDSet.FieldByName('ID').AsInteger); // LoadPics aufrufen und Bilder der entspr. Position in das Gridpanel erneut laden
end;

// Prozedur für MouseDown !!!!!!!!!!!!!! ACHTUNG Beim verschieben muss die CTRL-Taste gedrückt werden !!!!!!!!!!!!!!!!!!!!!!
procedure Form1.MyMouseDown(Sender: TObject; Button: TMouseButton; Shift:
  TShiftState; X, Y: Integer);
begin
  if ssCtrl in Shift then
    (Sender as TImage).BeginDrag(True);
end;
Nun kann ich per Drag & Drop die Bilder im Gridpanel verschieben, so daß sich einen neue Sortierreihenfolge (im Panel) ergibt.
Das funktioniert so weit auch.
Mein Problem ist nur, daß ich nicht weiß wie ich jetzt die Sortierreihenfolge in die Datenbank bekomme, so daß beim nächsten Aufruf die Bilder so sortiert sind,
wie sie auch im Gridpanel erscheinen.
Hat jemand einen Lösungsvorschlag?

himitsu 15. Mär 2011 09:34

AW: Bilder per Drag & Drop sortieren
 
Die aktuelle Position als weiteres Feld/Spalte in der DB speichern und dann beim Laden nach dieser Spalte sortieren.

needatip 15. Mär 2011 10:11

AW: Bilder per Drag & Drop sortieren
 
Ok, wie bekomme ich die aktuelle Position und wie weise ich sie dann den Bildern zu?
Es sind zum Teil 10-30 Bilder.
Kannst du mir vielleicht ein paar Zeilen posten? Danke.

stahli 15. Mär 2011 11:13

AW: Bilder per Drag & Drop sortieren
 
So habe ich das gelöst.

Ich lasse ein Panel beliebig verschieben und berechne immer "virtuelle" Soll-Positionen aller Panels.
Über einen Timer lasse ich alle Panels von schrittweise zur Sollpostion bewegen.
Wenn Drag&Drop beendet ist, werden die Zielpositionen festgeklopft, die Panels in einer TList nach X+Y-Position sortiert und die neue Reihenfolge gespeichert.

Ist insgesamt recht aufwendig, aber mir war es das wert...

needatip 17. Mär 2011 08:57

AW: Bilder per Drag & Drop sortieren
 
Das mit den Virtuellen Soll-Positionen ist mir zu kompliziert.
Wie bekomme ich die aktuelle Sortierreihenfolge nach DragDrop?
Bitte um Hilfe.

stahli 17. Mär 2011 09:38

AW: Bilder per Drag & Drop sortieren
 
Je nachdem, wie Deine Daten so aussehen ungefähr so:
- Die Images in eine TList speichern.
- Die TList-Items nach Top+Left-Werten sortieren.
- Den Images in der Reihenfolge in der TList den Pos-Wert zuweisen (entspricht List.IndexOf(MyImage)).
- Pos-Werte speichern.

needatip 18. Mär 2011 10:32

AW: Bilder per Drag & Drop sortieren
 
Jetzt funktionierts,
lese einfach die Sortiernummer der jeweiligen ID(Tag) aus, suche in der DB, ersetze die Sortiernummern
und lade die Bilder erneut in das Grid.

Danke nochmal.

Delphi-Quellcode:
procedure TForm1.MyDragDrop
  (Sender, Source: TObject; X, Y: Integer);
var
  tImg: TImage;
  Picx, Picy, Sort_Sender, Sort_Source: integer;
begin
  // Tags der Bilder
  Picx := (Sender as TImage).Tag; //1
  Picy := (Source as TImage).Tag; //5
  //  Sortiernummern der Bilder
  qryBilder.Locate('ID', Picx, []);
  Sort_Sender := qryBilder.FieldByName('SORT').AsInteger;
  qryBilder.Locate('ID', Picy, []);
  Sort_Source := qryBilder.FieldByName('SORT').AsInteger;
  tImg := TImage.Create(Self);
  tImg.AutoSize := false;
  tImg.Stretch := true;
  tImg.Picture.Assign((Sender as TImage).Picture); // Ziel-Bild zwischenspeichern
  if Source is TImage then
    try
      (Sender as TImage).Picture.Assign((Source as TImage).Picture);
      (Source as TImage).Picture.Assign(tImg.Picture); // Zwischengespeichertes Bild einfügen
      // Sortiernummern der jeweiligen ID(Tag) in die DB eintragen
      qryBilder.Locate('ID', Picx, []);
      qryBilder.Edit;
      qryBilder.FieldByName('SORT').AsInteger := Sort_Source;
      qryBilder.Locate('ID', Picy, []);
      qryBilder.Edit;
      qryBilder.FieldByName('SORT').AsInteger := Sort_Sender;
      qryBilder.Post;
    finally
      tImg.Free;
    end;
  LoadPics(PosDSet.FieldByName('ID').AsInteger);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz