Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array an procedure übergeben (https://www.delphipraxis.net/13656-array-procedure-uebergeben.html)

himitsu 23. Dez 2003 16:49

Re: Array an procedure übergeben
 
Delphi hat mit zwar gleichen Typendeklaration einige Progleme.

So geht es NICHT:
Delphi-Quellcode:
type EDummy = array of EKarte;

function MixECards(const AParam: EDummy): EDummy;

var P1EKarte: Array of Ekarte;

{P1EKarte <> AParam}
So dürfte es geh'n:
Delphi-Quellcode:
type EDummy = array of EKarte;

function MixECards(const AParam: EDummy): EDummy;

var P1EKarte: EDummy;

{P1EKarte = AParam}

himitsu 23. Dez 2003 16:54

Re: Array an procedure übergeben
 
@choose:
Die Namen sind Delphi total egal.
Diese "Vorgaben" für die Namensvergabe (das hast du bestimmt irgendwo gelesen) ist nur zum einfachen lesen/verständnis der Quellcodes gedacht und hat nichts mit der Funktion zu tun.

Und das was Igotcha da geschrieben hat, sind mit Sicherheit nur Beispiele und sehen nicht im direkten Zusammenhang mit dem Prog. :wink:

Ich halte mich auch nicht an diesen sogenanten "Standard", hab mir ein eigenes System zur Namensvergabe im laufe der Jahre angeeignet.

choose 23. Dez 2003 17:04

Re: Array an procedure übergeben
 
Zitat:

Zitat von himitsu
Die Namen sind Delphi total egal.

Das ist mir bewusst, himitsu. Bis auf wenige Ausnahmen (zB Prozedur Register zum Registrieren von Komponenten) muss man bei Delphi auch nicht auf Groß-/Kleinschreibung achten.

Zitat:

Zitat von himitsu
Diese "Vorgaben" für die Namensvergabe [..] ist nur zum einfachen lesen/verständnis der Quellcodes gedacht [..].

Und genau das ist der Punkt: Der Grund, warum man häufig zur Hochsprache greift ist eben die bessere Verständlichkeit der (fremden) Quellen . Das Resultat hätte man auch in ASM oder gar mit puren Opcodes realisieren können. Die "Quelle, von der ich das nabe" heißt im übrigen VCL/CLX und schuf eine gewisse Einstellung zu Bedeutungen von Bezeichnern.
Oder würdest Du hinter EConvertError eine Klasse zur Darstellung von Schachfiguren erwarten, deren Dartellungsmethode sinnigerweise Create heißt? Technisch machbar.

Zitat:

Zitat von himitsu
Und das was Igotcha da geschrieben hat, sind mit Sicherheit nur Beispiele und sehen nicht im direkten Zusammenhang mit dem Prog. :wink:

Und da war ich eben nicht ganz so sicher, gut dass Du mich in dieser Hinsicht beruhigt hast ;)

Igotcha 28. Dez 2003 00:23

Re: Array an procedure übergeben
 
Zitat:

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

Delphi-Quellcode:
type ADummy = array of TACard;
und

Delphi-Quellcode:
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

Delphi-Quellcode:
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 ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 Uhr.
Seite 2 von 2     12   

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