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



BeitragVerfasst: Do 29.01.09 21:06 
hi^^
ich bin immernoch bei meinem moorhuhn klon, nun habe ich schon ein bild auf der form welches als ballon dargestellt,abgeschossen werden kann.
nun habe ich ein 2 bild hinzugefügt baer immer wenn dieses gezeichnet wird flimmert es so komisc,
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Zeichnen;
var n:integer;
begin
Puffer.Canvas.Draw(0, 0, Hg);
for n:=0 to timer2.interval do
case n of
0: if gruenSichtbar then begin
   Puffer.Canvas.Draw(xgruen, ygruen, gruen);
   PaintBox1.Canvas.Draw(0, 0, Puffer)   end;
1: if blausichtbar then begin
   Puffer.Canvas.Draw(xblau, yblau, blau);
   PaintBox1.Canvas.Draw(0, 0, Puffer);  end;

nun ich denke es liegt daran das bei 0 und 1 immer  PaintBox1.Canvas.Draw(0, 0, Puffer);
ausgeführt wird.
aber wie kann ich umgehen?
also es soll so aussehen das gruensichtbar und blausichtbar ja unabhängig voneinander sind, gibt es da einen weg das in ener if-then anwendung darzustllen, da sie aber unabhänging sind weiß ich nicht wie es geht
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: Do 29.01.09 21:34 
user profile iconultraz06 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
for n:=0 to timer2.interval do
case n of
0:
Was soll das denn bewirken? :shock:
Intervall gibt doch nur an in welchem Abstand die Timerereignisse ausgelöst werden, was hat das in einer Berechnung bzw. als Wert für die for-Schleife zu suchen?

Und außerdem: Wozu for, wenn du danach nach den Werten unterscheidest? :gruebel:

user profile iconultraz06 hat folgendes geschrieben Zum zitierten Posting springen:
nun ich denke es liegt daran das bei 0 und 1 immer  PaintBox1.Canvas.Draw(0, 0, Puffer);
ausgeführt wird.
Indem du nicht den ganzen Puffer auf die PaintBox zeichnest sondern nur die aktuelle Änderung. Wenn alles neu gezeichnet werden muss, weil ein Teil des Fensters verdeckt war, dann wird OnPaint ja aufgerufen. Aber derweil recht es ja die Änderungen zu zeichnen statt allem.

Zudem kannst du in FormCreate DoubleBuffered auf True setzen, das hilft vermutlich auch.
ultraz06 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Do 29.01.09 21:39 
ich habe es jetzt so gemacht
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Zeichnen;
begin
Puffer.Canvas.Draw(0, 0, Hg);
 if gruenSichtbar and blausichtbar
      then begin
   Puffer.Canvas.Draw(xblau, yblau, blau);
   Puffer.Canvas.Draw(xgruen, ygruen, gruen);
   PaintBox1.Canvas.Draw(0, 0, Puffer)   end
 else if blausichtbar
          then begin
      Puffer.Canvas.Draw(xblau, yblau, blau);
      PaintBox1.Canvas.Draw(0, 0, Puffer)end
                else if gruensichtbar then begin
      Puffer.Canvas.Draw(xgruen, ygruen, gruen);
      PaintBox1.Canvas.Draw(0, 0, Puffer)   end
                else if gruensichtbar=false and blausichtbar=false then
                PaintBox1.Canvas.Draw(0, 0, Puffer)    ;

end;

aber das stimmt mit meiner
ausblenden 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:
procedure TForm1.paintbox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin

if anz<=0 then
if Button = mbRight then
begin
    Image1.Visible := true;
    Image2.Visible :=true;
    Image3.Visible := true ;
    Image4.Visible := true;
    Image5.Visible:=true;
    anz:=5;
end;
if anz>0 then
  if  (X >= xblau) and (X <= xblau + blau.Width)
    and (Y >= yblau) and (Y <= yblau + blau.Height)
    then blausichtbar := false  else


 if   (X >= xgruen) and (X <= xgruen + gruen.Width)
    and (Y >= ygruen) and (Y <= ygruen + gruen.Height)
    then gruensichtbar := false else
   end;
nicht überein
immer wenn ich einen ballon anklicke verschwindet er zwar, aber wenn ich den 2 ballon anklicken will verschwindet er nicht sondern bleibt einfach nur stehen oO
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Fr 30.01.09 10:40 
also...

zu deiner Zeichnen-Routine:
Die ist doppelt-und-dreifach gemoppelt.
Ohne Prüfung auf Funktion kann man die zunächst einmal folgendermaßen kürzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Zeichnen;
begin
  Puffer.Canvas.Draw(0,0,Hg);
  if (gruenSichtbar) then  Puffer.Canvas.Draw(xgruen,ygruen,gruen);
  if (blauSichtbar) then  Puffer.Canvas.Draw(xblau,yblau,blau);
  PaintBox1.Canvas.Draw(0,0,Puffer);
end;


Du schreibst, die Zeichnen-Routine stimmt nicht mit der MouseDown-Routine überein.
Wie meinst du das? Was stimmt hier nicht überein?

Du schreibst, der zweite Ballon "bleibt stehen". Wenn ich das richtig verstehe, setzt du eine Variable "blausichtbar" / "gruensichtbar" auf false, um den ballon auszublenden.
Setze doch mal einen Breakpoint (siehe Delphi Hilfe) und schaue nach, welchen wert die entsprechende Variable hat. Wird die korrekt auf "false" gesetzt? Falls "nein", ist hier dein Ansatzpunkt.

Ich schätze aber eher, dass dein Problem darauf zurückzuführen ist, dass du nicht die ganze Grafik neuzeichnest.
Das kannst du prüfen, indem du zuerst auf den Ballon klickst, so dass dieser "stehen bleibt". Dann verschiebe das Fenster so an den Rand des Bildschirms, dass der Ballon nicht mehr zu sehen ist. Dann verschiebe das Fenster zurück. Ist der Ballon jetzt noch zu sehen? Falls "nein", so ist hier dein Ansatzpunkt.


edit:
Dein Code kann so übrigens gar nicht funktionieren.
Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if   (X >= xgruen) and (X <= xgruen + gruen.Width)
    and (Y >= ygruen) and (Y <= ygruen + gruen.Height)
    then gruensichtbar := false else
   end;

Das else ist zuviel / gehört hier nicht rein

_________________
Delphi: XE - OS: Windows 7 Professional x64