Einzelnen Beitrag anzeigen

Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Array an procedure übergeben

  Alt 28. Dez 2003, 00:23
Zitat von himitsu:
Delphi hat mit zwar gleichen Typendeklaration einige Progleme.
Das beschriebene Problem konnte ich ja nun mittlerweile lösen, jetzt tritt für mich aber erneut ein (wahrscheinlich) ähnlich geartetes Problem auf - sind meine ersten Versuche mit Klassen und Objekten:

Delphi-Quellcode:
unit AKarten;
// Klasse der Aktionskarten
interface
uses DXDraws, DXClass,DXSprite, SysUtils, EKarten;

Type TACard = class(TImageSpriteEx)
// Felder
private
    fname: String; // Kartenname;
    fed: String; // Kürzel der Edition, z.B. 'WC'
    fnummer: String; // Nummer der Karte, z.B. 39
    fcid : integer; // lfd. Nummer im Stapel
    fcowner: integer; // Spieler, der die Karte besitzt
  // Methoden
    function getName: String;
    procedure setName(Name: String);
    function getED: String;
    procedure setED(Edition: String);
    function getNummer: String;
    procedure setNummer(Nummer: String);
    function getCID: integer;
    procedure setCID(CID: integer);
    function getCOwner: integer;
    procedure setCOwner(COwner: integer);
public
    property Name: string read getName write setName;
    property Edition: string read getED write setED;
    property Nummer: string read getNummer write setNummer;
    property CID: integer read getCID write setCID;
    property COwner: integer read getCOwner write setCOwner;
  
    procedure DoMove(MoveCount: Integer);override;
    procedure DoCollision(Sprite: TSprite; var Done: Boolean);override;

    procedure LoadECard(Imagelist: TDXImageList); // Lädt das Bild der Karte
end;

implementation
...
procedure TACard.LoadECard(ImageList: TDXImageList);
var
  ix: integer;
  strCName: String;
  bImGFound: Boolean;
begin
    bImgFound:=false;
    strCname:=fed+fnummer;
    for ix:=0 to Imagelist.Items.Count-1 do
    begin
        if Imagelist.Items.Items[ix].Name=strCName then
        begin
          bImgFound:=true;
          Break;
        end;
    end;
    if bIMgFound=false then
    begin
      ImageList.Items.Add;
      with ImageList.Items[ImageList.Items.Count-1] do
      begin
      Picture.LoadFromFile (MYPFAD+fed+'\small\'+fnummer+'.jpg');
      fname:=strCName;
      Name := fname;
      PatternWidth := 0;
      PatternHeight := 0;
      SkipHeight := 0;
      SkipWidth := 0;
      SystemMemory := False;
      //Transparent := Transp;
      //TransparentColor := TranspColor;
      Restore;
      end;
    end;
    Image:=Imagelist.Items.Find(strCName);
end;
In der Game-Unit ist deklariert

type ADummy = array of TACard; und

ADeck1, AADeck1: ADummy; Erstellt werden die ADeck1-Objekte in einer Schleife mit:

Delphi-Quellcode:
inc(iA);
        SetLength(ADeck1,iA);
        ADeck1[iA-1]:=TACard.Create(frmMain.DXSpriteEngine1.Engine);
        ADeck1[iA-1].Edition:=strLeft(S,2);
        ADeck1[iA-1].Nummer:=strRight(S,Length(S)-2);
        ADeck1[iA-1].CID:=iA-1;
        ADeck1[iA-1].COwner:=0;
        ADeck1[iA-1].LoadECard(frmMain.DXCards);
        ADeck1[iA-1].Height:=127;
        ADeck1[iA-1].Width:=90;
        ADeck1[iA-1].X:=200+(iA*20);
        ADeck1[iA-1].Y:=250;
Das Mischen der Karten funktioniert mit Eurer Hilfe nun super mit:

Delphi-Quellcode:
function MixACards(Var AParam: ADummy): ADummy;
var
  CDummy: TACard;
  ix, ir: integer;
begin
  SetLength(Result, Length(AParam));
  for ix:=0 to High(AParam) do
  begin
    ir:=Random(High(AParam));
    CDummy:=Aparam[ix];
    AParam[ix]:=AParam[ir];
    AParam[ir]:=CDummy;
  end;
end;
Wenn in der Mischroutine

AParam[ix]:=AParam[ir]; funktioniert, warum klappt dann dies nicht?

Delphi-Quellcode:
Setlength(AADeck1,1);
  AADeck1[0]:=TACard.Create(frmMain.DXSpriteEngine1.Engine);
  AADeck1[0]:=ADeck1[High(ADeck1)];
Der Compilerlauf ist fehlerfrei, jedoch bricht das Programm mit einem "Access-Violation" beim "Draw" der SpriteEngine ab. Kommentiere ich die Drei Zeilen aus, gibt es keine Probleme.

Sorry, wenn das Ganze nun etwas länger geworden ist, aber ich bin ja lernwillig
  Mit Zitat antworten Zitat