Ich habe vor einiger Zeit eine Hand voll visueller Komponenten unter Delphi 7 gebastelt, und model die gerade für D2007 auf. Dabei taucht nun ein Problem auf, dass ich unter D7 zwar im Form-Designer auch hatte, da es zur Runtime aber nicht auftrat war das verschmerzbar.
Konkret geht es um 2 Komponenten die von TGraphicControl abgeleitet sind, und überlappend angeordnet sind:
1) Bild eines Tanks
2) Balkenanzeige mit Beschriftung darüber
(siehe Bild im Anhang)
Die Paint-Methode von TTank:
Delphi-Quellcode:
procedure TTank.Paint;
var
arcHeight: Double;
begin
inherited;
arcHeight := Height*(FArcPercent/100);
Canvas.Pen.color := clblack;
Canvas.Pen.Width := 2;
Canvas.MoveTo( 1, Round(arcHeight/2));
Canvas.LineTo( 1, Height-Round(arcHeight/2));
Canvas.MoveTo(Width-2, Round(arcHeight/2));
Canvas.LineTo(Width-2, Height-Round(arcHeight/2));
Canvas.Arc(1, 1, Width-1, Round(arcHeight), Width-1, Round(arcHeight/2), 1, Round(arcHeight/2));
Canvas.Arc(1, Height-1, Width-1, Height-Round(arcHeight), 1, Height-Round(arcHeight/2), Width-1, Height-Round(arcHeight/2));
Canvas.Brush.Color := FColor;
Canvas.Brush.Style := FFillStyle;
Canvas.FloodFill(3, Round(arcHeight/2)+1, clBlack, fsBorder);
end;
Die Balken-Kompo tut im Grunde nichts anderes (ist viel zu lang zum komplett posten): Malt genau so auf dem Parent-Canvas herum, wobei aber nie der gesamte Bereich der Kompo gefüllt wird. Also teiltransparent. Im Anhang das Bild zeigt zwei solche überlagerten Komponentenpaare auf dem selben Formular zur selben Zeit. Das linke wird richtig gezeichnet, beim rechten jedoch taucht im Rect der Balken-Komponente auf einmal die Hintergrundfarbe des Parents (das Form) auf. Diese Fehldarstellung taucht mal auf, mal nicht. Teils bei allen dieser Anordnungen auf einem Form, manchmal auch nur bei manchen wie im Beispiel.
Da ich so geartete Überlagerungen auch an anderen Stellen ohne Probleme nutze, vermute ich hier das Problem beim FloodFill, weil dies ist die einzige Komponente, die dieses nutzt. Alle andere zeichnen mit den Methoden wie Rectangle() gleich gefüllt. Es scheint fast so, als würde das Rect der überlagernden Komponente (selbst wenn diese in dem Bereich nichts zeichnet) für das FloodFill eine Grenze darstellen - aber eben nicht immer. Und seit D2007 leider nicht mehr nur noch im Form-Designer.
Hat da wer einen heissen Tip?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)