Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Obwohl alles funktionieren sollte, nimmt der Code meine Variablen nicht auf (https://www.delphipraxis.net/212884-obwohl-alles-funktionieren-sollte-nimmt-der-code-meine-variablen-nicht-auf.html)

EinTor 18. Apr 2023 21:41

Obwohl alles funktionieren sollte, nimmt der Code meine Variablen nicht auf
 
Guten Abend,

dieses Mals ist auch eine Beschreibung dabei. Zur Zeit Arbeit ich an einem Projekt, bei welchem ich ein Dreieck, welches ich Karol nenne, durch ein Gitternetz mit Hilfe von Knöpfen bewegen möchte. Die Welt aufzubauen war bis jetzt kein Problem. Doch nun möchte ich, dass Karol beim Starten des Programms sofort erscheint. Bei meinem Code könnte ich mansouth(1,1) verwenden. Allerdings wollte ich auch mal testen, dass mit den xpos und ypos Variablen zu machen, welche für Karol bestimmt sind. Sowas würde meiner Meinung nach weitere Schritte um einiges erleichtern. Doch dieser wird hier nicht gezeichnet.

Ich habe mehrfach mit einem Panel getestet ob, die xpos und ypos Zahlen im Code irgendwo "stecken" bleiben. Doch dabei war kein Problem, das bedeutet, dass die Koordinaten wo Karol steht funktionieren. Beim "zeichnen" von Karol ist ebenfalls kein Problem, weil ich ja mansouth(1,2) ohne weitere Probleme benutzen kann. Nun weiß ich nicht wie ich weiter testen kann, wo das Problem ist, bzw. wie ich dieses beheben kann.

Vielen dank schonmal im Voraus :D



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
trichtung = (south, north, west, east);
type
tRobotor = record
xpos: integer;
ypos: integer;
richtung: tRichtung;
end;

type
TForm1 = class(TForm)
Bintitialisieren: TButton;
Izeichnen: TImage;
p1: TPanel;
Panel1: TPanel;

procedure FormCreate(Sender: TObject);

procedure mansouth(x, y: integer);
procedure mannorth(x, y: integer);
procedure maneast(x, y: integer);
procedure manwest(x, y: integer);
procedure hintergrund;
procedure robotorrichtung;

procedure BintitialisierenClick(Sender: TObject);
procedure brechtsdrehClick(Sender: TObject);




private
robotor: tRobotor;
{ Private-Deklarationen }
public

{ Public-Deklarationen }

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin //Gitternetz und Robot beim start zeichnen
robotor.xpos := 1;
robotor.ypos := 1;
robotor.richtung := south;
hintergrund;
robotorrichtung; //Hiermit sollte der Karol gezeichnet werden, aber es passiert nicht? Ich verstehe aber nicht wieso, denn das Gitternetz wird hier gezeichnet. Zusätzlich habe ich getestet,
//ob die xpos und ypos Variabeln überall hin mitgenommen werden. Somit müsste alles funktionieren. Doch beim Testen, wird hier kein Dreickeck gezeichnet (Die man befehle
//funktionieren auch, wenn ich zb mansouth(1,2) teste. Sieht jemand meinen Logik-Fehler?
end;

procedure TForm1.mansouth(x, y: integer); //Karol guckt nach unten
begin
with Izeichnen.Canvas do
begin
Pen.Color := clBlack;
Brush.Color := clBlack;
Brush.Style := bsSolid;
MoveTo((x-1)*40, (y-1)*40);
LineTo(x*40, (y-1)*40);
LineTo(x*40 - 20, y*40);
LineTo((x-1)*40, (y-1)*40);
FloodFill(x*40 - 20, y*40 - 20, clBlack, fsBorder);
end;
end;

procedure TForm1.mannorth(x, y: integer); //Karol guckt nach oben
begin
with Izeichnen.Canvas do
begin
Pen.Color := clBlack;
Brush.Color := clBlack;
Brush.Style := bsSolid;
MoveTo(x*40 - 20, (y-1)*40);
LineTo(x*40, y*40);
LineTo((x-1)*40, y*40);
LineTo(x*40 - 20, (y-1)*40);
FloodFill(x*40 - 20, y*40 - 20, clBlack, fsBorder);
end;
end;

procedure TForm1.maneast(x, y: integer); //Karol guckt nach rechts
begin
with Izeichnen.Canvas do
begin
Pen.Color := clBlack;
Brush.Color := clBlack;
Brush.Style := bsSolid;
MoveTo((x-1)*40, (y-1)*40);
LineTo(x*40, y*40 - 20);
LineTo((x-1)*40, y*40);
LineTo((x-1)*40, (y-1)*40);
FloodFill(x*40 - 20, y*40 - 20, clBlack, fsBorder);
end;
end;

procedure TForm1.manwest(x, y: integer); //Karol guckt nach links
begin
with Izeichnen.Canvas do
begin
Pen.Color := clBlack;
Brush.Color := clBlack;
Brush.Style := bsSolid;
MoveTo((x-1)*40, y*40 - 20);
LineTo(x*40, (y-1)*40);
LineTo(x*40, y*40);
LineTo((x-1)*40, y*40 - 20);
FloodFill(x*40 - 20, y*40 - 20, clBlack, fsBorder);
end;
end;

procedure TForm1.hintergrund; //Gitternetz wird gezeichnet
var
i,j: integer;
begin
with Izeichnen.Canvas do
begin
for i := 0 to 9 do begin
for j := 0 to 9 do begin
Pen.Color := clBlue;
Brush.Color := clwhite;
Rectangle(i*40, j*40, (i+1)*40, (j+1)*40);
end;
end;
end;
end;

procedure TForm1.robotorrichtung; //KArol wird gezeichnet, funktioniert nicht????
begin
with robotor do
case richtung of
east: maneast(xpos*40, ypos*40);
south: mansouth(xpos*40, ypos*40);
west: manwest(xpos*40, ypos*40);
north: mannorth(xpos*40, ypos*40);
end;
end;

procedure TForm1.BintitialisierenClick(Sender: TObject); //basically same wie im FormCreat, was ist das Porblem???
begin
hintergrund;
robotor.xpos := 1;
robotor.ypos := 1;
robotor.richtung := south;
robotorrichtung;
end;
end.

jaenicke 18. Apr 2023 21:57

AW: Obwohl alles funktionieren sollte, nimmt der Code meine Variablen nicht auf
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das wird schon gezeichnet. Allerdings muss der Bildschirm bzw. dein TImage natürlich auch groß genug sein, damit du das Dreieck an Position 1580/1580 auch siehst.

In deinem Raster liegen die Koordinaten aber nicht. Bist du sicher, dass du die Koordinaten zweimal mit 40 multiplizieren möchtest? Wenn du den Faktor 40, also die Multiplikationen, aus der Prozedur robotorrichtung herausnimmst, sollte das Dreieck auch oben links im ersten Kästchen gezeichnet werden.

// EDIT:
Ich habe es kurz getestet, ohne das *40 klappt es. Die Koordinaten siehst du auch ganz einfach im Debugger, wenn du einen Haltepunkt setzt:
Anhang 55986

EinTor 18. Apr 2023 22:16

AW: Obwohl alles funktionieren sollte, nimmt der Code meine Variablen nicht auf
 
Oh das ist mir tatsächlich nicht aufgefallen. Vielen lieben Dank, es funktioniert, bzw. wird jetzt auch an der gewollten Stelle gezeichnet :D

haentschman 19. Apr 2023 05:37

AW: Obwohl alles funktionieren sollte, nimmt der Code meine Variablen nicht auf
 
Moin...8-)
:dp: willkommen

3 Sachen OT:
1. Bitte trage deine Delphi Version in dein Profil ein. Da kann man besser helfen. Denn zwischen D7 und Alexandria gibt es dann doch Unterschiede...:zwinker:
2. Bitte benutze "Delphi Tags" für den Quelltext. Ist besser lesbar. Das ist der Knopf im Editor mit dem Helm. :zwinker:
3. Bitte benutze heutzutage kein WITH mehr. :warn: Es funktioniert zwar, aber es gibt Probleme beim Debugging und der Anzeige von Variablen Werten wenn man mit der Maus über die Variable geht.
Delphi-Quellcode:
with Izeichnen.Canvas do
begin
  Pen.Color := clBlack;
end;
...
var
  Blubb: TCanvas; // beliebiger Name, sollte aber selbstsprechend sein
.
Blubb := Izeichnen.Canvas;
Blubb.Pen.Color := clBlack;
:wink:


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