AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozedur Move verschiebt nichts

Ein Thema von Nils_13 · begonnen am 20. Mär 2007 · letzter Beitrag vom 23. Mär 2007
Antwort Antwort
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#1

Prozedur Move verschiebt nichts

  Alt 20. Mär 2007, 17:20
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]));
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Prozedur Move verschiebt nichts

  Alt 20. Mär 2007, 17:26
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!
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#3

Re: Prozedur Move verschiebt nichts

  Alt 20. Mär 2007, 17:51
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;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Prozedur Move verschiebt nichts

  Alt 20. Mär 2007, 20:11
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.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#5

Re: Prozedur Move verschiebt nichts

  Alt 20. Mär 2007, 20:24
Die werden bei mir nicht mit verschoben.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#6

Re: Prozedur Move verschiebt nichts

  Alt 21. Mär 2007, 18:23
Ich habe die Move-Zeile in der Schleife aktualisiert:
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Prozedur Move verschiebt nichts

  Alt 21. Mär 2007, 20:27
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?
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#8

Re: Prozedur Move verschiebt nichts

  Alt 22. Mär 2007, 18:13
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Prozedur Move verschiebt nichts

  Alt 23. Mär 2007, 01:48
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:31 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