![]() |
Prozedur Move verschiebt nichts
Hi,
ich benötige die Prozedur Move, um ein Array aktuell zu halten, wenn der Benutzer mehrere Einträge/einen Eintrag in einer Listbox verschiebt. Ich habe ein Array of String namens fFiles. Der folgende Code, welcher testen soll, ob Move mit diesen Parametern funktioniert, zeigt, so dass er nicht funktioniert. Warum ?
Delphi-Quellcode:
var i, v : Integer;
begin i := 5; v := 2; Move(fFiles[i], fFiles[i - v], (i - v) - i * SizeOf(fFiles[i])); |
Re: Prozedur Move verschiebt nichts
Du willst alle Einträge nach dem 5. runterschieben auf den 3. Eintrag (also 2 runter). Ok, Quelle und Ziel sind ok, aber was ist mit der Anzahl der Einträge? Du willst nicht die Grösse des Blockes nach unten verschieben sondern alle nach dem 5. Eintrag bis zum Ende des Arrays enthaltenen Elemente!
Delphi-Quellcode:
Ich habe deinen Code abgeändert, da I und V schlecht aussagekräftig waren und wohl auch was anderes meinten bei dir! Also den Code nicht ohne draufschauen übernehemen.
var i, v : Integer;
begin i := 5; // ab index i ... v := 2; // ... v Einträge löschen Move(fFiles[i+v], fFiles[i], ( Length(fFiles) - i - v )* SizeOf(fFiles[i])); end; Und zu deinem eigentlichen Problem: Punktrechnung geht vor Strichrechnung! |
Re: Prozedur Move verschiebt nichts
Hm... Die Klammern habe ich doch richtig gesetzt ?
Delphi-Quellcode:
procedure TfrmMain.lbListDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); var verschieben, ItemPos, i : Integer; begin if (Source is TNoScrollListBox) and ((Source as TNoScrollListBox).SelCount > 0) then with Source as TNoScrollListBox do begin ItemPos := ItemAtPos(point(x, y), true); if (ItemPos < 0) or (ItemPos >= Items.Count) then exit; if Selected[ItemPos] then ItemIndex := ItemPos; verschieben := ItemIndex - ItemPos; if verschieben <> 0 then begin if verschieben > 0 then i := 0 else i := Pred(Items.Count); while (i >= 0) and (i < Items.Count) do begin if Selected[i] then begin if (i- verschieben >= 0) and (i - verschieben < Items.Count) then begin Items.Move(i, i - verschieben); Move(fFiles[i], fFiles[i - verschieben], (i - verschieben) - i * SizeOf(fFiles[i])); Selected[i] := False; Selected[i- verschieben] := True; end else Break; end; if verschieben > 0 then inc(i) else dec(i); end; end; Accept:= True end else Accept:= False; end; |
Re: Prozedur Move verschiebt nichts
1. Du verschiebst in einer Schleife, also warum verschiebst du dann mit Move() mehr als ein Eintrag? Es sollte pro Eintrag einfach nur SizeOf(String) sein - da musst du nichts mehr mit rumrechnen.
2. Du willst die Aktionen beim Drag'n'Drop bei der ScrollListBox in deinem Files Array nachbilden. Warum? ScrollListBox hat doch bestimmt auch eine Objekt bzw. Data Eigenschaft pro Eintrag. Somit hänge dort eine Instanz ran, welche die Informationen aus fFiles[] enthält. Diese werden somit beim Drag'n'Drop mit verschoben und haben somit immer die richtige Position. |
Re: Prozedur Move verschiebt nichts
Die werden bei mir nicht mit verschoben.
|
Re: Prozedur Move verschiebt nichts
Ich habe die Move-Zeile in der Schleife aktualisiert:
Delphi-Quellcode:
Warum rücken die Einträge, welche nach dem zu verschiebenden nicht nach ? Beispiel: Position 3 enthält Lied A, verschiebt man Lied A auf Position 2, enthält Position 3 immer noch Lied A und es ist somit nichts aufgerutscht.
Move(fFiles[i], fFiles[i-verschieben], SizeOf(fFiles[i]));
|
Re: Prozedur Move verschiebt nichts
Zitat:
ODER meinst du die ganze Zeit mit "verschieben" nicht das verschieben der Einträge sondern das tauschen? |
Re: Prozedur Move verschiebt nichts
Ich möchte die Einträge vertauschen. Beispiel:
LiedA LiedB LiedC LiedC soll an die Stelle von LiedA verschoben werden: LiedC LiedA LiedB Das ist mein Ziel :) |
Re: Prozedur Move verschiebt nichts
Ok, dann ganz anders:
1. Inhalt Pos C in einer temporären Variable sichern. 2. Liste verschieben 3. Inhalt von temporärer Variable in freigewordene neue Position kopieren. Du musst so oder so sichern als Zwischenschritt, ohne tempoärere Variable kommst du nicht aus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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