FloodFill w delphi

0

Witam ostatnio miałem delphi w szkole więc chciałem się pobawić i pojawił się problem mianowicie chciałem zrobić coś takiego ze jak klikamy to wypełnia nam dany obszar ograniczony liniami kolorem coś jak wypełnianie w paincie ale floodfill w ogóle mi nie działa

procedure TForm3.ObrazMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var temp:integer;
begin
          Obraz.Canvas.Brush.Style:=bsSolid;
          Obraz.Canvas.FloodFill(X,Y,clblack,fsSurface);
end;

byłbym wdzięczny jakby ktoś kto to ogarnia mógł popatrzeć i ewentualnie podpowiedzieć co jest źle albo jaki błąd robię
testuje to rysując sobie zwykły prostokąt i chce aby po kliknięciu w niego zamalował się on na jakiś kolor :D

0

Proszę wyjaśnienie, dlaczego nie działa.

FloodFill
Funkcja wypełniająca ograniczony obszar bieżącą barwą

enum TFillStyle {fsSurface, fsBorder};
void __fastcall FloodFill(int X,int Y, TColor Color, TfillStyle FillStyle);
(X,Y) - współrzędne dowolnego punktu leżącego w danym obszarze
fsSurface – kolor obszaru
fsBorder – kolor brzegu obszaru

Czyli Ty by wypełnić kolorem czerwonym, obszar koloru białego użyjesz

  Obraz.Canvas.Brush.Style:=bsSolid;
  obraz.Canvas.Brush.Color:=ClRed;
  Obraz.Canvas.FloodFill(X,Y,ClWhite,fsSurface);
0
janeczko napisał(a)

Czyli Ty by wypełnić kolorem czerwonym, obszar koloru białego użyjesz

Obraz.Canvas.Brush.Style:=bsSolid;
obraz.Canvas.Brush.Color:=ClRed;
Obraz.Canvas.FloodFill(X,Y,ClWhite,fsSurface);

... albo (jeżeli się dobrze domyślam, że prostokąt jest koloru czarnego)

Obraz.Canvas.FloodFill(X, Y, clBlack, fsBorder);
0

czyli mam rozumieć ze parametr color odpowiada za kolor tła tak ? bo z tego co pamiętam to w TPascalu oznaczał on kolor granicy :D

przybliżę wam sytuację powiedzmy że mam prostokąt o bokach koloru czerwonego,zielonego,czarnego i fioletowego i wypełniony jest kolorem niebieskim ja chcę aby po kliknięciu w niego wypełnił się np na kolor zółty i nie mogę dojść do tego jak to zrobić :/

0
with Obraz.Canvas do
begin
  Brush.Color:=clYellow;
  FloodFill(x,y,clBlue,fsSurface);
//przy czym kolor punktu (x,y) musi być clBlue 
end;
0
kot3k napisał(a)

czyli mam rozumieć ze parametr color odpowiada za kolor tła tak ? bo z tego co pamiętam to w TPascalu oznaczał on kolor granicy

I tak, i nie. Wszystko zależy od ostatniego parametru metody FloodFill, czyli FillStyle. Parametr ten może przyjmować dwie wartości:

  • fsBorder - parametr Color odpowiada za kolor granicy (czyli tak samo, jak w Turbo Pascalu). Procedura będzie malować wszystko kolorem ustawionym przez Canvas.Brush.Color, aż do napotkania koloru podanego przez parametr Color. W szczególności może zamalować całe płótno (Canvas), jeżeli nie napotka takiego koloru.
  • fsSurface - parametr Color odpowiada za kolor tła. Procedura zamaluje kolorem ustawionym przez Canvas.Brush.Color tylko obszar mający kolor taki jak parametr Color. Jeżeli kolor punktu (X, Y) będzie inny niż parametr Color, wówczas nic się zamaluje.
    Drugi przypadek nie występuje w Turbo Pascalu, został dodany w Delphi. Przydaje się wtedy, gdy chcemy zamalować jakiś jednokolorowy obszar, którego granice mają różne kolory, czyli tak jak w opisywanym przez ciebie przypadku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0