Autor Beitrag
sunday_2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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 :oops: ). 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222

Win XP Pro, Slackware 10.0
D5 Enterprise, C++, ABAP
BeitragVerfasst: Do 12.12.02 15:21 
Hmm ich kenne deinen Quellcode nicht, aber ich sehe da eigentlich kein Problem. Hier mal auf die Schnelle:


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: Do 12.12.02 17:51 
Ähnlich habe ich es probiert.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222

Win XP Pro, Slackware 10.0
D5 Enterprise, C++, ABAP
BeitragVerfasst: So 22.12.02 14:41 
sunday_2 hat folgendes geschrieben:
Ähnlich habe ich es probiert.

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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



BeitragVerfasst: 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:

ausblenden volle Höhe 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:
 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 96



BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 96



BeitragVerfasst: 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)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 96



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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 8)

_________________
Gruß Sunday

... wer nicht fragt, bleibt dumm!!!