AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bilder per Drag & Drop sortieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bilder per Drag & Drop sortieren

Ein Thema von needatip · begonnen am 15. Mär 2011 · letzter Beitrag vom 18. Mär 2011
Antwort Antwort
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#1

Bilder per Drag & Drop sortieren

  Alt 15. Mär 2011, 10:14
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bilder per Drag & Drop sortieren

  Alt 15. Mär 2011, 10:34
Die aktuelle Position als weiteres Feld/Spalte in der DB speichern und dann beim Laden nach dieser Spalte sortieren.
$2B or not $2B
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Bilder per Drag & Drop sortieren

  Alt 15. Mär 2011, 11:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Bilder per Drag & Drop sortieren

  Alt 15. Mär 2011, 12:13
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...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Bilder per Drag & Drop sortieren

  Alt 17. Mär 2011, 09:57
Das mit den Virtuellen Soll-Positionen ist mir zu kompliziert.
Wie bekomme ich die aktuelle Sortierreihenfolge nach DragDrop?
Bitte um Hilfe.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Bilder per Drag & Drop sortieren

  Alt 17. Mär 2011, 10:38
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Bilder per Drag & Drop sortieren

  Alt 18. Mär 2011, 11:32
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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