AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zeichnen sowie ab wann ist alles verfügbar?

Ein Thema von Memnarch · begonnen am 19. Mai 2011 · letzter Beitrag vom 20. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

Zeichnen sowie ab wann ist alles verfügbar?

  Alt 19. Mai 2011, 22:54
NAbend,
ich habe ein problem.

Aufgrund gewisser umstände wird meine Zeichenfläche momentan mit einem timer konstant aktualisiert.
Der timer ist auf der selben form wie meine zeichenfläche(die übrigens eine ableitung von TPaintBox ist).

Ich habe verschiedenes probiert: Timer default auf enabled, enabled am ende von MYFormCreate, oder timer enabled in FormActivate.

Aus irgend einem grund bekomme ich Random Accessviolations beim starten. Logging mit smartinspect kann ich vergessen, sobald das eingeschaltet ist, gibt es kein problem mehr >.<.

Zuvor hatte ich es so, dass ich in WMMouseMove beine zeichenarbeit erledigt habe, und dann von dort refreshed habe. Leider wird wmmove sooft gefeuert dass die CPU apknickt und win7 irgendwan meldet die app sei futsch.

Meine TPaintBox ableitung erstellt noch ein paar objecte in ihrem constructor(nen buffer, und noch 2 benötigte bitmaps).

Jemand nen rat wie ich das zeichnen durch den User am besten aktualisiere?

Geändert von Memnarch (20. Mai 2011 um 14:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 19. Mai 2011, 23:06
Zeichne auf ein Bitnmap im Speicher und kopiere es im OnPaint auf die Zeichenfläche. Dann sparst du dir den Timer und es ist immer aktuell.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 20. Mai 2011, 01:45
Okay.
Und unter welchen umständen wird onPAint aufgerufen?

Wenn ich z.b eine Linie zeichne würde sie ja in den buffer geschrieben, muss ich danach per Refresh das onPaint triggern?(Sonst wird ja erst wieder gezeichnen wenn windows es benötigt bzw die vcl)
  Mit Zitat antworten Zitat
Bora4d

Registriert seit: 8. Okt 2006
26 Beiträge
 
Delphi 7 Professional
 
#4

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 20. Mai 2011, 01:48
Nach Aufruf von SetParent ist der Canvas- oder Fenster-Handle gültig.
Überschreibe in dein abgeleiteten Control oder in Form SetParent und setzte dein Timer dort aktiv. Du mußt nur achten dass der Handle gültig ist. Also auf <>0 überprüfen. Beim zerstören des Controls wird SetParent mit 0 aufgerufen.

Das ist die Funktion:

protected
procedure SetParent(AParent: TWinControl); virtual;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 20. Mai 2011, 07:22
muss ich danach per Refresh das onPaint triggern?(Sonst wird ja erst wieder gezeichnen wenn windows es benötigt bzw die vcl)
Richtig. Du kannst das ganze natürlich auch von Hand auslösen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.853 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 20. Mai 2011, 07:29
Grundsätzlich sollte bei einer PaintBox immer über Invalidate das OnPaint getriggert werden und alle Zeichenoperationen finden ausschließlich im OnPaint statt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#7

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 20. Mai 2011, 08:36
@Uwe: Das heißt aber dass ich meinen Buffer aber auch woanders füllen kann, das zeichnen auf den canvas der Paintbox selbst sollte dann dort stehen, oder?


MFG
Memnarch
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.853 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 20. Mai 2011, 08:52
@Uwe: Das heißt aber dass ich meinen Buffer aber auch woanders füllen kann, das zeichnen auf den canvas der Paintbox selbst sollte dann dort stehen, oder?
Genau!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#9

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 20. Mai 2011, 09:04
Ah gut....vielleicht bekomm ich mein Tool jetzt endlich mal gefixxed. v1.3 lässt wegen dem fehler schon auf sich warten
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Zichenen sowie ab wann ist alles verfügbar?

  Alt 20. Mai 2011, 09:41
Eine bischen gespielt...
Delphi-Quellcode:
unit UPaintboxBuffer;

interface

uses
  ExtCtrls, Graphics;

type
  TPaintboxBuffer = class
  private
    FPaintBox : TPaintBox;
    FBitmapA,
    FBitmapB : TBitmap;
    FWorkBmp : TBitmap; // either FBitmapA or FBitmapB
    procedure CreateBitmap(var Bmp : TBitmap; W, H : Integer);
    procedure OnPaintHandler(Sender: TObject);
  public
    constructor Create(APaintBox : TPaintBox);
    destructor Destroy;
    procedure SwitchBitmap;
    property Bitmap : TBitmap read FWorkBmp;
  end;

implementation

constructor TPaintboxBuffer.Create(APaintBox : TPaintBox);
begin
  FPaintBox := APaintBox;
  CreateBitmap(FBitmapA, FPaintBox.Width, FPaintBox.Height);
  CreateBitmap(FBitmapB, FPaintBox.Width, FPaintBox.Height);
  FWorkBmp := FBitmapA;
  FPaintBox.OnPaint := OnPaintHandler;
end;

procedure TPaintboxBuffer.CreateBitmap(var Bmp : TBitmap; W, H : Integer);
begin
  Bmp := TBitmap.Create;
  Bmp.Width := W;
  Bmp.Height := H;
end;

destructor TPaintboxBuffer.Destroy;
begin
  FPaintBox.OnPaint := NIL;
  FBitmapA.Free;
  FBitmapB.Free;
end;

procedure TPaintboxBuffer.OnPaintHandler(Sender: TObject);
begin
  FPaintBox.Canvas.StretchDraw(FPaintBox.Canvas.ClipRect, FWorkBmp);
end;

procedure TPaintboxBuffer.SwitchBitmap;
begin
  if FWorkBmp = FBitMapA then
    FWorkBmp := FBitMapB
  else
    FWorkBmp := FBitMapA;
  FPaintBox.Invalidate;
end;

end.
Beispiel:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  p : Pointer;
  s : String;
begin
  Timer1.Enabled := False;
  with PaintBoxBuffer do
  begin
    // Bitmap füllen
    p := Bitmap;
    s := DateTimeToStr(Now) +' Used Bitmap: $'+ IntToHex(Integer(p), 8);
    Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);
    Bitmap.Canvas.TextOut(10,10, s);
    // umschalten
    SwitchBitmap;
  end;
  Timer1.Enabled := True;
end;
Falls das nichts mit dem Ausgangs-Problem zu tun hat oder anderweitig unpassend ist... egal, hat mich von meiner regulären Arbeit abgehalten, wodurch sich das für mich schon gelohnt hat

Geändert von Satty67 (20. Mai 2011 um 09:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf