Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FreePascal TImage.Create will einfach nicht funktionieren. (https://www.delphipraxis.net/155763-timage-create-will-einfach-nicht-funktionieren.html)

Qnkel 7. Nov 2010 09:38

TImage.Create will einfach nicht funktionieren.
 
Moin.

Hier erstmal mein Code:

Delphi-Quellcode:
type

  { Karten }

  TKarte = class
    Typ: integer;
    Sichtbar: Boolean;
    Tisch: TImage;
  end;

var
  Hauptform: THauptform;
  Spielerzahl: integer;
  Kartenmischung: array[0..31] of integer;
  Kartenblatt: array[0..31] of TPicture;
  Deckkarte: TPicture;
  Karte: array[0..8] of array[1..3] of TKarte;

function Kartenladen(Pfad, Typ: string): Boolean;
var iBlatt, iSpieler, iKarte, iSpielerkarte, iAusgegeben: integer;
begin
  Result := True;
  Deckkarte := TPicture.Create;
  If FileExists(Pfad + '\Deck.' + Typ) then
        Deckkarte.LoadFromFile(Pfad + '\Deck.' + Typ)
    Else
      Result := False;
  for iBlatt:=0 to 31 do
    begin
      Kartenblatt[iBlatt] := TPicture.Create;
      If FileExists(Pfad + '\' + IntToStr(iBlatt) + '.' + Typ) then
        Kartenblatt[iBlatt].LoadFromFile(Pfad + '\' + IntToStr(iBlatt) + '.' + Typ)
      Else
        Result := False;
    end;
  for iSpieler := 0 to Spielerzahl do
    for iKarte := 1 to 3 do
      begin
        Karte[iSpieler, iKarte].Tisch := TImage.Create(nil);
        for iSpielerkarte := 0 to iAusgegeben do
          begin
            Karte[iSpieler, iKarte].Tisch.Picture := Kartenblatt[iAusgegeben];
            inc(iAusgegeben);
          end;
      end;
end;
Der untere for-to-do-Abschnitt funktioniert nicht. Ich habe es schon mit TCustomImage.Create probiert sowie eine Variable "CTisch = TCustomImage" gemacht und es darüber probiert (wurde mir im IRC geraten), aber all das half nicht.

Wo ist das Problem? Ein Update auf Lazarus 0.9.29 half auch nicht.

Es kommt: "Projekt a.exe hat Exception-Klasse 'External: SIGSEGV' ausgelöst." und danach ein Assembler-Fenster.

Bummi 7. Nov 2010 10:11

AW: TImage.Create will einfach nicht funktionieren.
 
ich weiß nicht ob hier ein Teil des nur nicht mitgeliefert ist:

Delphi-Quellcode:
Karte: array[0..8] of array[1..3] of TKarte;
// ich vermisse etwas in der Art
for x := 0 to 8 do
   for x := 1 to 3 do
      Karte[x,y] := TKarte.Create;

Qnkel 7. Nov 2010 10:16

AW: TImage.Create will einfach nicht funktionieren.
 
Da TKarte keine Create-Prozedur hat, wäre das hinfällig.

Bummi 7. Nov 2010 10:26

AW: TImage.Create will einfach nicht funktionieren.
 
behandelt Lazarus Klassen wie Records??

Qnkel 7. Nov 2010 10:33

AW: TImage.Create will einfach nicht funktionieren.
 
Keine Ahnung, bin Delphi-Umsteiger. :P

Bummi 7. Nov 2010 10:36

AW: TImage.Create will einfach nicht funktionieren.
 
Dann schreib doch mal statt
TKarte = class
TKarte = Record

Qnkel 7. Nov 2010 10:50

AW: TImage.Create will einfach nicht funktionieren.
 
Hmm gute Idee, als Record geht es.

Aber nun sagt er mir "Cannot assign a TImage to a TPicture" ;)
Delphi-Quellcode:
Karte[iSpieler, iKarte].Tisch.Picture := Kartenblatt[iAusgegeben];

Aber TImage.Picture erwartet doch ein TPicture. Wo isn das Problem?

Außerdem sagt er mir immer, wenn ich mit Strg+Leertaste die Eigenschaften aufrufen will, dass er die Unit "ExtCtrls" nicht findet :?

Matze 7. Nov 2010 10:52

AW: TImage.Create will einfach nicht funktionieren.
 
Geraten und nicht getestet:
Delphi-Quellcode:
Karte[iSpieler, iKarte].Tisch.Picture.Assign(Kartenblatt[iAusgegeben]);
Edit: Vergiss nicht alles, was du mit "Create" erzeugt hast, am Ende freizugeben (deine ganzen Arrays).

Qnkel 7. Nov 2010 10:55

AW: TImage.Create will einfach nicht funktionieren.
 
Gute Idee, aber gleiches Problem :(

Der findet die ExtCtrls net und daran wirds liegn... aber warum...

sx2008 7. Nov 2010 11:54

AW: TImage.Create will einfach nicht funktionieren.
 
Also für meinen Geschmack steckt in dem Code viel zu wenig Objektorientierung (nämlich gar keine).
Dabei kann man in einem Kartenspiel so viele Objekte entdecken:
* Die Karte
* Der Spieler
* Der Spieltisch
* Die Kartenliste
* Die Spielerliste
...

Und ausserdem: nur weil eine Klasse keinen Konstruktor hat, bedeutet das nicht,
dass man den Konstruktor nicht aufrufen kann oder muss:
Delphi-Quellcode:
type
  TKarte = class
    Typ: integer;
    Sichtbar: Boolean;
    Tisch: TImage;
  end;
var
  k : TKarte;
begin
  // Da TKarte impliziert von TObject abgeleitet ist und TObject
  // den Konstruktor .Create bereitstellt, gibt es nur einen
  // richtigen Weg davon ein Objekt zu erzeugen
  k:= TKarte.Create;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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