![]() |
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:
Nun kann ich per Drag & Drop die Bilder im Gridpanel verschieben, so daß sich einen neue Sortierreihenfolge (im Panel) ergibt.
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; 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? |
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.
|
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. |
AW: Bilder per Drag & Drop sortieren
![]() 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... |
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. |
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. |
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 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz