Salute,
ich habe eine Listbox, in der die Reihenfolge der Items per Drag&Drop verändert werden kann. Die Listbox kann 10 Items im sichtbaren Bereich aufnehmen. Die Restlichen müssen sich "erscrollt" werden. Das klappt auch alles.
Hier das Problem:
Wenn ich nun das Item[1] an die letzte Position der Listbox setzen möchte (z.B. die 40. Position), dann wird im Augenblick "nach oben oder unten gescrollt" und bei einem Drop die Position der ListBox ermittelt. Da aber bei der 40. Position die Listbox gescrollt wurde stimmen xy Werte der Listbox mehr und der Drop erfolgt an einer FALSCHEN Stelle....
<PRE>
procedure Ttouren_sortieren_Form.SORT_PieListDragDrop(Sender ,
Source: TObject; X, Y: Integer);
var
iTemp: integer;
ptTemp: TPoint;
szTemp: string;
begin
try
ptTemp.x := x;
ptTemp.y := y;
iTemp := 0;
while iTemp <= TPieList(Source).Items.Count - 1 do
begin
if TPieList(Source).selected[iTemp] then
begin
with Sender as TPieList do
begin
szTemp := TPieList(Source).items[iTemp];
TPieList(Source).items.Delete(iTemp);
items.Insert(itemAtPos(ptTemp, true), szTemp);
end;
end;
inc(iTemp);
end;
//////////////////////////////////////////////////////////////////////////
// Sortierung wird abgespeichert
Update_Position(main_form.Str_Tour_Name);
except
touren_sortieren_Form.OnShow(self);
MessageDlg('Ungültige Position angegeben !', mtError, [mbOk], 0);
end;
end;
---------------------------------------------------------------------
DAS AUTOMATISCHE SCROLLEN LIEGT AUF EINEM TIMER
procedure Ttouren_sortieren_Form.Timer1Timer(Sender: TObject);
var
pt: TPoint;
begin
GetCursorPos(pt);
pt := ScreenToClient(pt);
with SORT_PieList.Boundsrect, pt do
if (x > left) and (x < right) then begin
if y< top then
SORT_PieList.perform(WM_VSCROLL, SB_LINEUP, 0)
else if y > bottom then
SORT_PieList.perform(WM_VSCROLL, SB_LINEDOWN, 0)
else
timer1.enabled := false;
end
else
timer1.enabled := false;
end;
procedure Ttouren_sortieren_Form.FormDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
accept := false;
if State = dsDragLeave then
timer1.enabled := false
else
if (Source is TPieList) then
begin
with TPieList(Source).boundsrect do
timer1.enabled := (x > left) and (x < right) and
((y< top) or (y > bottom))
end;
end;
procedure Ttouren_sortieren_Form.FormCreate(Sender: TObject);
begin
Timer1.enabled := false;
Timer1.Interval := 100;
end;
</PRE>
Vielleicht könnt IHR mir weiterhelfen....?
THX
WEBSTER
ich habe eine Listbox, in der die Reihenfolge der Items per Drag&Drop verändert werden kann. Die Listbox kann 10 Items im sichtbaren Bereich aufnehmen. Die Restlichen müssen sich "erscrollt" werden. Das klappt auch alles.
Hier das Problem:
Wenn ich nun das Item[1] an die letzte Position der Listbox setzen möchte (z.B. die 40. Position), dann wird im Augenblick "nach oben oder unten gescrollt" und bei einem Drop die Position der ListBox ermittelt. Da aber bei der 40. Position die Listbox gescrollt wurde stimmen xy Werte der Listbox mehr und der Drop erfolgt an einer FALSCHEN Stelle....
<PRE>
procedure Ttouren_sortieren_Form.SORT_PieListDragDrop(Sender ,
Source: TObject; X, Y: Integer);
var
iTemp: integer;
ptTemp: TPoint;
szTemp: string;
begin
try
ptTemp.x := x;
ptTemp.y := y;
iTemp := 0;
while iTemp <= TPieList(Source).Items.Count - 1 do
begin
if TPieList(Source).selected[iTemp] then
begin
with Sender as TPieList do
begin
szTemp := TPieList(Source).items[iTemp];
TPieList(Source).items.Delete(iTemp);
items.Insert(itemAtPos(ptTemp, true), szTemp);
end;
end;
inc(iTemp);
end;
//////////////////////////////////////////////////////////////////////////
// Sortierung wird abgespeichert
Update_Position(main_form.Str_Tour_Name);
except
touren_sortieren_Form.OnShow(self);
MessageDlg('Ungültige Position angegeben !', mtError, [mbOk], 0);
end;
end;
---------------------------------------------------------------------
DAS AUTOMATISCHE SCROLLEN LIEGT AUF EINEM TIMER
procedure Ttouren_sortieren_Form.Timer1Timer(Sender: TObject);
var
pt: TPoint;
begin
GetCursorPos(pt);
pt := ScreenToClient(pt);
with SORT_PieList.Boundsrect, pt do
if (x > left) and (x < right) then begin
if y< top then
SORT_PieList.perform(WM_VSCROLL, SB_LINEUP, 0)
else if y > bottom then
SORT_PieList.perform(WM_VSCROLL, SB_LINEDOWN, 0)
else
timer1.enabled := false;
end
else
timer1.enabled := false;
end;
procedure Ttouren_sortieren_Form.FormDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
accept := false;
if State = dsDragLeave then
timer1.enabled := false
else
if (Source is TPieList) then
begin
with TPieList(Source).boundsrect do
timer1.enabled := (x > left) and (x < right) and
((y< top) or (y > bottom))
end;
end;
procedure Ttouren_sortieren_Form.FormCreate(Sender: TObject);
begin
Timer1.enabled := false;
Timer1.Interval := 100;
end;
</PRE>
Vielleicht könnt IHR mir weiterhelfen....?
THX
WEBSTER
Comment