Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prozedur Move verschiebt nichts (https://www.delphipraxis.net/88762-prozedur-move-verschiebt-nichts.html)

Nils_13 20. Mär 2007 16:20


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]));

Muetze1 20. Mär 2007 16:26

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:
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;
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.

Und zu deinem eigentlichen Problem: Punktrechnung geht vor Strichrechnung!

Nils_13 20. Mär 2007 16:51

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;

Muetze1 20. Mär 2007 19:11

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.

Nils_13 20. Mär 2007 19:24

Re: Prozedur Move verschiebt nichts
 
Die werden bei mir nicht mit verschoben.

Nils_13 21. Mär 2007 17:23

Re: Prozedur Move verschiebt nichts
 
Ich habe die Move-Zeile in der Schleife aktualisiert:
Delphi-Quellcode:
Move(fFiles[i], fFiles[i-verschieben], SizeOf(fFiles[i]));
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.

Muetze1 21. Mär 2007 19:27

Re: Prozedur Move verschiebt nichts
 
Zitat:

Zitat von Nils_13
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.

Weil du dein Array nicht verkleinerst?

ODER meinst du die ganze Zeit mit "verschieben" nicht das verschieben der Einträge sondern das tauschen?

Nils_13 22. Mär 2007 17:13

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 :)

Muetze1 23. Mär 2007 00:48

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 15:28 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