Witam,
Po dłuższej przerwie od korzystania z Lazarusa i zabawy w programowanie zdecydowałem się powrócić. Staram się wszystko robić dokładniej i rozsądniej, tak żeby mój kod był przejrzysty, bo często miałem z tym problemy. Niestety okazuje się, że moje chęci spowodowały dodatkowy problem, z którym sobie nie mogę poradzić. Całość podzieliłem na osobne moduły. Problem pojawia się jeśli jednym modułem chcę oddziaływać na drugi. W skrócie są dwa moduły. Pierwszy tworzy pusty TPanel po lewej stronie formy, drugi tworzy TButton po prawej stronie. Oba te komponenty są tworzone dynamicznie. Chciałbym osiągnąć by po naciśnięciu przycisku, Panel zmieniał kolor.
Nie potrafię znaleźć rozwiązania. Jedyne co mi przychodzi do głowy to odniesienie się do rodzica przycisku. Z tego co widzę istnieje coś takiego jak ComponentIndex. Nie wiem czy jest to to czego szukam, ale zakładam że każdy komponent musi być jakoś identyfikowane. Kwestia tylko jak się odnieść do tego konkretnego. Bo pewnie łatwiejsze będzie to gdy takie komponenty będę miał stworzone dwa, ale co jeśli będzie ich 100?
Udało mi się osiągnąć coś takiego
unit Main;
{$mode delphi}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, MyPanel, MyButton;
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form2: TForm2;
implementation
{$R *.lfm}
procedure TForm2.FormCreate(Sender: TObject);
var
Panel: TMyPanel;
Button: TMyButton;
begin
Panel := TMyPanel.CreateIt(Form2);
Button := TMyButton.CreateIt(Form2);
Panel.Show;
Button.Show;
end;
end.
unit MyPanel;
{$mode delphi}{$H+}
interface
uses
Classes, SysUtils, ExtCtrls, Forms, Windows, Graphics, Controls;
type
TMyPanel = class(ExtCtrls.TPanel)
public
constructor CreateIt(AOwner: TComponent);
procedure Paint; override;
end;
implementation
constructor TMyPanel.CreateIt(AOwner: TComponent);
begin
inherited Create(AOwner);
Hide;
Parent := AOwner as TWinControl;
Left := 0;
Top := 0;
Width := 100;
Height := 100;
end;
procedure TMyPanel.Paint;
var
Rec :TRect;
begin
with Canvas do
begin
Brush.Color := clBlack;
Brush.Style := bsSolid;
Pen.Style := psClear;
with Rec do
begin
Left := 0;
Top := 0;
Right := Self.Width + 1;
Bottom := Self.Height + 1;
end;
Rectangle(Rec);
end;
end;
end.
unit MyButton;
{$mode delphi}{$H+}
interface
uses
Classes, SysUtils, ExtCtrls, Forms, Windows, Graphics, Controls, Dialogs;
type
TMyButton = class(ExtCtrls.TPanel)
public
procedure ButtonClick(Sender: TObject);
constructor CreateIt(AOwner: TComponent);
procedure Paint; override;
end;
implementation
procedure TMyButton.ButtonClick(Sender: TObject);
begin
Showmessage('zmiana koloru panel');
(Sender as TWinControl).Parent.Components[0].Destroy;
end;
constructor TMyButton.CreateIt(AOwner: TComponent);
begin
inherited Create(AOwner);
Hide;
Parent := AOwner as TWinControl;
Left := 110;
Top := 0;
Width := 1000;
Height := 100;
onClick := ButtonClick;
end;
procedure TMyButton.Paint;
var
Rec :TRect;
begin
with Canvas do
begin
Brush.Color := clGreen;
Brush.Style := bsSolid;
Pen.Style := psClear;
with Rec do
begin
Left := 0;
Top := 0;
Right := Self.Width + 1;
Bottom := Self.Height + 1;
end;
Rectangle(Rec);
end;
end;
end.
I faktycznie udaje się usunąć ten Panel który chce, natomiast nie potrafię się odnieść do jego właściwości Color. Druga kwestia to jest to co pisałem powyżej, Jeśli będzie tych komponentów chociażby 10, to już nie wystarczy wpisać 0 i wiedzieć że zadziała.
Tag
toPtrInt
, a tego rozmiar jest zależny od typu procesora. Muszę poprawić post.