Autor Beitrag
ultraz06
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 13:35 
hi :)
ich habe folgendes problem ich habe ein programm prgrammiert, was wie moorhuhn aufgebaut ist.
so habe ich per TBitmap.Create den hintergrund gesetzt und per
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Zeichnen;
begin
  Puffer.Canvas.Draw(0,0,Hg);
  Puffer.Canvas.Draw(xAkt,yAkt,patrone);
  paintbox1.Canvas.Draw(0,0,Puffer);

eine weitere bitmap(patrone) auf den hintergrund zeichnen lassen, nun möchte ich auf die bitmap(patrone) welches auf dem hintergrund ist, per mausklick zugreifen. ich will das wenn ich mausklick auf die bitmap mache sie verschwindet(also wie bei moorhuhn

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt, BMP-Bilder komprimiert
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 16:24 
Dann musst du anhand der Koordinaten prüfen, ob in das gezeichnete Bild geklickt wurde, und wenn das so ist, neu zeichnen ohne dieses Bild.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 26.01.09 16:30 

_________________
PROGRAMMER: A device for converting coffee into software.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 16:40 
naja aber da sich die patrone bewegt weiß ich nicht wie ich beim Klick die Position des Mauszeigers auswerten kann :/?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 16:44 
Die aktuellen Koordinaten musst du ja irgendwo haben.

Und die des Mausklicks bekommst du in OnMouseDown übergeben (als X und Y). Bei OnClick müsstest du Mouse.GetCursorPos verwenden, was aber bei schnellen Bewegungen ungenauer ist.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 26.01.09 16:45 
...?
- Du weißt, wo der User hinklickt (bekommst du im OnMouseDown mitgeliefert)
- Du kennst die aktuelle Position der Patrone

_________________
PROGRAMMER: A device for converting coffee into software.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 17:06 
ich kenne ja eben nicht die aktuelle position der patrone ich weiß nur von wo sie anfängt sich zu bewegen aber nicht die weiteren koordinaten
gibt es keine routine die das ausgibt?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 17:39 
user profile iconultraz06 hat folgendes geschrieben Zum zitierten Posting springen:
ich kenne ja eben nicht die aktuelle position der patrone ich weiß nur von wo sie anfängt sich zu bewegen aber nicht die weiteren koordinaten
Wie soll das gehen? Was sind denn xAkt und yAkt? Das sind doch die Koordinaten.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 18:40 
ah^^ jetzt versteh ich
und wie geht das mit onmousedown um auf die x und y zu zugreifen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 18:42 
Schreib einfach mal in OnMouseDown das rein:
ausblenden Delphi-Quelltext
1:
ShowMessage('Koordinaten (' + IntToStr(X) + ', ' + IntToStr(Y) + ') geklickt!');					
Du bekommst die Koordinaten da in X und Y übergeben.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 18:47 
wenn ich das so eingebe ShowMessage('Koordinaten (' + IntToStr(Xakt) + ', ' + IntToStr(Yakt) + ') geklickt!');
kommt gleich beim start die message und er hört nicht auf die koordinaten zu zählen?
soll ich vllt ma den ganzen uelltext posten?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 18:48 
user profile iconultraz06 hat folgendes geschrieben Zum zitierten Posting springen:
kommt gleich beim start die message und er hört nicht auf die koordinaten zu zählen?
Und du hast das sicher in OnMouseDown gelegt, und nicht OnMouseMove oder FormCreate?

user profile iconultraz06 hat folgendes geschrieben Zum zitierten Posting springen:
soll ich vllt ma den ganzen uelltext posten?
Das wäre wohl sinnvoll, ja.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 18:50 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure Zeichnen;
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
    procedure Berechnen(x,y:integer);
    procedure FormActivate(Sender: TObject);
    procedure PaintBox1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
   Hg:TBitmap;
    patrone:TBitmap;
   Puffer:TBitmap;
    xAkt,yAkt,Geschwindigkeit,AnzDurchgange:integer;
    SummandX,SummandY,xAktExt,yAktExt:extended;
x,y:integer;
  StreckeX,StreckeY:integer;
  StreckeC:extended;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
xAkt:=0;
yAkt:=0;
 { ...und Anfangshöhe zuweisen }
patrone:=TBitmap.Create;
Hg:=TBitmap.Create;
Hg.LoadFromFile('Hg.bmp');
patrone.LoadFromFile('patrone.bmp');
patrone.Width:=100;
patrone.Height:=100;
patrone.Transparent:=false;
Puffer:=TBitmap.Create;
hg.Width := form1.Width; { Anfangsbreite... }
hg.Height := form1.Height;
Puffer.Width:=hg.Width;
Puffer.height:=hg.Height;
 Geschwindigkeit:=5;

end;

procedure TForm1.Zeichnen;
begin
  Puffer.Canvas.Draw(0,0,Hg);
  Puffer.Canvas.Draw(xAkt,yAkt,patrone);

  paintbox1.Canvas.Draw(0,0,Puffer);

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin
xAkt:=xAkt+5;
  Zeichnen;
if AnzDurchgange > 0 then begin
    xAktExt:=xAktExt+SummandX;
    yAktExt:=yAktExt+SummandY;
    xAkt:=round(xAktExt);
    yAkt:=round(yAktExt);
    Zeichnen;
    dec(AnzDurchgange);
  end


end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  Zeichnen;
end;
procedure TForm1.Berechnen(x,y:integer);
var
  StreckeX,StreckeY:integer;
  StreckeC:extended;
begin
  StreckeX:=x-xAkt;
  StreckeY:=y-yAkt;
  StreckeC:=sqrt(sqr(StreckeX)+sqr(StreckeY));
  AnzDurchgange:=round(StreckeC/Geschwindigkeit);
  SummandX:=StreckeX/AnzDurchgange;
  SummandY:=StreckeY/AnzDurchgange;
  xAktExt:=xAkt;
  yAktExt:=yAkt;
end;



procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Berechnen(x,y);
Zeichnen;

end;

procedure TForm1.FormActivate(Sender: TObject);
begin
paintbox1.width:=form1.width;
paintbox1.height:=form1.Height;
end;

procedure TForm1.PaintBox1Click(Sender: TObject);
begin
ShowMessage('Koordinaten (' + IntToStr(Xakt) + ', ' + IntToStr(Yakt) + ') geklickt');
end;

end.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 18:52 
Erstens schreibe deinen Quelltext bitte in Delphi-Tags hier im Forum:<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG8f3c8a770c722a8b81cd563b5589a5c9}</span></span>
Zweitens hast du das ShowMessage in OnClick und nicht in OnMouseDown geschrieben und X und Y durch Xakt und Yakt ersetzt...

