Einzelnen Beitrag anzeigen

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, 17: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