AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Image zeichnet nicht neu (nur bei Formular Resize)
Thema durchsuchen
Ansicht
Themen-Optionen

Image zeichnet nicht neu (nur bei Formular Resize)

Ein Thema von pirechner · begonnen am 27. Mär 2008 · letzter Beitrag vom 31. Mär 2008
Antwort Antwort
pirechner

Registriert seit: 29. Jun 2004
36 Beiträge
 
Delphi 7 Professional
 
#1

Image zeichnet nicht neu (nur bei Formular Resize)

  Alt 27. Mär 2008, 16:39
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:
    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
Danke für eure Hilfe
Angehängte Dateien
Dateityp: pas m4g_102.pas (7,0 KB, 4x aufgerufen)
pi ist Sonntags = 4
  Mit Zitat antworten Zitat
pirechner

Registriert seit: 29. Jun 2004
36 Beiträge
 
Delphi 7 Professional
 
#2

Re: Image zeichnet nicht neu (nur bei Formular Resize)

  Alt 30. Mär 2008, 18:20
push
pi ist Sonntags = 4
  Mit Zitat antworten Zitat
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Image zeichnet nicht neu (nur bei Formular Resize)

  Alt 30. Mär 2008, 18:48
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.
Angehängte Dateien
Dateityp: zip fourwins_692.zip (1,92 MB, 10x aufgerufen)
Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Image zeichnet nicht neu (nur bei Formular Resize)

  Alt 30. Mär 2008, 18:50
Wenn ich das Problem korrekt verstehe, sollte ein Offscreenbitmap das Problem beheben.
Frank Dumont
  Mit Zitat antworten Zitat
pirechner

Registriert seit: 29. Jun 2004
36 Beiträge
 
Delphi 7 Professional
 
#5

Re: Image zeichnet nicht neu (nur bei Formular Resize)

  Alt 31. Mär 2008, 00:25
"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.
pi ist Sonntags = 4
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Image zeichnet nicht neu (nur bei Formular Resize)

  Alt 31. Mär 2008, 00:33
Zitat von pirechner:
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.
Das ist dann definitiv eine falsche Umsetzung von dir. Wenn du eine OffscreenBitmap verwendest und diese im OnPaint des Elements zeichnest auf dem es erscheinen soll, dann klappt es - egal wann.

Und wenn du selbst das neuzeichnen auslösen willst, dann nutze Invalidate.
  Mit Zitat antworten Zitat
pirechner

Registriert seit: 29. Jun 2004
36 Beiträge
 
Delphi 7 Professional
 
#7

Re: Image zeichnet nicht neu (nur bei Formular Resize)

  Alt 31. Mär 2008, 00:53
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)?
pi ist Sonntags = 4
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Image zeichnet nicht neu (nur bei Formular Resize)

  Alt 31. Mär 2008, 07:10
Zitat von pirechner:
sohabe invalidate in die schleife gesetzt. müsste also 42 mal aufgerufen werden und es passiert einfach nix.
Warum das? Die Invalidates werden zusammen gefasst zu einer neuzeichen-Operation, somit sind mehrfache Aufrufe für den gleichen Bereich direkt hintereinander unnötig.

Und immer das Invalidate des Elementes aufrufen, welches neu gezeichnet werden soll!

Zitat von pirechner:
für onpaint müsste ich auf tpaintbox umsteigen?
Wieso solltest du? Du kannst dein Bitmap auch direkt auf die Form bringen, die hat auch ein OnPaint Ereignis.

Zitat von pirechner:
es ist doch bei einem image egal ob übergabe- oder verweisparameter(hab beides ausprobiert)?
Das wäre egal, da Instanzen intern immer Zeiger sind und somit ist es definitiv egal wie du es übergibst.

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...
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:32 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