// EDIT:
Du kannst es natürlich auch in OnMouseUp setzen. Oder du speicherst X und Y in globalen Variablen und benutzt die dann in OnClick.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 18:59 
ok soweit habe ich es verstanden nun muss ich ja noch die koordianten des mausklicks mit den kooardinaten des bitmaps vergleichen, ich wollte es so machen aber das scheint nicht zu gehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if  (X) and (Y) = (Yakt) and (xakt)
then  begin  Puffer.Canvas.Draw(0,0,Hg);
                paintbox1.Canvas.Draw(0,0,Puffer)
end;;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 19:07 
Du musst schauen ob das X vom Klick zwischen der linken Kante des Bildes (Xakt) und der rechten (Xakt + breite) liegt. Genauso mit Y.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 19:15 
so etwa?

ausblenden Delphi-Quelltext
1:
if  (X)   = xakt+(Xakt + patrone.Width) and if y=yakt+(yakt+patrone.Height)					


wie kann ich dann das hintergrundbild drüber zeichnen wenn die kooardinaten passen sollten?
ausblenden Delphi-Quelltext
1:
2:
then  begin    Puffer.Canvas.Draw(0,0,Hg);
              paintbox1.Canvas.Draw(0,0,Puffer);
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 20:48 
user profile iconultraz06 hat folgendes geschrieben Zum zitierten Posting springen:
so etwa?

ausblenden Delphi-Quelltext
1:
if  (X)   = xakt+(Xakt + patrone.Width) and if y=yakt+(yakt+patrone.Height)					
Dann schauen wir doch einmal was du da machst. Nehmen wir einmal an geklickt wurde an Position (150, 151), das Bild ist 200x201 Pixel groß und liegt an Position (100, 101).
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if  (X)   = xakt+(Xakt + patrone.Width) and if y=yakt+(yakt+patrone.Height)

if  (150)   = 100+(100 + 200) and if 151=101+(101+201)

if 150 = 400 and if 151 = 404
Das kommt dann heraus. Mal abgesehen davon, dass die Syntax ohnehin falsch ist.

Ich empfehle dir einmal den Crashkurs hier:
crashkurs.christian-stelzmann.de

Richtig aufgeschrieben würde dein Quelltext so aussehen:
ausblenden Delphi-Quelltext
1:
if (X = Xakt + (Xakt + patrone.Width)) and (Y = Yakt + (Yakt + patrone.Height)) then					
Was zusammengefasst aber wäre:
ausblenden Delphi-Quelltext
1:
if (X = 2 * Xakt + patrone.Width) and (Y = 2 * Yakt + patrone.Height) then					


Wie wäre es so: Du willst doch feststellen ob der Mausklick zwischen den Kanten stattfand und nicht genau auf den Kanten o.ä., also muss der Mausklick z.B. rechts von der linken Kante und links von der rechten erfolgt sein:
ausblenden Delphi-Quelltext
1:
if (X >= Xakt) and (X <= Xakt + patrone.Width) then					
Das wäre die Prüfung für die horizontale Richtung.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Mo 26.01.09 21:25 
so danke dir erstmal :)
jetzt ist natürlich noch das problem das die patrone beim klick verschwinden muss, entweder der hintergrund wird neu gezeichnet oder gibt es noch eine andere möglichkeit?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if (X >= Xakt) and (X <= Xakt + patrone.Width) then
  if (y>=yakt) and (y<=yakt +patrone.Height)
then begin  Puffer.Canvas.Draw(0,0,Hg);
            paintbox1.Canvas.Draw(0,0,Puffer);


nur leider geht das nicht :(
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.01.09 21:29 
user profile iconultraz06 hat folgendes geschrieben Zum zitierten Posting springen:
nur leider geht das nicht :(
Sehr präzise. Was passiert denn (nicht)?

Jedenfalls solltest du dir angewöhnen den Quelltext gleich richtig zu formatieren. Die beiden if-Abfragen kannst du auch zusammenfassen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (X >= Xakt) and (X <= Xakt + patrone.Width)
    and (Y >= Yakt) and (Y <= Yakt + patrone.Height) then
  begin
    Puffer.Canvas.Draw(0, 0, Hg);
    PaintBox1.Canvas.Draw(0, 0, Puffer);
  end;
end;