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

WIN XP
Delphi 6
BeitragVerfasst: So 22.05.05 17:20 
Hi leutz
ich programmiere Paint nach und hab schon ein problem

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TPaintF.NeuesBild(x,y:integer);
begin 
  PaintF.Feld.Width := x; 
  PaintF.Feld.Height := y; 
  PaintF.Feld.Canvas.Create; 
  PaintF.Feld.Cursor := crCross; 
end;


Ich geh auf Datei -> Neu dann kommt ein Fenster wo ich die breite und höhe angebe dann folgt obige procedure

Wenn ich diesen schritt erneut ausführe verändert sich die auflösung und ich habe kein neues weißes Bild. Ich weis also nicht wie ich das Image refreshen kann oder zurücksetzen kann. Hat da einer ne Idee ? Das ich im prinzip die Image-komponente auf Standard habe ohne canvas...

thx 4 ideas
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: So 22.05.05 18:34 
Moin!

1. Du solltest keine TImage Komponente dafür nutzen sondern eine TPaintBox.
2. Das Create in deinem Code ist falsch, wenn, dann sollte es so lauten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TPaintF.NeuesBild(x,y:integer);
begin 
  PaintF.Feld.Width := x; 
  PaintF.Feld.Height := y; 
  PaintF.Feld.Canvas := TCanvas.Create; 
  PaintF.Feld.Cursor := crCross; 
end;

Aber selbst dies ist sinnfrei.
3. Im Normalfall nutz eine TPainBox und male darauf ein Bitmap auf dem die ganzen Zeichnefunktionen ausgeführt werden. Dieses kannst du dann auch vergrössern/verkleinern etc
4. Um das Bild zurück zu setzen, male einfach ein weisses Kästchen in der Grösse des Bitmaps über das selbige...

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
shadowmasta Threadstarter
Hält's aus hier
Beiträge: 14

WIN XP
Delphi 6
BeitragVerfasst: So 22.05.05 22:19 
kk danke erstmal für den tipp werde mich morgen ranmachen und es auf paintBox umstellen
nur da is ja das doofe problem das wenn ein Fenster drübe rgemacht wird, das gemalte verschwindet aber gut.

Und selbst wenn es mit einem Image doof ist WARUM verändert er die Auflösunf während es bei einer PaintBox nicht so sein sollte, was ich noch ausprobiere.

