![]() |
Image zeichnet nicht neu (nur bei Formular Resize)
Liste der Anhänge anzeigen (Anzahl: 1)
Zur zeit programmiere ich an einem 4Gewinnt. Also nichts hochtrabend Neues.
Bisher auch noch ohne objects. Aber schon beim Zeichnen treten die ersten Probleme auf. Bei jedem klicken auf das Image1, welches das Spielfeld anzeigt, wird das interne Array richtig befüllt, aber auf meinem Image ist davon nichts zu sehen. Wenn ich nun die Größe der Form verändere wird alles richtig gezeichnet. Wo liegt hier also der Fehler? (Refreshes brachten keinen Erfolg)
Delphi-Quellcode:
Danke für eure Hilfe
procedure tform1.feldzeichnen(f: tfeld;var img: timage);
const verhaeltnis= 7 / 6; var kreisdurchmesser,i,ii,imgweite,imghoehe: integer; r,b: trect; zwischenspeicher: timage; begin zwischenspeicher:= timage.Create(self); { hier nur vorgeplänkel idee: image wird angepasst an fenster. die spielsteinimages(img1,img2,imgunbesetzt) orientieren sich an der größe des hauptimages danach werden per stretchdraw die spielsteine, wie gewünscht, auf das hauptimage kopiert } if (self.clientwidth / self.clientheight) > verhaeltnis //wenn fenster breiter ist then begin kreisdurchmesser:= ((self.ClientHeight-2*img.Top) div 6); end else //wenn fenster höher ist begin kreisdurchmesser:= ((self.ClientWidth-2*img.Left) div 7); end; imgweite:= 7*kreisdurchmesser; imghoehe:= 6*kreisdurchmesser; img1.Height:= kreisdurchmesser; img2.Height:= kreisdurchmesser; imgunbesetzt.Height:= kreisdurchmesser; img1.Width:= kreisdurchmesser; img2.Width:= kreisdurchmesser; imgunbesetzt.Width:= kreisdurchmesser; zellezeichnen(img1,clspieler1,clfeldhintergrund,rect(0,0,img1.Width,img1.Height)); zellezeichnen(img2,clspieler2,clfeldhintergrund,rect(0,0,img2.Width,img2.Height)); zellezeichnen(imgunbesetzt,clunbesetzt,clfeldhintergrund,rect(0,0,imgunbesetzt.Width,imgunbesetzt.Height)); if (imghoehe<> img.Height)or(imgweite<> img.Width) //nur wenn wirklich eine neue größe vorhanden ist then begin img.Picture:= nil; img.Height:= imghoehe; img.Width:= imgweite; zwischenspeicher.Width:= imgweite; zwischenspeicher.Height:= imghoehe; zwischenspeicher.Canvas.Brush.Color:= clfeldhintergrund; zwischenspeicher.Canvas.Rectangle(0,0,img.Width,img.Height); zwischenspeicher.Canvas.FloodFill(2,2,clwhite,fsborder); b:= rect(0,0,imgweite,imghoehe); for i:= 1 to 7 do begin for ii:= 1 to 6 do begin r:= rect((i-1)*kreisdurchmesser,img.Height-ii*kreisdurchmesser,i*kreisdurchmesser,img.Height-(ii-1)*kreisdurchmesser); if f[i,ii].besetzt then begin if f[i,ii].spieler then begin zwischenspeicher.Canvas.StretchDraw(r,img1.Picture.bitmap); end else begin zwischenspeicher.Canvas.StretchDraw(r,img2.Picture.bitmap); end; end else //hier hin wenn unbesetzt begin zwischenspeicher.Canvas.StretchDraw(r,imgunbesetzt.Picture.bitmap); end; end;//for ii end;//for i end;//bilddimensionen verändert img.Canvas.draw(0,0,zwischenspeicher.Picture.Bitmap); //VERMUTLICH LIEGT DER FEHLER HIER zwischenspeicher.Free; end;//proc felzeichnen |
Re: Image zeichnet nicht neu (nur bei Formular Resize)
push
|
Re: Image zeichnet nicht neu (nur bei Formular Resize)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe auch mal ein kleines Spielprojekt 4-gewinnt für Server/Client geschrieben. Für die Pause ;-) bei uns. Steht per default aber auf Stand-Alone-Game. Ich hänge das Projekt samt Quellcode (BDS 2006) mal an. |
Re: Image zeichnet nicht neu (nur bei Formular Resize)
Wenn ich das Problem korrekt verstehe, sollte ein Offscreenbitmap das Problem beheben.
|
Re: Image zeichnet nicht neu (nur bei Formular Resize)
"zwischenspeicher"= offscreenbitmap
so hatte ich mir das woanders abgeguckt. aber egal ob bitmap oder image: nie klappt das mit dem neuzeichnen. immer erst wenn ich die größe des formulars ändere und somit oft hintereinander auch das ausgabeimage neugezeichnet wird, denn die größe des ausgabeimages richtet sich nach der größe des formulars. |
Re: Image zeichnet nicht neu (nur bei Formular Resize)
Zitat:
Und wenn du selbst das neuzeichnen auslösen willst, dann nutze Invalidate. |
Re: Image zeichnet nicht neu (nur bei Formular Resize)
sohabe invalidate in die schleife gesetzt. müsste also 42 mal aufgerufen werden und es passiert einfach nix.
für onpaint müsste ich auf tpaintbox umsteigen? es ist doch bei einem image egal ob übergabe- oder verweisparameter(hab beides ausprobiert)? |
Re: Image zeichnet nicht neu (nur bei Formular Resize)
Zitat:
Und immer das Invalidate des Elementes aufrufen, welches neu gezeichnet werden soll! Zitat:
Zitat:
Mit einem Offscreen Bitmap werden die Images zum zeichnen überflüssig, das ist dir klar, oder? Somit müssten die von der Fläche weg, wo das OffScreen Bitmap hingezeichnet wird. Nur mal so zur Sicherheit erwähnt... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz