Autor Beitrag
Aerin Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 04.12.06 21:24 
OK, aber wie gebe ich ein Array frei?
Habs mit
Array.Free;
versucht, also wie bei Bitmaps, aber da kommt nen Fehler.

Und ich hätte da noch eine andere Frage:
Inzwischen hat mein Prog mehrere Bitmaps.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
public

    Hintergrund                                  : TBitmap;
    HGPunkte,HGSpannbaum                         : TBitmap;


Die Hintergrundbitmap wird immer noch wird beim starten bemalt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TF_1.FormCreate(Sender: TObject);
  begin

  Hintergrund                    := TBitmap.Create;                        //Bitmap erzeugen
  Hintergrund.Canvas.Brush.Color := clWhite;                               //Farbe des Pinsels festlegen
  Hintergrund.Canvas.Pen.Color   := clWhite;                               //Farbe des Stifts festlegen
  Hintergrund.Width              := PB_Oberflaeche.Width;                  //Breite der Bitmap festlegen
  Hintergrund.Height             := PB_Oberflaeche.Height;                 //Höhe festlegen
  Hintergrund.Canvas.Rectangle(0,0,Hintergrund.Width,Hintergrund.Height);  //weißes Rechteck in die Bitmap zeichnen, dasss die komplette Bitmap abdeckt
end;


In OnPaint wird die OffScreenBitmap Hintergrund auf meine PB geladen und auf Click Punkte gemalt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TF_1.PB_OberflaechePaint(Sender: TObject);
  begin

  BitBlt(PB_Oberflaeche.Canvas.Handle, 00, Hintergrund.Width, Hintergrund.Height, Hintergrund.Canvas.Handle, 00, SrcCopy);  //PB_Oberflaeche.Canvas.Draw(0,0,Hintergrund); //Die weiße Bitmap wird auf die Paintbox gemalt
 
  end;

procedure TF_1.PB_OberflaecheClick(Sender: TObject);
  var
    Point  : TPoint;
  begin

  GetCursorPos(Point);
  Point := PB_Oberflaeche.ScreenToClient(Point);
  Hintergrund.Canvas.Brush.Color := clBlack;
  Hintergrund.Canvas.Pen.Color   := clBlack;
  Hintergrund.Canvas.Rectangle(Point.x-3,Point.y-3,Point.x+3,Point.y+3); //Hintergrund.Canvas.Pixels[Point.x,Point.y] := clBlack;
  PB_Oberflaeche.Repaint;
 
  end;


In einer weiteren click procedure erstell ich die anderen beide Bitmaps und weise darauf Hintergrund zu, dann zeichne ich in einer Schleife Linien auf die HGSpanbaum Bitmap. Solange bleiben nur die schwarzen Punkte sichbar, denn ich löse ja kein Repaint aus.
Löse ich jetzt in einer anderen Click procedure Repaint aus, wird eine bmp mit Linien angezeigt...
Das versteh ich nicht, ich zeichne meine Linien doch auf HGSpannbaum und lass mir Hintergrund anzeigen, da sollten doch gar keine Linien drauf sein.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TF_1.B_RechneClick(Sender: TObject);
  HGPunkte     := TBitmap.Create;
  HGSpannbaum  := TBitmap.Create;
  HGPunkte     := Hintergrund;
  HGSpannbaum  := Hintergrund;
  for AnzeigeschleifeSB := 0 to PunkteLaufVar - 2 do
    begin
    HGSpannbaum.Canvas.MoveTo(Punkte[Spannbaum[AnzeigeschleifeSB].Von].x,Punkte[Spannbaum[AnzeigeschleifeSB].Von].y);
    HGSpannbaum.Canvas.LineTo(Punkte[Spannbaum[AnzeigeschleifeSB].Nach].x,Punkte[Spannbaum[AnzeigeschleifeSB].Nach].y)
    end;
  end;

procedure TF_1.B_ZeigePunkteClick(Sender: TObject);
  begin

  Hintergrund := HGPunkte;
  PB_Oberflaeche.Repaint;
  {egal ob ich hier nur den Repaint auslöse oder vorher die Zuweisung mach, es kommt ein Bild raus, das die Linien von HGSpannbaum enthält}
  end;