AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language aus einer Liste Einträge in eine andere Liste verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

aus einer Liste Einträge in eine andere Liste verschieben

Ein Thema von Bjoerk · begonnen am 11. Sep 2014 · letzter Beitrag vom 14. Sep 2014
Antwort Antwort
Seite 1 von 3  1 23      
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 15:48
Delphi-Version: 2007
Ich möchte aus einer Liste Einträge in eine andere Liste übertragen und gleichzeitig aus der alten Liste raus löschen. Das tue ich deshalb weil der einzige in der alten Liste verbleibende Eintrag ein wichtiges Ergebnis ist. Bis jetzt ist es mir nicht gelungen..
Delphi-Quellcode:
procedure TPolygonTriangles.Flip;
var
  k1, k2, I, J: integer;
  SCur, SNew: double;
  ACur, BCur, ANew, BNew: TFLoatPoints;
begin
  ACur := TFLoatPoints.Create;
  BCur := TFLoatPoints.Create;
  ANew := TFLoatPoints.Create;
  BNew := TFLoatPoints.Create;
  try
    for k1 := 0 to Count - 2 do
      for k2 := k1 + 1 to Count - 1 do
      begin
        ACur.Clear;
        BCur.Clear;
        ANew.Clear;
        BNew.Clear;
        ACur.Add(Item[k1].A);
        ACur.Add(Item[k1].B);
        ACur.Add(Item[k1].C);
        BCur.Add(Item[k2].A);
        BCur.Add(Item[k2].B);
        BCur.Add(Item[k2].C);
        I := 0;
        J := 0;
        while I < ACur.Count do
        begin
          while J < ACur.Count do
          begin
            if Util_SameFloatPoint(ACur[I], BCur[J]) then
            begin
              // ShowMessage(Format('ACur(I) %.4f %.4f', [ACur[I].X, ACur[I].Y]));
              // ShowMessage(Format('BCur(J) %.4f %.4f', [BCur[J].X, BCur[J].Y]));
              ANew.Add(ACur[I]);
              BNew.Add(BCur[J]);
              // ShowMessage('IndexOf ACur ' + IntToStr(ACur.IndexOf(ACur[I])));
              // ShowMessage('IndexOf BCur ' + IntToStr(BCur.IndexOf(BCur[J])));
              ACur.Del(ACur.IndexOf(ACur[I]));
              BCur.Del(BCur.IndexOf(BCur[J]));
              Dec(I); // *** Kann nicht stimmen, aber wie ???
              Dec(J);
            end;
            Inc(J);
          end;
          Inc(I);
        end;
        if (ANew.Count = 2) then // Adjacent;
        begin
          SCur := Util_FloatPointDistance(ANew[0], ANew[1]);
          SNew := Util_FloatPointDistance(ACur[0], BCur[0]);
          if SCur / SNew > 1.5 then
          begin
            Item[k1].A := ANew[0];
            Item[k1].B := ACur[0];
            Item[k1].C := BCur[0];
            Item[k2].A := ACur[0];
            Item[k2].B := ANew[1];
            Item[k2].C := BCur[0];
          end;
        end;
      end;
  finally
    ACur.Free;
    BCur.Free;
    ANew.Free;
    BNew.Free;
  end;
end;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 15:52
Delphi-Quellcode:
For i:= list.count-1 downto 0 do
  if SatisfiesMoveCondition(List.Item[i]) then begin
    NewList.Append(List.Item[i]);
    List.RemoveItem(i);
  end
Das mal so -wie immer mit jugendlichem Leichtsinn- als generelles Pattern, wie man z.B. aus einer Liste während des Durchlaufens Elemente entfernen kann. Trick ist hier, das man rückwärts läuft. Würde man vorwärts laufen, würde man beim Löschen das jeweils nächste Element überspringen.

Wie ich sehe, läufst Du vorwärts durch. Du hast zwar bemerkt, das Du ein Element überspringen wirst, aber scheinbar klappt das nicht. Genau hab ich mir das aber jetzt angeschaut....

Noch ein Tipp: Alles, was ausgelagert werden kann, auslagern. Damit meine ich, in eine kleine separate Prozedur packen. Delphi macht das mit den Refactoring-Werkzeugen von ganz alleine.

PS: Was genau das Problem ist, wäre noch lustig, zu wissen.

Geändert von Dejan Vu (11. Sep 2014 um 15:55 Uhr)
  Mit Zitat antworten Zitat
-=ZGD=-

Registriert seit: 25. Apr 2006
Ort: Bad Aibling
105 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 15:53
Downto..

Edit..Oh, da war einer schneller..
Stefan Michalk
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#4

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 16:06
BTW: 4 Instanzierungen vor dem try sind gewagt, das kann zu Speicherlecks führen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 16:48
Das Ding ist, daß sowohl i als auch j gleichzeitig verändert werden. Da hilft auch kein downto (wie sonst üblich).
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 18:34
Nur mal so gefragt:

Ist

BCur.Del(BCur.IndexOf(BCur[J])); nicht einfach

BCur.Del(J) ?