pS. das mit dem Canva.Create funzt schon is aber net optimal denn wen man vorher ne farbe oder ne zeichenfunktion auswählt ist das image sichtbar als canvas :(
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: So 22.05.05 23:41 
Moin!

user profile iconshadowmasta hat folgendes geschrieben:
nur da is ja das doofe problem das wenn ein Fenster drübe rgemacht wird, das gemalte verschwindet aber gut.


Du hast das OnPaint Ereignis der PaintBox - in diesem sollst du den Inhalt zeichnen. Wenn du ein Fenster drüber schiebst, dann wird auch ein OnPaint ausgelöst und der Inhalt verschwindet nicht.

Und damit du nicht ständig alles nochmal einzelnd zeichnen musst, mach es mit dem Bitmap wie oben beschrieben. Dieses kannst du dann mit einem Rutsch auf die PaintBox malen.

user profile iconshadowmasta hat folgendes geschrieben:
Und selbst wenn es mit einem Image doof ist WARUM verändert er die Auflösunf während es bei einer PaintBox nicht so sein sollte, was ich noch ausprobiere.


Beachtest du, dass Image1.Width und Image1.Height nur die Grösse der Komponente angibt und nicht die Grösse des Bitmaps/Bildes in dieser? Wenn du ein Bitmap im Image hast, dann ist die Bildgrösse bei Image1.Picture.Bitmap.Width und Image1.Picture.Bitmap.Height zu finden. Kann es damit zusammen hängen (mal so aus'm Bauch heraus...)?

user profile iconshadowmasta hat folgendes geschrieben:
pS. das mit dem Canva.Create funzt schon is aber net optimal denn wen man vorher ne farbe oder ne zeichenfunktion auswählt ist das image sichtbar als canvas :(


Deshalb meinte ich ja: Canvas mit einem weissen Kästchen übermalen. Dahingehend kannst du FillRect() nutzen. Wenn du dir dann vorher noch die Stift- und Pinselfarbe sicherst und nach dem übermalen wieder zurück sicherst, dann hast du damit auch keine Probleme.
Ansonsten solltest du grundlegend keinen Canvas selber anlegen. Dieser wird immer mitgebracht von der jeweiligen Klasse/Komponente. Ausserdem sollte der korrigierte Code von mit ein Speicherleck enthalten, da der eventuell vorhandene alte Canvas nicht freigegeben wird. Aber wie gesagt: grundsätzlich gar nicht erst sowas machen.

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
shadowmasta Threadstarter
Hält's aus hier
Beiträge: 14

WIN XP
Delphi 6
BeitragVerfasst: Mo 23.05.05 16:12 
vielen Dank war alles sehr hilfreich ich frage mich aber letzenende nicht ob das ganz schön hardwarelastig ist.
Denn wenn ich nach jeder MouseMove Procedure ein Repaint der PaintBox auslöse kommt es zum flimmern. Dem habe ich mit Doublebuffered := true vorgebeugt.

Ich habe mit Bild.PixelFormat := pf24Bit; auf 24 Bit gestellt aber wenn ich einen anderen Hintergrund als weiss habe, mittels primitiven Farbeimer der das ganze Bild in der gewünschten Farbe färbt, dann verfärben sich die Farbe bei rechtecken und ellipsen. Hängt wohl irgendwie mit brush und style ab oder so

mir fällt grad auf das ich fast 100% CPU last bei dem oben genannten problem habe :(
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 23.05.05 21:38 
Moin!

user profile iconshadowmasta hat folgendes geschrieben:
Denn wenn ich nach jeder MouseMove Procedure ein Repaint der PaintBox auslöse kommt es zum flimmern. Dem habe ich mit Doublebuffered := true vorgebeugt.


DoubleBuffered ist keine Lösung! Warum überhaupt direkt RePaint? Warum nicht einfach ein Invalidate aufrufen? Also PaintBox1.Invalidate - und das beim MouseMove und es sollte a) nicht mehr flimmern und b) nicht so hardwarelastig sein.

Und um die Hardwarebeschleunigung zu nutzen, benutze BitBlt() um das Bild auf die PaintBox zu bekommen:

ausblenden Delphi-Quelltext
1:
  BitBlt(PaintBox1.Canvas.Handle, 00, Bitmap1.Width, Bitmap1.Height, Bitmap1.Canvas.Handle, 00, SRCCOPY);					


user profile iconshadowmasta hat folgendes geschrieben:
Ich habe mit Bild.PixelFormat := pf24Bit; auf 24 Bit gestellt aber wenn ich einen anderen Hintergrund als weiss habe, mittels primitiven Farbeimer der das ganze Bild in der gewünschten Farbe färbt, dann verfärben sich die Farbe bei rechtecken und ellipsen. Hängt wohl irgendwie mit brush und style ab oder so


Da komme ich nicht so ganz mit, aber meinst du vielleicht FloodFill()? Dort wäre der 2. Parameter wichtig - bis wohin er füllen sollte. Ansonsten empfehle ich noch 32 Bit Farbtiefe, da dann alle Pixel automatisch aligned sind und somit schneller verarbeitet sein sollten.

user profile iconshadowmasta hat folgendes geschrieben:
mir fällt grad auf das ich fast 100% CPU last bei dem oben genannten problem habe :(


Schau mal nach den Änderungen nochmal nach.

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
shadowmasta Threadstarter
Hält's aus hier
Beiträge: 14

WIN XP
Delphi 6
BeitragVerfasst: Mi 25.05.05 15:52 
Hey du bist ja auch Rostocker :D

Also die Last beträgt nun noch etwa hächstens 18% also das hat Invalidate bezweckt THX der rest is wohl meine hamma case anweisung

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
// Mausbewegung im Bild
procedure TPaintF.FeldMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if DoPaint then
   case Modus of
   1,2: Bild.Canvas.LineTo(X,Y);
   3: Bild.Canvas.Rectangle(X,Y,X+3,Y+3);
   5begin with Bild.Canvas do
        begin
          Rectangle(x_anfang,y_anfang,x_ende,y_ende);  // lösche die alte Linie
          x_ende := x ; y_ende := y; // neue Linienende
          Rectangle(x_anfang,y_anfang,x_ende,y_ende); // Zeichne neue Linie
        end;  end;
   6begin with Bild.Canvas do
        begin
          RoundRect(x_anfang,y_anfang,x_ende,y_ende,10,10);
          x_ende := x; y_ende := y;
          RoundRect(x_anfang,y_anfang,x_ende,y_ende,10,10);
        end;  end;
   7begin with Bild.Canvas do
        begin
          MoveTo(x_anfang,y_anfang); // lösche die alte Linie
          LineTo(x_ende,y_ende);
          x_ende := x; y_ende := y;  // neue Linienende
          MoveTo(x_anfang,y_anfang); // Zeichne neue Linie
          LineTo(x_ende,y_ende);
        end;  end;
   8begin with Bild.Canvas do
        begin
          Ellipse(x_anfang,y_anfang,x_ende,y_ende);
          x_ende := x; y_ende := y;
          Ellipse(x_anfang,y_anfang,x_ende,y_ende);
        end;  end;  
   end;
   Feld.Invalidate;
end;


Modus ist halt ob Stift, pinsel oder so aber es flimmert immernoch das is komik und das mit den Farben mein kommt zustande wegen dem Pen Modus denn bei modus 6,7,8 istBild.Canvas.Pen.Mode := pmNotXor;

damit ich die rechtecke, ellipsen ausdehnen kann und zurück somit überschreiben sich die farben usw. Dieser Modus steht auch in de rHilfe aber daran liegts das die Farben verfälschen bei nicht weißem Hintergrund.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mi 25.05.05 16:38 
Moin!

user profile iconshadowmasta hat folgendes geschrieben:
Modus ist halt ob Stift, pinsel oder so aber es flimmert immernoch das is komik und das mit den Farben mein kommt zustande wegen dem Pen Modus denn bei modus 6,7,8 istBild.Canvas.Pen.Mode := pmNotXor;

damit ich die rechtecke, ellipsen ausdehnen kann und zurück somit überschreiben sich die farben usw. Dieser Modus steht auch in de rHilfe aber daran liegts das die Farben verfälschen bei nicht weißem Hintergrund.


Also aus diesen Sätzen werde ich nicht schlau.

Aber zu dem XOR: Es löscht das zuletzt gemalte, wenn man es nochmal mit gleicher Farbe in gleicher Form auf der gleichen Position malt. Kann es sein, das du vielleicht x_ende und y_ende nicht ordentlich initialisiertst - z.B. beim MouseDown?

MfG
Muetze1

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
shadowmasta Threadstarter
Hält's aus hier
Beiträge: 14

WIN XP
Delphi 6
BeitragVerfasst: Mi 25.05.05 18:15 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
unit Paint;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Menus, jpeg, StdCtrls, Buttons, ColorGrd, ExtDlgs;

type
  TPaintF = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Neu1: TMenuItem;
    offnen: TMenuItem;
    Speichern: TMenuItem;
    N2: TMenuItem;
    Beenden2: TMenuItem;
    Bearbeiten1: TMenuItem;
    Bildgre1: TMenuItem;
    Hilfe1: TMenuItem;
    PaintInfo1: TMenuItem;
    Panel1: TPanel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    ColorDialog1: TColorDialog;
    ColorGrid1: TColorGrid;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    SpeedButton7: TSpeedButton;
    Button1: TButton;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    SpeedButton8: TSpeedButton;
    ModusEinst: TGroupBox;
    SizeEinst: TGroupBox;
    Shape1: TShape;
    Shape2: TShape;
    Shape3: TShape;
    Shape4: TShape;
    Shape5: TShape;
    Shape6: TShape;
    Shape7: TShape;
    Shape8: TShape;
    Feld: TPaintBox;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Neu1Click(Sender: TObject);
    procedure FeldMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FeldMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FeldMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape3MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape4MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape5MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape6MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure ColorGrid1Change(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton7Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SpeedButton8Click(Sender: TObject);
    procedure Shape7MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape8MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FeldPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);

  private
    Shapes : array[1..6of TShape;
    x_anfang, y_anfang, x_ende, y_ende : integer;
    { Private-Deklarationen }
  public
     procedure NeuesBild(x,y:integer);
    { Public-Deklarationen }
  end;

var
  PaintF: TPaintF;
  len,hei,MyX,MyY : integer;
  DoPaint : boolean;
  Modus,Smod : byte;
  farbe : TColor;
  Bild : TBitmap;
implementation

uses Neu;                   
{$R *.dfm}

// Neues Bild erstellen
procedure TPaintF.NeuesBild(x,y:integer);
begin
  Bild.Canvas.Brush.Color := clWhite;
  Bild.Canvas.pen.Color := clWhite;
  Bild.Width := x;
  Bild.Height := y;
  Bild.Canvas.Rectangle(0,0,x,y);
  PaintF.Feld.Width := x;
  PaintF.Feld.Height := y;
  PaintF.Image1.Width := x+2;
  PaintF.Image1.Height := y+2;
  PaintF.Image1.Picture.LoadFromFile('img/back.jpg');
  PaintF.Feld.Cursor := crCross;
  PaintF.Speichern.Enabled := true;
  Bild.Canvas.pen.Color := clBlack;
end;
// Größenauswahl der Shapes
procedure Auswahl(sm : integer);
var i : byte;
begin
 case sm of
   1begin PaintF.Shape1.Brush.Color := clBlack; Bild.Canvas.Pen.Width := 2end;
   2begin PaintF.Shape2.Brush.Color := clBlack; Bild.Canvas.Pen.Width := 4end;
   3begin PaintF.Shape3.Brush.Color := clBlack; Bild.Canvas.Pen.Width := 7end;
   4begin PaintF.Shape4.Brush.Color := clBlack; Bild.Canvas.Pen.Width := 2end;
   5begin PaintF.Shape5.Brush.Color := clBlack; Bild.Canvas.Pen.Width := 4end;
   6begin PaintF.Shape6.Brush.Color := clBlack; Bild.Canvas.Pen.Width := 7end;
 end;
 for i := 1 to 6 do
   if i <> sm then PaintF.Shapes[i].Brush.Color := clWhite;
end;
// SizeEinstellung
procedure Size(mm : byte);
begin
  if (mm = 2or (mm = 3then PaintF.SizeEinst.Visible := true else PaintF.SizeEinst.Visible := false;
end;
// ModusEinstellung
procedure Modusopt(mm : byte);
begin
  if (mm = 5or (mm = 6or (mm = 8then PaintF.ModusEinst.Visible := true else PaintF.ModusEinst.Visible := false;
end;
// Anfangswerte & Initialisierungen
procedure TPaintF.FormCreate(Sender: TObject);
begin
  Shapes[1] := Shape1;  // Zuordnung der FarbShapes
  Shapes[2] := Shape2;
  Shapes[3] := Shape3;
  Shapes[4] := Shape4;
  Shapes[5] := Shape5;
  Shapes[6] := Shape6;
  len := 0;
  hei := 0;
  Modus := 1;
  Smod := 2;
  farbe := ColorGrid1.ForegroundColor;
  Bild := TBitmap.Create;
  Bild.PixelFormat := pf32Bit;
end;
// Datei -> Neu
procedure TPaintF.Neu1Click(Sender: TObject);
begin
  NeuB.Show;
end;
// Im Bild gedrückte Maustaste
procedure TPaintF.FeldMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DoPaint := true;
  case Modus of
  1,2: Bild.Canvas.MoveTo(X,Y);
  3: Bild.Canvas.Rectangle(X,Y,X+3,Y+3);
  4begin Bild.Canvas.Rectangle(0,0,Feld.Width,Feld.Height); Bild.Canvas.Brush.Color := ColorGrid1.ForegroundColor; end;
  5..8begin x_anfang:=x; y_anfang:=y; x_ende:=x; y_ende:=y; end;
  end;
end;
// Mausbewegung im Bild
procedure TPaintF.FeldMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if DoPaint then
   case Modus of
   1,2: Bild.Canvas.LineTo(X,Y);
   3: Bild.Canvas.Rectangle(X,Y,X+3,Y+3);
   5begin with Bild.Canvas do
        begin
          Rectangle(x_anfang,y_anfang,x_ende,y_ende);  // lösche die alte Linie
          x_ende := x ; y_ende := y; // neue Linienende
          Rectangle(x_anfang,y_anfang,x_ende,y_ende); // Zeichne neue Linie
        end;  end;
   6begin with Bild.Canvas do
        begin
          RoundRect(x_anfang,y_anfang,x_ende,y_ende,10,10);
          x_ende := x; y_ende := y;
          RoundRect(x_anfang,y_anfang,x_ende,y_ende,10,10);
        end;  end;
   7begin with Bild.Canvas do
        begin
          MoveTo(x_anfang,y_anfang); // lösche die alte Linie
          LineTo(x_ende,y_ende);
          x_ende := x; y_ende := y;  // neue Linienende
          MoveTo(x_anfang,y_anfang); // Zeichne neue Linie
          LineTo(x_ende,y_ende);
        end;  end;
   8begin with Bild.Canvas do
        begin
          Ellipse(x_anfang,y_anfang,x_ende,y_ende);
          x_ende := x; y_ende := y;
          Ellipse(x_anfang,y_anfang,x_ende,y_ende);
        end;  end;  
   end;
   Feld.Invalidate;
end;
// abgesetzter Linksklick
procedure TPaintF.FeldMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DoPaint := false;
end;
// ------ ShapeAuswahl
procedure TPaintF.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Smod := 1;
  Auswahl(Smod);
  Modus := 2;
end;

procedure TPaintF.Shape2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Smod := 2;
  Auswahl(Smod);
  Modus := 2;
end;

procedure TPaintF.Shape3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Smod := 3;
  Auswahl(Smod);
  Modus := 2;
end;

procedure TPaintF.Shape4MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Smod := 4;
  Auswahl(Smod);
  Modus := 3;
end;

procedure TPaintF.Shape5MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Smod := 5;
  Auswahl(Smod);
  Modus := 3;
end;

procedure TPaintF.Shape6MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Smod := 6;
  Auswahl(Smod);
  Modus := 3;
end;
//--------------------------------
//--------Speedbutton als Maloptionen
procedure TPaintF.SpeedButton1Click(Sender: TObject);
begin
  Modus := 1;  Size(Modus); Modusopt(Modus);
  Bild.Canvas.Pen.Width := 1;
end;

procedure TPaintF.SpeedButton2Click(Sender: TObject);
begin
  Modus := 2; Size(Modus); Modusopt(Modus);
  Auswahl(Smod);
  Bild.Canvas.Pen.Mode := pmCopy;
end;

procedure TPaintF.SpeedButton3Click(Sender: TObject);
begin
  Modus := 2; Size(Modus); Modusopt(Modus);
  Bild.Canvas.Pen.Color := clWhite;
  Auswahl(Smod);
  Bild.Canvas.Pen.Mode := pmCopy;
end;

procedure TPaintF.SpeedButton4Click(Sender: TObject);
begin
  Modus := 4; Size(Modus); Modusopt(Modus);
  Bild.Canvas.Pen.Color := farbe;
  Bild.Canvas.Brush.Color := farbe;
end;

procedure TPaintF.SpeedButton5Click(Sender: TObject);
begin
  Modus := 6; Size(Modus); Modusopt(Modus);
  Bild.Canvas.Pen.Mode := pmNotXor;
  Bild.Canvas.Pen.Width := 1;
end;

procedure TPaintF.SpeedButton6Click(Sender: TObject);
begin
  Modus := 7; Size(Modus); Modusopt(Modus);
  Bild.Canvas.Pen.Mode := pmNotXor;
  Bild.Canvas.Pen.Width := 1;
end;

procedure TPaintF.SpeedButton7Click(Sender: TObject);
begin
  Modus := 5; Size(Modus); Modusopt(Modus);
  Bild.Canvas.Pen.Mode := pmNotXor;
  Bild.Canvas.Pen.Width := 1;
end;

procedure TPaintF.SpeedButton8Click(Sender: TObject);
begin
  Modus := 8; Size(Modus); Modusopt(Modus);
  Bild.Canvas.Pen.Mode := pmNotXor;
  Bild.Canvas.Pen.Width := 1;
end;
//--------------------------------
// Farbwahl
procedure TPaintF.ColorGrid1Change(Sender: TObject);
begin
  farbe := ColorGrid1.ForegroundColor;
  Bild.Canvas.Pen.Color := farbe;
  if Modus = 4 then Bild.Canvas.Brush.Color := farbe;
end;
// erweiterte Farbauswahl
procedure TPaintF.Button1Click(Sender: TObject);
begin
  ColorDialog1.Execute;
  farbe := ColorDialog1.Color;
  Bild.Canvas.Pen.Color := farbe;
  if Modus = 4 then Bild.Canvas.Brush.Color := farbe;    
end;

// Unausgefüllte Konstruktionen
procedure TPaintF.Shape7MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Bild.Canvas.Brush.Color := clWhite;
end;

procedure TPaintF.Shape8MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Bild.Canvas.Brush.Color := farbe;
end;
// Refresh
procedure TPaintF.FeldPaint(Sender: TObject);
begin
  BitBlt(Feld.Canvas.Handle,0,0,Bild.Width,Bild.Height,Bild.Canvas.Handle,0,0,SRCCOPY);         
end;
// Bitmap wieder freigeben
procedure TPaintF.FormDestroy(Sender: TObject);
begin
  Bild.Free;
end;

end.


Also is schon richtig initialisiert.

Welchen Pen-Modus es gibt und was sie bewirken steht in Der delphi Hilfe...
Es gibt aber wohl keinen den ich brauch. Probier es aus wenn du nicht weist was ich meine.
1. Ein weißes Canvas erstellen
2. Eine Ellipse wie in Paint malen mit ziehen usw. im Source gehts
3. Hintergrund umstellen belibige farbe d.h. rectangle z.B. blau und dann noch ma ellipse machen und schon sind die farben dank pen.Mode pmNotXor komplementär wie es in der hilfe steht

PS: Das flimmern is halt noch da obwohl in der Hilfe steht das es nicht da sein dürfte also unerklärlich :roll:

kannst mir natürlcih auch ma deine icq vllt hilft das weiter ^^