| Autor |
Beitrag |
sunday_2
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Do 12.12.02 12:10
Hi Leute,
ich habe folgendes Prob:
Ich möchte ein Bild (gif, jpg,...) von links oben nach rechts unten über den Bildschirm laufen lassen. Tut es auch. Leider zieht er eine Spur hinter sich und das Bild kann man niemanden mehr zeigen (zumindest nicht ohne  ). Habe bereits versucht es mit application.ProcessMessages und mit doublebuffered := true hinzubekommen. Klappt aber nicht. Das Bild ist übrigens in einem TImage.
Wäre für hilfe echt dankbar.
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Jack Falworth
      
Beiträge: 222
Win XP Pro, Slackware 10.0
D5 Enterprise, C++, ABAP
|
Verfasst: Do 12.12.02 15:21
Hmm ich kenne deinen Quellcode nicht, aber ich sehe da eigentlich kein Problem. Hier mal auf die Schnelle:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Create (Sender:TObject); begin Image1.Left:= 5; Image1.Top:= 5; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin Image1.Left:= Image1.Left +5; Image1.Top:= Image1.Top +5; end;
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:= not Timer1.Enabled; end; |
MfG
Jack Falworth
|
|
a.C.k
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Do 12.12.02 17:50
Wie groß ist denn dein Bild?
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
sunday_2 
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Do 12.12.02 17:51
Ähnlich habe ich es probiert.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure Tfun_football.Timer7Timer(Sender: TObject); begin if (Image4.top=220) and (Image4.left = 350) then begin Counter:= Counter+1; if counter = 500 then begin counter:=0; Timer7.Enabled:=false; P_Grafikevent.Visible:= false; end; end else begin if Image4.Top <> 220 then Image4.Top:= Image4.Top-10; if Image4.Left <> 350 then Image4.Left:= Image4.Left-10; application.ProcessMessages; end; |
Die Procedure soll starten, wenn wenn der Timer läuft. Tut sie ja auch. Aber das Ergebnis sieht echt bescheiden aus. 
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Fr 13.12.02 22:07
Hi,
ich sehe da keinen fehler drin...
wenn du es bisher nicht geschafft hast, schick mir doch einfach mal den Quellcode und/oder die EXE datei... vieleicht liegt es ja an deinem PC?
Au'revoir,
Aya~
PS: Aya@Koshigaya.de
|
|
UcL
Hält's aus hier
Beiträge: 12
|
Verfasst: So 22.12.02 13:07
Hallo !
ich hab das gleich problem...
vor nem jahr oder so hab ich auch mal irgendwo eine anleitung zum "flackerfreien verschieben" gesehen ...
ahh vielleicht hilft das hier:
www.kaestnerpro.de/bmpschib.htm
gruß
ucl
|
|
Jack Falworth
      
Beiträge: 222
Win XP Pro, Slackware 10.0
D5 Enterprise, C++, ABAP
|
Verfasst: So 22.12.02 14:41
| sunday_2 hat folgendes geschrieben: | Ähnlich habe ich es probiert.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure Tfun_football.Timer7Timer(Sender: TObject); [...] else begin if Image4.Top <> 220 then Image4.Top:= Image4.Top-10; if Image4.Left <> 350 then Image4.Left:= Image4.Left-10; application.ProcessMessages; end; |
Die Procedure soll starten, wenn wenn der Timer läuft. Tut sie ja auch. Aber das Ergebnis sieht echt bescheiden aus.  |
Ähm Moment. Du willst doch das Bild von Rechts oben nach links unten verschieben, oder? Dann müsste es aber folgendermaßen heißen:
Quelltext 1: 2: 3: 4:
| if...then Image4.Top:= Image4.Top+10 und Image4.Left:= Image4.Left+10 |
Noch was: Wo hast du doublebuffered true hingeschrieben?
Hast du dein Image schonmal in eine Scrollbox gemacht und dann
Scrollbox1.doublebuffered:= true geschrieben? Das hat bei mir immer funktioniert.
MfG
Jack Falworth
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: So 22.12.02 18:13
Ach ja..!
Wenn du dein Image auf nem Panel hast, dann bringt es GARNIX das Form DoubleBuffered zu machen, dann mußt du das Panel auf dem das Image ist ebenfalls DoubleBuffered machen
Au'revoir,
Aya~
|
|
sunday_2 
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Fr 27.12.02 10:32
Hi,
erstmal danke für die vielen Antworten.
Jack Falworth hat geschrieben:
| Zitat: |
Hast du dein Image schonmal in eine Scrollbox gemacht und dann
Scrollbox1.doublebuffered:= true geschrieben? Das hat bei mir immer funktioniert.
|
Kannst Du das mal genauer erklären? Image in Scrollbox????
UcL hat geschrieben:
| Zitat: |
vor nem jahr oder so hab ich auch mal irgendwo eine anleitung zum "flackerfreien verschieben" gesehen ...
ahh vielleicht hilft das hier:
www.kaestnerpro.de/bmpschib.htm
|
Das klappt eigentlich ganz gut. Hat leider zwei Haken.
1. Es wird eine 'Spur' hinter dem Bild hergezogen.
2. Es funktioniert nur mit Bitmaps.
Kennt irgendjemand eine ähnliche Funktion, die auch für jpg und gif-Bilder funktioniert?
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Fr 27.12.02 11:29
Zwar glaubt es mir nie einer, aber die Formular-Canvas hat nur eine Temporärleinwand. Wer direkt drauf zeichnet, der soll sich nicht wundern wenn seine Zeichnung gelöscht oder verschmiert wird.
Dein Problem ist, daß du eine Bitmap auf der Formular-Canvas gezeichnet hast und dann eine Image-Komponente drüber bewegt hast. Das ist so, als ob du auf einer (richtigen) Leinwand mit Ölfarben ein Bild gemalt hättest und dann, solange die Farben noch naß sind, mit dem Hand drübergestrichen hättest. Das verschmiert auch. Wenn du also über dem Formular-Canvas was zeichnest, dann verschmierst du die Canvas. Du mußt also mit einer Pufferbitmap arbeiten und den Bereich (der verschmiert worden ist) immer wieder erneuern.
Damit es nicht verschmiert (und flackert) mußt du zuerst auf einer Pufferbitmap zeichnen und dann das Ergebnis auf die Canvas bringen.
Hier das Prinzip:
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:
| var Form1: TForm1; BmpPuffer: TBitmap; Bmp1: TBitmap; Bmp2: TBitmap;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); const B1 = 'c:\win98se\setup.bmp'; B2 = 'c:\win98se\1stboot.bmp'; begin BmpPuffer := TBitmap.Create; BmpPuffer.Width := ClientWidth; BmpPuffer.Height := ClientHeight; Bmp1 := TBitmap.Create; Bmp2 := TBitmap.Create; Bmp1.LoadFromFile(B1); Bmp2.LoadFromFile(B2); end;
procedure TForm1.FormDestroy(Sender: TObject); begin Bmp2.Free; Bmp1.Free; BmpPuffer.Free; end;
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 1 to ClientWidth do begin BmpPuffer.Canvas.Draw(0, 0, Bmp1); BmpPuffer.Canvas.Draw(i, 20, Bmp2);
Canvas.Draw(0, 0, BmpPuffer); end; end; |
Wie gesagt: es ist nur das Prinzip!
Für kleine Sachen ist es Ok. Für große ist es zu langsam, da die große Bitmap immer komplett gezeichnet wird. Das bremst die ganze Sache.
Zu deinem Wunsch es mit Jpeg oder Gif machen zu können. Das geht "nicht". Intern arbeitet Windows nur mit Bitmaps. Du mußt also zuerst Jpeg oder Gif in Bitmap umwandeln und es dann zeichnen.
|
|
kampfkoloss23
      