Generell kann man sich in dem Fall vllt. die zu löschenden Indizes in einer Liste/Array merken und dann nachher löschen, z.B. in einer eigenen Prozedur DeleteFromList(indexe : array of integer) oder sowas.
Ralph
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 19:14
Weiß nicht mehr, würde sagen ja. Habs jetzt auch "anständig" gemacht, da sieht die Flip auch schon wesentlich gemütlicher aus. Flip bedeutet Kantenflip bei benachbarten Dreiecken, die zusammen eine Raute bilden. Da werden die beiden Dreiecke in der anderen Möglichkeit diese Raute zu bilden angeordnet, falls ein gewisses Seitenverhältnis überschritten ist.

Delphi-Quellcode:
function TPolygonTriangle.IndexOf(const Value: TFLoatPoint): integer;
begin
  Result := -1;
  if Util_SameFloatPoint(Value, A) then
    Result := 0
  else
    if Util_SameFloatPoint(Value, B) then
      Result := 1
    else
      if Util_SameFloatPoint(Value, C) then
        Result := 2;
end;

function TPolygonTriangle.Compare(const Value: TPolygonTriangle): boolean;
begin
  Result := (IndexOf(Value.A) > 0) and (IndexOf(Value.B) > 0)
    and (IndexOf(Value.C) > 0)
end;

function TPolygonTriangle.Adjacent(const Value: TPolygonTriangle): boolean;
begin
  Result := (IndexOf(Value.A) > 0) and (IndexOf(Value.B) > 0)
    or (IndexOf(Value.A) > 0) and (IndexOf(Value.C) > 0)
    or (IndexOf(Value.B) > 0) and (IndexOf(Value.C) > 0);
end;

function TPolygonTriangle.FirstAdjacent(const Value: TPolygonTriangle): TFloatPoint;
var
  I, J: integer;
  P1, P2: array[0..2] of TFloatPoint;
begin
  // Self and Value müssen Adjacent Items sein;
  Result.Clear;
  P1[0] := A;
  P1[1] := B;
  P1[2] := C;
  P2[0] := Value.A;
  P2[1] := Value.B;
  P2[2] := Value.C;
  for I := 0 to 2 do
    for J := 0 to 2 do
      if Util_SameFloatPoint(P1[I], P2[J]) then
      begin
        Result := P1[I];
        Exit;
      end;
end;

function TPolygonTriangle.SecondAdjacent(const Value: TPolygonTriangle): TFLoatPoint;
var
  I, J: integer;
  P1, P2: array[0..2] of TFloatPoint;
begin
  // Self and Value müssen Adjacent Items sein;
  Result.Clear;
  P1[0] := A;
  P1[1] := B;
  P1[2] := C;
  P2[0] := Value.A;
  P2[1] := Value.B;
  P2[2] := Value.C;
  for I := 0 to 2 do
    for J := 0 to 2 do
      if Util_SameFloatPoint(P1[I], P2[J]) then
        Result := P1[I];
end;

function TPolygonTriangle.NotAdjacent(const Value: TPolygonTriangle): TFLoatPoint;
var
  P1, P2: TFloatPoint;
begin
  // Self and Value müssen Adjacent Items sein;
  P1 := FirstAdjacent(Value);
  P2 := SecondAdjacent(Value);
  if (not Util_SameFloatPoint(P1, A)) and (not Util_SameFloatPoint(P2, A)) then
    Result := A
  else
    if (not Util_SameFloatPoint(P1, B)) and (not Util_SameFloatPoint(P2, B)) then
      Result := B
    else
      Result := C;
end;


// ..

procedure TPolygonTriangles.Flip;
var
  I, J: integer;
  SCur, SNew: double;
  A1, A2, A3, B3: TFLoatPoint;
begin
  for I := 0 to Count - 2 do
    for J := I + 1 to Count - 1 do
      if Item[I].Adjacent(Item[J]) then
      begin
        A1 := Item[I].FirstAdjacent(Item[J]);
        A2 := Item[I].SecondAdjacent(Item[J]);
        A3 := Item[I].NotAdjacent(Item[J]);
        B3 := Item[J].NotAdjacent(Item[I]);
        SCur := Util_FloatPointDistance(A1, A2);
        SNew := Util_FloatPointDistance(A3, B3);
        if SCur / SNew > 1.5 then
        begin
          Item[I].A := A1;
          Item[I].B := A3;
          Item[I].C := B3;
          Item[J].A := A3;
          Item[J].B := A2;
          Item[J].C := B3;
        end;
      end;
end;
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#8

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 20:30
Zitat: "die zusammen eine Raute bilden"

Du entwickelst also für das Kanzleramt/Murksel?

SCNR als ich "Raute" lesen musste

Tschulldigung!
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 11. Sep 2014, 22:15
BTW: 4 Instanzierungen vor dem try sind gewagt, das kann zu Speicherlecks führen.
Vielleicht etwas blöde Frage, aber warum? Nicht das ich es jetzt auch machen würde, aber es interessiert mich nur einmal.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#10

AW: aus einer Liste Einträge in eine andere Liste verschieben

  Alt 12. Sep 2014, 08:09
Hier habe ich neulich einmal ein paar Beispiele skizziert: http://forum.delphi-treff.de/index.p...-verschachteln
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 14:51 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