Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - 2 Array Items miteinander Vertauschen


R4id - Fr 21.08.09 21:29
Titel: 2 Array Items miteinander Vertauschen
Hallo.

Ich hab hier eine Klasse:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TVGUIGameMenuItem = class(TObject)
  private
    FID: Integer;
    FName: string;
    FCommand: string;
    FOnlyInGame: Boolean;
  public
    constructor Create(); overload;
    constructor Create(const ID: Integer; const Name, Command: stringconst OnlyInGame: Boolean); overload;

    function AsString(): string;

    property ID: Integer read FID write FID;
    property Name: string read FName write FName;
    property Command: string read FCommand write FCommand;
    property OnlyInGame: Boolean read FOnlyInGame write FOnlyInGame;
  end;
und das dazu gehörige Array:

Delphi-Quelltext
1:
2:
type
  TVGUIGameMenuItems = array of TVGUIGameMenuItem;
Wenn ich nun 2 Items in diesem Array habe, wie kann ich diese miteinander vertauschen?
Beispiel:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  Array[0] = ID:         0
             Name:       'Index 0'
             Command:    'cmd'
             OnlyInGame: true

  Array[1] = ID:         1
             Name:       'Index 1'
             Command:    'cmd'
             OnlyInGame: false
Diese 2 Items sollen nun miteinander vertauscht werden.

Ich hab mir hier schon mal eine Procedure zusammen "gewürfelt", bin mir aber nicht sicher ob diese 100% fehler frei funktioniert (Ich meine mit dem Speicher [Memory], und Access Violation).

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure SwitchItems(var AArray: TVGUIGameMenuItems; const AIndex1, AIndex2: Integer);
var
  Item1, Item2: Pointer;
begin
  Item1 := Pointer(AArray[AIndex1]);
  Item2 := Pointer(AArray[AIndex2]);

  AArray[AIndex1] := TVGUIGameMenuItem(Item2);
  AArray[AIndex2] := TVGUIGameMenuItem(Item1);
end;


Gruß


jaenicke - Fr 21.08.09 21:34

Was spricht gegen die normale Vorgehensweise ohne die ganzen unnötigen Casts usw.? :gruebel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure SwitchItems(var AArray: TVGUIGameMenuItems; const AIndex1, AIndex2: Integer);
var
  TempItem: TVGUIGameMenuItem;
begin
  TempItem := AArray[AIndex1];
  AArray[AIndex1] := AArray[AIndex2];
  AArray[AIndex2] := TempItem;
end;


R4id - Sa 22.08.09 12:51

Ich hatte immer eine Access Violation bei dieser Variante, lag aber daran das ich auf einen ungelültigen Index zugreifen wollt.

Danke!

Gruß


Dude566 - Sa 22.08.09 14:05

Das ist im Prinzip wie beim Bubblesort wo auch eine Hilfsvariable hinzugezogen wird um beide auszutauschen, nachdem verglichen wurde ob Variable1 größer als Variable2 ist.


R4id - Sa 22.08.09 16:21

Darauf hätt ich auch kommen können, mir da was abgucken zukönnen ^^

Gruß