Pomalowanie każdego piksela na inny kolor

Pomalowanie każdego piksela na inny kolor
D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

A czy nie można by było zamienić

Kopiuj
 

procedure TMyPanel.DoLabelClick(ALabelIndex: Integer);
begin
  if Assigned(FOnLabelClick) then
    FOnLabelClick(Self, FHoveredLabelIdx);
end;
 
procedure TMyPanel.WMLButtonUp(var AMessage: TLMLButtonUp);
begin
  inherited WMLButtonUp(AMessage);
 
  if FHoveredLabelIdx <> -1 then
    DoLabelClick();
end;

na coś takiego:

Kopiuj
 
procedure TMyPanel.WMLButtonUp(var AMessage: TLMLButtonUp);
begin
  inherited WMLButtonUp(AMessage);
 
  if FHoveredLabelIdx <> -1 then
    if Assigned(FOnLabelClick) then
    FOnLabelClick(Self, FHoveredLabelIdx);;
end;
 
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0

Oczywiście że można;

Jednak przyjęło się, aby na sprawdzenia "istnienia" zdarzenia oraz jego wywołanie przeznaczać zawsze osobną metodę, której identyfikator zaczyna się od prefiksu Do; I w tym przypadku tak też podałem, czyli wyznaczyłem osobną metodę DoLabelClick, w której następuje sprawdzenie pola FOnLabelClick za pomocą Assigned oraz wywołanie zdarzenia, używając wartości pola FHoveredLabelIdx do przekazania jej w parametrze;

PS: Parametr metody DoLabelClick nie jest używany - zostało to po edycji posta, kiedy to wprowadzałem poprawki związane z kodem metod.

D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

To jednak więcej roboty jest z tym niż myślałem. Niby wszystko idzie łatwo ale na każdym kroku pojawia się jakiś problem i na prawdę nie wiem gdzie szukać rozwiązania.

Do komponentu dołączyłem jeszcze jedną klasę. Tworzę ją w konstruktorze klasy bazowej. Rozmiary tego elementu są takie sam jak rodzica. Chciałem w ten sposób dodać powiedzmy takie "nakładki" na komponent, które będą się pojawiały w niektórych przypadkach. Niestety po stworzeniu tej klasy zasłania ona wszystko to co jest w klasie bazowej mimo że w metodzie Paint nie jest jeszcze nic narysowane. Samo wywołanie powoduje całkowite zasłonięcie tego co zostało narysowane w klasie bazowej.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0

Bez kodu nic nie doradzę, bo nie wiem czym jest ta dodatkowa klasa i jaki efekt Cię interesuje.

D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

To tak w uproszczeniu

Kopiuj
TAdd = class(TCustomControl)
private
  Kolor: TColor;
public
  constructor Create(AOwner: TComponent);
  procedure Paint; override;
end; 

TMain = class(TCustomControl)
private
  Kolor: TColor;
  Add: TAdd;
public
  constructor Create(AOwner: TComponent; AWidth, AHeight: Integer);
  destructor Destroy; override;
  procedure Paint; override;
end;

constructor TAdd.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Parent := AOwner as TWinControl;
  Width := Parent.Width;
  Height := Parent.Height;
  Left := 0;
  Top := 0;
  Kolor := $85000000;
end;

procedure TAdd.Paint;
var
  FRect: TRect;
begin
  FRect.Left := 0;
  FRect.Right := 50;
  FRect.Top := 0;
  FRect.Bottom := 100;
  with Canvas do
  begin
    Brush.Style := bsSolid;
    Brush.Color := Kolor;
    Rectangle(Rect);
  end;
end;

constructor TMain.Create(AOwner: TComponent; AWidth, AHeight: Integer);
begin
  inherited Create(AOwner);
  Parent := AOwner as TWinControl;
  Height := AHeight;
  Width := AWidth;  
  Left := 0;
  Top := 0;
  ControlStyle := ControlStyle + [csOpaque, csAcceptsControls];

  Add := TAdd.Create(self);
end;

procedure TMain.Paint;
begin
  with Canvas do
  begin
    Brush.Style := bsSolid;
    Brush.Color := clBlack;
    Rectangle(ClientRect);
  end;

  Add.Paint;
end;
 

Cel jest taki, aby było widać to co jest narysowane w TMain.Paint, ale część tego ma zasłonić to co narysowanie w TAdd.Paint. Niestety TAdd.Paint samo w sobie zasłania cały komponent. A jeszcze żeby to było połączone z tym co było do tej pory, a więc, żeby było można np kliknąć na napisy które sa umieszczone w TMain;

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0

Tak tego nie zrobisz i bsClear nic Ci nie da; To co ma być z dołu widoczne, musisz po prostu przekopiować - z jednego płótna (TMain.Canvas) do drugiego (TAdd.Canvas); W przeciwnym razie będziesz ciągle zamalowywał to, co TMain.Paint namaluje;

Mam wrażenie, że przekombinowujesz wszystko; Skoro Main nigdy nie będzie widoczny to w ogóle nie powinien istnieć, bo żadnej sensownej roli nie spełnia.

D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

Męczę się z tym kopiowaniem ale za nic mi to się nie kopiuje :/

Kopiuj
TAdd = class(TCustomControl)
private
  Kolor: TColor;
public
  constructor Create(AOwner: TComponent);
  procedure Paint; override;
end; 
 
TMain = class(TCustomControl)
private
  Kolor: TColor;
  Add: TAdd;
public
  constructor Create(AOwner: TComponent; AWidth, AHeight: Integer);
  destructor Destroy; override;
  procedure Paint; override;
end;
 
constructor TAdd.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Parent := AOwner as TWinControl;
  Width := 20;
  Height := 100;
  Left := Parent.Width - Width;
  Top := 0;  
  Kolor := $85000000;
end;
 
procedure TAdd.Paint;
var
  SRect: TRect;
begin
  SRect := Rect(Parent.Width - Width, Top, Parent.Width, Top + Height);
  Canvas.CopyRect(Rect(0, 0, Width, Height), TMain(Parent).Canvas, SRect); 
  with Canvas do
  begin
    Brush.Style := bsSolid;
    Brush.Color := Kolor;
  end;
end;
 
constructor TMain.Create(AOwner: TComponent; AWidth, AHeight: Integer);
begin
  inherited Create(AOwner);
  Parent := AOwner as TWinControl;
  Height := AHeight;
  Width := AWidth;  
  Left := 0;
  Top := 0;
  ControlStyle := ControlStyle + [csOpaque, csAcceptsControls];
 
  Add := TAdd.Create(self);
end;
 
procedure TMain.Paint;
begin
  with Canvas do
  begin
    Brush.Style := bsSolid;
    Brush.Color := clBlack;
    Rectangle(ClientRect);
  end;
 
  Add.Paint;
end;
 
 
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0

Utwórz sobie pustą paczkę i w niej utwórz swój komponent; Jak będziesz chciał aby ktoś sprawdził kod Twojego komponentu to wrzuć do załączników zarchiwizowane źródła paczki, tak aby można było je pobrać i od razu doinstalować paczkę do IDE;

PS: Nie wywołuj ręcznie metody Paint; Jeżeli chcesz wymusić przemalowanie komponentu to używaj metody Invalidate; Ona posiada w sobie pewną logikę i woła Paint tylko wtedy, gdy przemalowanie jest możliwe.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.