Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rechtecke und Probleme =( (https://www.delphipraxis.net/30344-rechtecke-und-probleme-%3D.html)

finalgott 23. Sep 2004 18:00


Rechtecke und Probleme =(
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Ich habe da ein Problem beim auslesen der Punkte von einem Rechteck.
Wenn ich ein oder mehrere Rechtecke per Randomize erstelle..
Und mir die lage der/des Punktes, und die Lage von wight und height ausgeben lasse
passiert folgendes:
Das Rechteck wird mal von oben-links nach rechts-unten "aufgezogen" und mal von rechts-unten nach oben-links...usw.
Folge:
Ist ne ziemlich dumme Sache wenn man die Punkte zu weiteren Rechnungen brauch.
Ich habe euch mal den Quellcode gepostet. Und des weiteren die Projekt.exe.
Ich hoffe ihr schaut euch das ganze mal an.
Und noch eins, falls ihr euch die Projekt.exe anschaut.
Gebt eine 1 bei der Eingabe ein und klickt so oft auf rechteck erstellen...
bis das Problem anhand der Werte sichtbar wird.
Danke an alle die versuchen werden mir zu helfen !

Delphi-Quellcode:
var
  Form1: TForm1;
  a1,a2,a,aa,x2,y2:integer;

implementation

{$R *.dfm}

procedure zeichneRechteck(canv: Tcanvas; x1, y1,x2,y2: integer; farbeRand:Tcolor);
  const dicke = 3;
begin
  with canv do Begin
    Pen.Width := dicke;
    Pen.Color := farbeRand;
    Brush.Style := bssolid;
    Pen.Mode:=pmNotXor;
    x1:=random(200);
    y1:=x1;
    x2:=random(200);
    y2:=x2 div 2;
    Rectangle (x1 -dicke, y1-dicke, x2-dicke, y2 - dicke);
    a:=x1;
    aa:=y1;
    a1:=x2;
    a2:=y2;

   End
end;


procedure TForm1.Button1Click(Sender: TObject);
 var w, h,w2,i,n:integer;
begin
randomize;
n:=strtoint(form1.Edit1.text);
sg1.ColCount :=2;
sg1.RowCount :=n+1;
for i:=1 to n do begin
with image1 do begin
        zeichneRechteck(image1.canvas,a, aa, a1,a2,clgray);
                label1.Caption:= inttostr(a)+(',')+inttostr(aa)+(',')+inttostr(a1)+(',')+inttostr(a2);
end;
                sg1.Cells[0,i]:=inttostr(a)+(',')+inttostr(aa);

                        sg1.Cells[1,i]:=inttostr(a1+a)+(',')+inttostr(a2+aa);
end;


end;




end.
[edit=Admin]BBCodes aktiviert. Mfg, Daniel[/edit]

shmia 23. Sep 2004 18:12

Re: Rechtecke und Probleme =(
 
Zitat:

Zitat von finalgott
Ich habe da ein Problem beim auslesen der Punkte von einem Rechteck.
Wenn ich ein oder mehrere Rechtecke per Randomize erstelle..
Und mir die lage der/des Punktes, und die Lage von wight und height ausgeben lasse
passiert folgendes:
Das Rechteck wird mal von oben-links nach rechts-unten "aufgezogen" und mal von rechts-unten nach oben-links...usw.

Das ist doch kein Problem !
Du hast zwei X-Koordinaten und zwei Y-Koordinaten.

Delphi-Quellcode:
procedure SwapInteger(var a, b : Integer); // Hilfsfunktion
var
   t : Integer;
begin
   t := a;
   a := b;
   b := t;
end;

.....
x1:=random(200);
y1:=x1;
x2:=random(200);
y2:=x2 div 2;
if x1 > x2 then
   SwapInteger(x1, x2); // Tausche X-Koordinaten
if y2 > y1 then
   SwapInteger(y1, y2);

finalgott 23. Sep 2004 18:29

Re: Rechtecke und Probleme =(
 
Hm..

Also ich habe dein Vorschlag übernommen jedoch stimmen die Werte immernoch nicht
überrein...Nun haut er irgendwie die Werte durcheinander...glaub ich jedenfalls auf die schnelle

Also ich möchte immer den linken oberen Punkt und den rechten unteren Punkt ausgegeben haben.
Egal für welches Rechteck
Oder eben den rechten oberen Punkt und den linken unteren..

Nach deiner Lösung würde das ganze nun wie folgt aussehen:
Delphi-Quellcode:
var
  Form1: TForm1;
  a1,a2,a,aa,x2,y2:integer;

implementation

{$R *.dfm}

procedure SwapInteger(var a, b : Integer); // Hilfsfunktion
var
   t : Integer;
begin
   t := a;
   a := b;
   b := t;
end;


procedure zeichneRechteck(canv: Tcanvas; x1, y1,x2,y2: integer; farbeRand:Tcolor);
  const dicke = 3;
begin
  with canv do Begin
    Pen.Width := dicke;
    Pen.Color := farbeRand;
    Brush.Style := bssolid;
    Pen.Mode:=pmNotXor;
    x1:=random(200);
    y1:=x1;
    x2:=random(200);
    y2:=x2 div 2;
    if x1 > x2 then
    SwapInteger(x1, x2); // Tausche X-Koordinaten
    if y2 > y1 then
    SwapInteger(y1, y2);
    Rectangle (x1 -dicke, y1-dicke, x2-dicke, y2 - dicke);
    a:=x1;
    aa:=y1;
    a1:=x2;
    a2:=y2;

   End
end;


procedure TForm1.Button1Click(Sender: TObject);
 var w, h,w2,i,n:integer;
begin
randomize;
n:=strtoint(form1.Edit1.text);
sg1.ColCount :=2;
sg1.RowCount :=n+1;
for i:=1 to n do begin
with image1 do begin
        zeichneRechteck(image1.canvas,a, aa, a1,a2,clgray);
                label1.Caption:= inttostr(a)+(',')+inttostr(aa)+(',')+inttostr(a1)+(',')+inttostr(a2);
end;
                sg1.Cells[0,i]:=inttostr(a)+(',')+inttostr(aa);

                        sg1.Cells[1,i]:=inttostr(a1+a)+(',')+inttostr(a2+aa);
end;


end;




end.

JasonDX 23. Sep 2004 18:35

Re: Rechtecke und Probleme =(
 
Mal kurz OT: Formatier mal den unteren Teil des Codes, denn der is echt :kotz:
Noch ein kleiner Tipp:
Delphi-Quellcode:
statt dem ganzen IntToStr(...) + ',' +  ...
Schau dir mal den Format-befehl an
Delphi-Quellcode:
Format('%d, %d, %d, %d', [a, aa, al, a2]);
ann wird der Code auch mal etwas sauberer...

finalgott 23. Sep 2004 18:42

Re: Rechtecke und Probleme =(
 
Danke ;)

Hab ich gemacht....sieht besser und übersichtlicher aus nur man kann sowas auch nur machen wenn man es kennt...und ich kannte es nicht.
<-- Unwissender

Und nun zurück zum Thema =/..

finalgott 23. Sep 2004 19:05

Re: Rechtecke und Probleme =(
 
Also der code sieht nun so aus:
Und ich möchte das er ein Rechteck immer von oben links nach unten rechts zieht
Delphi-Quellcode:
var
  Form1: TForm1;
  a1,a2,a,aa,x2,y2:integer;

implementation

{$R *.dfm}



procedure zeichneRechteck(canv: Tcanvas; x1, y1,x2,y2: integer; farbeRand:Tcolor);
  const dicke = 3;
begin
  with canv do Begin
    Pen.Width := dicke;
    Pen.Color := farbeRand;
    Brush.Style := bssolid;
    Pen.Mode:=pmNotXor;
    x1:=random(200);
    y1:=x1;
    x2:=random(200);
    y2:=x2 div 2;
    Rectangle (x1 -dicke, y1-dicke, x2-dicke, y2 - dicke);
    a:=x1;
    aa:=y1;
    a1:=x2;
    a2:=y2;

   End
end;


procedure TForm1.Button1Click(Sender: TObject);
 var w, h,w2,i,n:integer;
begin
randomize;
n:=strtoint(form1.Edit1.text);
sg1.ColCount :=2;
sg1.RowCount :=n+1;
for i:=1 to n do begin
with image1 do begin
        zeichneRechteck(image1.canvas,a, aa, a1,a2,clgray);
                label1.Caption:= Format('%d, %d, %d, %d', [a, aa, a1, a2]);
end;
                sg1.Cells[0,i]:=inttostr(a)+(',')+inttostr(aa);

                        sg1.Cells[1,i]:=inttostr(a1+a)+(',')+inttostr(a2+aa);
end;
end;
end.

Muetze1 24. Sep 2004 00:29

Re: Rechtecke und Probleme =(
 
Moin!

Wenn du das TRect erstellt hast, dann einmal damit diese Funktion aufrufen:

Delphi-Quellcode:
Function CorrectRect(Const ARect : TRect): TRect;
Begin
  Result.Top   := Min(ARect.Top, ARect.Bottom);
  Result.Bottom := Max(ARect.Top, ARect.Bottom);
  Result.Left  := Min(ARect.Left, ARect.Right);
  Result.Right := Max(ARect.Left, ARect.Right);
End;
MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz