Einzelnen Beitrag anzeigen

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