![]() |
Re: Drag and drop
Hallo
Zitat:
Zitat:
Zitat:
Mfg Frank |
Re: Drag and drop
Hi Keldorn,
die zweite Antwort von Dir wollte ich so umsetzen:
Delphi-Quellcode:
Irgendwo ist da mindestens ein Fehler. :shock: 1. kann ich nicht über das i gehen, da die beiden Listboxen unterschiedlich viele Elemente haben können.
procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
var i : integer; lbSource,lbSender : TListBox; begin lbSource := Source as TListBox; lbSender := Sender as TListbox; for i := 0 to lbSender.count-1 do begin if lbSource.Selected [i] then begin lbSender.Items.Add(lbSource.Items[i(*lbSource.ItemIndex*)]); lbSource.Items.Delete (lbSender.ItemIndex); end; end; end;
Delphi-Quellcode:
kann wohl nicht gehen, sofern lbSource weniger Elemente hat als der Wert von lbSender.ItemIndex. Mir fällt leider nichts ein, was ich da machen könnte. Auch wenn ich 2 oder mehr Zeilen in der einen Listbox markiert habe und sie in die andere ziehen will, wird immer nur eine übernommen. Und noch eine Kleinigkeit: markieren kann ich nur mit SHIFT+Pfeil. Mit der Maus geht das nicht.
lbSource.Items.Delete (lbSender.ItemIndex);
Der modifizierte Code für zwei Stringgrids sieht nun so aus:
Delphi-Quellcode:
Allerdings wird er nicht compiliert. Wie oben zu sehen ist kommt "Fehler bei Typumwandlung". Ansonsten ist der Code ob ListBox oder Stringgrid fast identisch. In beiden Fällen habe ich das MouseDown allerdings eliminiert. Damit das funktioniert muß Dragmode im OI von dmManual auf dmAutomatic umgestellt werden.
unit StrTestUnit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls; type TStringGridExt = class(TStringGrid) protected procedure InsertRow(ARow: Longint); procedure DeleteRow(ARow: Longint); end; TForm2 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Button2: TButton; StringGrid2: TStringGrid; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer); procedure StringGrid2DragDrop(Sender, Source: TObject; X, Y: Integer); procedure StringGrid2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); private {...} public {...} end; var Form2: TForm2; implementation {$R *.DFM} procedure TStringGridExt.InsertRow(ARow: Longint); var TempRow: Integer; begin TempRow := Row; // Zeile zwischenspeichern while ARow < FixedRows do ARow := ARow + 1; RowCount := RowCount + 1; MoveRow(RowCount - 1, ARow); Row := TempRow; Rows[Row].Clear; end; procedure TStringGridExt.DeleteRow(ARow: Longint); var GemRow: Integer; begin GemRow := Row; if RowCount > FixedRows + 1 then inherited DeleteRow(ARow) else Rows[ARow].Clear; if GemRow < RowCount then Row := GemRow; end; procedure TForm2.Button1Click(Sender: TObject); begin TStringGridExt(StringGrid1).InsertRow(1); end; procedure TForm2.Button2Click(Sender: TObject); begin TStringGridExt(StringGrid1).DeleteRow(1); end; procedure TForm2.StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := true; //Source is TStringGridExt; end; procedure TForm2.StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer); var lbSource,lbSender : TStringGridExt; begin lbSource := Source as TStringGridExt; // FEHLER BEI TYPUMWANDLUNG lbSender := Sender as TStringGridExt; lbSender.InsertRow (lbSender.Row); lbSource.DeleteRow (lbSource.Row); end; procedure TForm2.StringGrid2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := true; //Source is TStringGridExt; end; procedure TForm2.StringGrid2DragDrop(Sender, Source: TObject; X, Y: Integer); var lbSource,lbSender : TStringGridExt; begin lbSource := Source as TStringGridExt; lbSender := Sender as TStringGridExt; lbsender.InsertRow (lbSender.Row); lbSource.DeleteRow (lbSource.Row); end; end. |
Re: Drag and drop
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Hansa
da ist ein Fehler drin (for i := 0 to lbSender.count-1 do begin - muß lbsource sein! ) und der schleifenaufbau mit einer for-schleife vorwärts führt dich eh in eine exception, rest sthet im Quelltext
Delphi-Quellcode:
procedure TForm1.ListBoxDragDrop(Sender, Source: TObject; X, Y: Integer);
//Procedure einmal in einer Listbox erstellt und umbenannt (1 entfernt) var i,i2 : integer; lbSource,lbSender : TListBox; begin lbSource := Source as TListBox; lbSender := Sender as TListbox; //Drag and drop der gleichen LB verhindern if lbSource <> lbSender then begin //items kopieren //du löschst items, deswegen müßte die for Schleife rückwärts zählen, dann würden die itmes aber spiegelverkehrt hinzugefügt //ich nehm da lieber eine while schleife, eine for-schleife macht dir das leben schwerer (finde ich) i:=0; while i<=lbSource.count-1 do //hier muß Source stehen, du willst von source nach Sender! begin if lbSource.Selected [i] then begin //Variante 1 = hinzufügen //lbSender.Items.Add(lbSource.Items[i]); //Variante 2 = Einfügen i2:=lbSender.ItemAtPos(point(x,y),false); lbSender.Items.insert(i2,lbSource.Items[i]); //Einträge in sourceListbox löschen lbSource.Items.Delete (i); continue; //inc(i) "überspringen" und mit gleichem item (wegen Löschung) weiterarbeiten end; inc(i); end; end; end; Zitat:
Zitat:
Delphi-Quellcode:
auch hier würdest du nurt eine Zeile hinzufügen, willst du mit alle markierten arbeiten willst, kannst du mit stringgrid-selection arbeiten um rauszufinden, welche Zellen markiert sind.
procedure TForm1.StringGridDragDrop(Sender, Source: TObject; X,
Y: Integer); Var StSource,StSender:TStringGrid; begin StSource := Source as TStringGrid; StSender := Sender as TStringGrid; //Zeile einfügen TStringGridExt(StSender).InsertRow (StSender.Row); //datenkopieren StSender.Rows[StSender.Row].Assign(StSource.Rows[StSource.Row]); //zeile löschen TStringGridExt(StSource).DeleteRow (StSource.Row); end; Beim stringrid ist bei mir das Problem, das wenn dmautomatic gesetzt ist, ich keine selektierungen mehr machen kann. sämtliche Klicks läßt es kalt und es will sofort draggen. da hab ich moment aber auch keine richtige Idee. ansonsten hab ich mein Probeprojekt mal hinzu gefügt Mfg Frank |
Re: Drag and drop
Hi,
damit bin ich schon einen ganzen Schritt weiter. :thuimb: Ich benutze aber nur noch das StringGrid. Die Listbox ist doch zu schwach. Jetzt sind aber noch ein paar Sachen nicht richtig. Ich kann eine Zeile in einen Bereich eines Grids ziehen, wo nichts ist. Dann kommt Exception. Ich vermute, daß das mit dem RowCount zu tun hat, oder irgendwo wird noch falsch gezählt. Mehrere Zeilen zu markieren und zu verschieben ist mir auch noch nicht gelungen. 8) |
Re: Drag and drop
Zitat:
habs jetzt anders gemacht, bei mir wird das nix mit dragmode=dmautomatic, da ich dann nix mehr auswählen kann. also wieder dmmanuel und im mousedown der Grids:
Delphi-Quellcode:
und die drag-methoden (erlauben auch mehrere Zeilen):
procedure TForm1.StringGridMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin TStringGrid(Sender).BeginDrag(false,10); end;
Delphi-Quellcode:
ich füge die Zeilen an den betreffenden Stellen ein, nur am Ende anhängen is doof :)
procedure TForm1.StringGridDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean); begin //Drag and drop im gleichem Stringgrid nichtakzeptieren accept := (Source is TStringGrid) and (source<>Sender); end; procedure TForm1.StringGridDragDrop(Sender, Source: TObject; X, Y: Integer); Var StSource,StSender:TStringGrid; RowVon, RowBis,i,destrow,dummy :integer; begin StSource := Source as TStringGrid; StSender := Sender as TStringGrid; //welche Zeilen sind im Source ausgewählt rowVon := StSource.Selection.top; rowBis := StSource.Selection.Bottom; //wohin einfügen? StSender.MouseToCell(x,y,dummy,destrow); //da immer nur eine zusammenhängende Markierung möglich ist, gehts hier mit For einfacher //aber rückwärts, wegen dem löschen for i:=rowbis downto Rowvon do begin //Zeile einfügen oder anhängen if destrow=-1 then begin //anhängen StSender.RowCount:=StSender.RowCount+1; //datenkopieren StSender.Rows[StSender.RowCount-1].Assign(StSource.Rows[i]); end else begin //einfügen TStringGridExt(StSender).InsertRow (destrow); //datenkopieren StSender.Rows[destrow].Assign(StSource.Rows[i]); end; //zeile löschen TStringGridExt(StSource).DeleteRow (i); end; end; mit diesem Code geht aber dein insertrow nicht mehr richtig. habs auch noch geändert:
Delphi-Quellcode:
Mfg Frank
procedure TStringGridExt.InsertRow(ARow: Longint);
var i:integer; begin RowCount := RowCount + 1; for i:=RowCount-1 downto arow do rows[i].Assign(rows[i-1]); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 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