Egy végletekig leegyszerűsített változat; a TPanel-t is kihagytam.
A feltett változat vége felé az OwnGraph.DrawMe eljárásban a
saját Canvas hívása (tehát a kapcsos zárójelek
meghagyása) esetén futásidőben (SIGSEGV) hibaüzenetet küld, a wincontrol.inc fájlban a TWinControl.HandleAllocated hívásakor (a lekérdezett FHandle memóriacíme abszurd); ezt bónuszként sajnos szintén nem értem. Ha kiveszem a kapcsos zárójeleket, akkor fut, rajzol (nyilván a Form Canvas-ára), viszont (így talán indokoltan) a Form Hint-jét (nem az OwnGraph-ét) teszi ki a kirajzolt ábra fölé is.
Most a kérdésem úgy módosulna, hogy
a) összefügghet-e a Hint nem-saját tartalma azzal, hogy nem a saját Canvas-ra rajzol;
b) mi a baj a saját Canvassal, ami a hibaüzenetet okozza?
type
OwnGraph = class (TGraphicControl)
Constructor Create (AOwner: TComponent); override;
Procedure DrawMe;
public
OwnerForm: TForm;
end;
{ THForm }
THForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
public
Own3: OwnGraph;
end;
var
HForm: THForm;
implementation
{$R *.lfm}
{ THForm }
procedure THForm.FormPaint(Sender: TObject);
begin
Own3.DrawMe;
end;
procedure THForm.FormCreate(Sender: TObject);
begin
Own3 := OwnGraph.Create (Self);
Hint := 'FormHint';
ShowHint := true;
end;
procedure THForm.FormDestroy(Sender: TObject);
begin
Own3.Free;
end;
Constructor OwnGraph.Create (AOwner: TComponent);
begin
inherited Create (AOwner);
OwnerForm := TForm (AOwner);
Hint := 'OwnGraphHint';
ParentShowHint := true;
{ShowHint := true; // egyremegy }
end;
Procedure OwnGraph.DrawMe;
begin
with {OwnerForm.}Canvas do begin
Pen.Width := 3;
Line (20, 20, 120, 20);
LineTo (70, 100);
LineTo (20, 20);
end;
end;