Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DoubleBuffered funktioniert nicht (https://www.delphipraxis.net/39315-doublebuffered-funktioniert-nicht.html)

PierreB 31. Jan 2005 21:03


DoubleBuffered funktioniert nicht
 
Moin Moin,

ich habe verschiebe in meinem Programm ein Label (Laufschrift) jedoch flimmert es stark beim Verschieben. Also hab ich versucht das Problem mit
Code:
Form1.doublebuffered := True;
zu lösen. Mein Delphi 3 jedoch sagt 'Unbekannter Bezeichner DoubleBuffered'. Was is da los? Gibs noch ne andere Möglichkeit ?
Vielen Dank,

toms 31. Jan 2005 21:11

Re: DoubleBuffered funktioniert nicht
 
Hi,

Delphi 3 kennt DoubleBuffered leider noch nicht

PierreB 31. Jan 2005 21:12

Re: DoubleBuffered funktioniert nicht
 
Zitat:

Zitat von toms
Hi,

Delphi 3 kennt DoubleBuffered leider noch nicht

Das ist aber sehr schlecht. :(
Gibs da net noch ne andere Methode denn wenn das Label so flackert sieht es in meinem Spiel echt dämlich aus...

mirage228 1. Feb 2005 05:57

Re: DoubleBuffered funktioniert nicht
 
Hi,

Du könntest das WM_PAINT Deiner Labels umbiegen und dann selber erst auf ein Bitmap (CreateCompatibleBitmap) zeichnen und das dann mit BitBlt darstellen, so wie es die VCL macht.

Wenn Du magst, kann ich Dir teile des entsprechenden Codes der Vcl mal per PN schicken (falls das erlaubt ist...)

mfG
mirage228

alcaeus 1. Feb 2005 06:56

Re: DoubleBuffered funktioniert nicht
 
Zitat:

Zitat von mirage228
Wenn Du magst, kann ich Dir teile des entsprechenden Codes der Vcl mal per PN schicken (falls das erlaubt ist...)

Nachdem er die D3 Pro hat, und dort AFAIR auch die VCL-Sourcen dabei sind dürfte das kein Problem sein, ich bin mir aber nicht 100%ig sicher...

Greetz
alcaeus

negaH 1. Feb 2005 06:59

Re: DoubleBuffered funktioniert nicht
 
sofort nach dem Label.Caption := 'xyz'; ein Label.Update; aufrufen.

Gruß Hagen

PierreB 1. Feb 2005 16:31

Re: DoubleBuffered funktioniert nicht
 
Zitat:

Zitat von negaH
sofort nach dem Label.Caption := 'xyz'; ein Label.Update; aufrufen.

Gruß Hagen

Nein, funzt leider net. :(
Ich hab zwei Labels dir wie "von Geisterhand" geschrieben werden sollen. Also das erste Label fängt an, wenn der String dann vollständig da ist, fängt das Label2 an. Beim Label1 ist alles ok, nur das zweite flackert dann heftig. Kann einer helfen ? Hier mal der Source:
Code:
var
i,h : integer;
procedure form1.timer1timer (Sender: TObject);
const
anfang = 'Herzlich Willkommen bei EliteHacker ! Unsere Firma sucht stets nach neuen Mitarbeitern!';
anfang1 = 'Bitte erstellen Sie ein neues Konto oder laden Sie ihren Spielstand. Viel Spass!';
begin
i := i + 1;
if i < 83 then
label1.caption := label1.caption + anfang[i];
if label1.caption = 'Herzlich Willkommen bei EliteHacker ! Unsere Firma sucht stets nach neuen Mitarbeitern!' then begin
h := h + 1;
if h < 86 then
label2.caption := label2.caption + anfang[h];
end
end;

negaH 2. Feb 2005 08:09

Re: DoubleBuffered funktioniert nicht
 
Dann nimm unter Delphi3 eine TPaintBox statt der Labels. Die Texte in eigene Strings und mit PaintBox.OnPaint() direkt in deinem Timer neugezeichnet. Im .OnPaint Event deiner Paintbox nun diese Strings mit DrawText(Canvas.Handle, ...) zeichnen. Dabei ist es wichtig das du NUR ZU BESTIMMTEN Zeitpunkten vorher mit Canvas.FillRect() den Text löschst. Achso: vor dem Zeichnen mit DrawText() noch SetBkMode(Canvas.Handle, TRANSPARENT); aufrufen.

Könnte alsoso aussehen:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    PaintBox1: TPainBox;
    PaintBox2: TPainBox;

  private
    FLabel1, FLabel2: String;
   
    procedure PaintBox1Paint(Sender: TObject);
    procedure PaintBox2Paint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  protected
    procedure DoPaintBoxPaint(Sender: TObject; const Text: String; Erase: Boolean);


  end;

procedure TForm1.DoPaintBoxPaint(Sender: TObject; const Text: String; Erase: Boolean);
var
  R: TRect;
begin
  with (Sender as TPaintBox), Canvas do
  begin
    R := ClientRect;
    if Erase then FillRect(R);
    SetBkMode(Handle, Transparent);
    DrawText(Handle, PChar(Text), Length(Text), @R, dt_Left or dt_SingleLine or dt_VCenter);
  end;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  DoPaintBoxPaint(Sender, FLabel1, True);
end;

procedure TForm1.PaintBox2Paint(Sender: TObject);
begin
  DoPaintBoxPaint(Sender, FLabel2, True);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  FLabel1 := FLabel1 + ....;
  DoPaintBoxPaint(PaintBox1, FLabel1, False);
  if Bumsda then
    DoPaintBoxPaint(PaintBox2, FLabel2, False);
end;
Gruß Hagen

PierreB 4. Feb 2005 13:44

Re: DoubleBuffered funktioniert nicht
 
OK, vielen Dank erstmal. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 Uhr.

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