Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem mit Zeichenfläche (https://www.delphipraxis.net/173007-problem-mit-zeichenflaeche.html)

AlToZzBrA 2. Feb 2013 18:29

Problem mit Zeichenfläche
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Bitte entschuldigt mich wenn ich dieses Thema in das falsche Forum gepostet habe, aber ich finde mich hier noch nicht ganz zurecht, da ich neu bin.

Mein Problem:

Schwer zu erklären, deswegen gebe ich euch mein Programm und ihr könnt es euch dann einfach selbst anschauen.
Ich bin gerade dabei Tetris zu programmieren. Startet einfach da Programm und geht auf steht und drückt dann die Pfeiltaste nach links und dann kommt auch schon die Fehlermeldung.

Ich bin euch sehr dankbar, wenn ihr eine Lösung des Problems findet.

Popov 2. Feb 2013 18:53

AW: Problem mit Zeichenfläche
 
Der Fehler beginnt in der Zeile

Delphi-Quellcode:
procedure TI.draw (psa:TCanvas;px,py:integer);
bzw. schon hier

Delphi-Quellcode:
procedure TI.move(px2:integer);
begin
   ...
   sa.Rectangle(x,y,x+124,y+31);
Ohne mir das jetzt genauer angesehen zu haben, würde ich drauf tippen das das Problem Canvas ist.

Soweit ich sehe hast du es zwar deklariert, aber den Konstruktor vergessen?

Eigentlich sollten Objekte erstellt werden. Vielleicht hast du es irgendwo auch gemacht, aber trotzdem, auch das wird dich nicht weiter bringen, denn Canvas ist lediglich die Zeichenfläche und die kann man soweit ich weiß nicht alleine für sich nutzen. Eher aus TBitmap usw., nicht alleine.

AlToZzBrA 2. Feb 2013 19:24

AW: Problem mit Zeichenfläche
 
Ich verstehe nicht ganz was du meinst.

In der Schule haben wir beigebracht bekommen, das man z.B. ein Rechteck auf die Canvas zeichnet,indem man als
Delphi-Quellcode:
image1.canvas.brush.color
bestimmt und dann
Delphi-Quellcode:
image1.canvas.rectangle(Koords)
macht. die imag1.canvas haben wir dann in einer Variable vom Typ TCanvas angegeben.
Delphi-Quellcode:
sa := image1.canvas;

Popov 2. Feb 2013 20:17

AW: Problem mit Zeichenfläche
 
Ja, du hast Recht, es wird die Canvas von Image2 übergeben, somit hat es im ersten Moment wieder sein Richtigkeit, aber nur im ersten Moment. Wie gesagt, ich hab mir das vorhin nicht genauer angesehen.

Das Problem scheint hier zu liegen:

Delphi-Quellcode:
type
  TI = class
  private
    ...
    s : TI; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Allerdings machst du es etwas verworren.

Zuerst wird TImage mit der Canvas erstellt. Diese Canvas ist in Wirklichkeit die Canvas der Bitmap der TImage. Somit hat das alles seine Richtigkeit.

Dann erstellst du das TI Objekt (I) und übergibst TImage Canvas als Methodenparameter

In der Methode Draw von TI übergibst du die Canvas Adresse an die Feldvariable sa. sa zeit jetzt also auf die Cnavas von TImage. Soweit noch alles gut.

Unter TI.move macht du dann aber das:

Delphi-Quellcode:
   s.draw(sa,x+x2,y);
Das ist noch soweit nicht verboten, aber eine andere Instanz. Und diese Canvas geht ins leere und hat nichts mit der Image2 Canvas zu tun.

Letztendlich deklarierst du in der TI Klasse die TI Klasse. Beim ersten Zugriff knallte es nicht, da du da die Canvas der Image2 übergeben hast. Aber spätestens in TI.move hast du das Problem auf ein nicht erstelltes s Objekt zuzugreifen. Das hättest du vorher im Konstruktor machen müssen (nicht jetzt in TI.move, da du das ständig neu aufrufst). Aber wie gesagt, auch wenn du es machst, hast du dann trotz dem immer noch das Problem mit der Canvas.

AlToZzBrA 2. Feb 2013 20:35

AW: Problem mit Zeichenfläche
 
okay, danke dir.


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