Beiträge: 96
|
Verfasst: So 29.12.02 18:01
mit dieser Methode hab ich nen recht umfangreiches Programm
geschrieben, wie geht es schneller??
(ein Hintergrundbild derart einzufügen verbrauch z.B höllisch viel
Zeit)
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: So 29.12.02 19:01
| kampfkoloss23 hat folgendes geschrieben: | | wie geht es schneller?? |
Einfach nur den Bereich zeichnen der verändert wurde. Nicht immer die ganze Bitmap neu zeichnen.
|
|
kampfkoloss23
      
Beiträge: 96
|
Verfasst: So 29.12.02 19:43
hab ich schon gemacht, doch auch zu langsam!!!
Bei einem Hintergrundbild z. B auf dem irgendetwas bewegt wird
erst alte Position mit fillrect (rect()); Dabei wird jedoch das gesamte Bild geladen oder nicht?? Auf jeden Fall ist es sau langsam. Irgendwie muss man doch schneller Irgendwelche animationen ausführen können.
Im Moment laufen so ca 10-30 kleine Bitmaps über den Bildschirm, dabei wird am Anfang alles nur scharz überzeichnet. Läuft gut, aber für weitere Features ist es zu langsam.
so ist der Aufruf der einzelnen Bitmaps gemacht: (jedesmal und das 50 mal pro sec)
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Bitmap1 := TBitmap.Create; try Bitmap1.LoadFromFile('Mine.bmp'); image1.Canvas.Brush.Bitmap := Bitmap1; image1.canvas.draw(round(Mine[it].x),round(Mine[it].y),Bitmap1); finally image1.Canvas.Brush.Bitmap := nil; Bitmap1.Free; end; |
(30.12. 10:37 Tino) Code-Tags hinzugefügt
|
|
kampfkoloss23
      
Beiträge: 96
|
Verfasst: So 29.12.02 19:55
ach ja und zum Flimmern:
Ich denke, dass es davon herrührt, dass die Form neu "gemalt" wird. Dieses kann man ganz einfach ausstellen. Sie ist dann allerdings durchsichtig und man sollte,falls man eine feste haben will überall images
hinmachen.
Den Befehl findet ihr und dem Beispiel
Bitmap.example in der Hilfe
Hier habt ihr ihn:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| ... private { Private declarations } procedure WMEraseBkgnd(var m: TWMEraseBkgnd); message WM_ERASEBKGND; ...
procedure Tform1.WMEraseBkgnd(var m : TWMEraseBkgnd); begin m.Result := LRESULT(False); end;
... |
Funktioniert bei mir perfekt und absolut flimmerfrei.
(30.12. 10:38 Tino) Code-Tags hinzugefügt.
|
|
sunday_2 
      
Beiträge: 101
Delphi 7.0
|
Verfasst: Mo 30.12.02 10:02
Hi,
habe eine für mich ausreichende Lösung gefunden(aber auch nur, weil ich nur mit einer Grafik arbeiten muß.) Flimmerfrei Grafiken verschieben kann man, wenn man die Grafik auf ein Panel packt und das Panel verschiebt.
Ich wünsch einen Guten Rutsch 
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|