[Delphi] Tekenen op frame canvas vanuit AfterConstruction

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Ik wil vanuit de AfterConstruction procedure van een frame tekenen op het frame met behulp van een TControlCanvas.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TFrame.Draw;
var  cc:TControlCanvas;
begin
     cc := TControlCanvas.Create;
     cc.Control := Self;
     cc.Pen.Color := clNavy;
     cc.Ellipse( 16, 16, 128, 128 );
     cc.Free;
end;

procedure TFrame.AfterConstruction;
begin
     inherited AfterConstruction;

     Width := 160;
     Height := 140;

     Draw;
end;
Bij bovenstaande code, waarbij Draw vanuit de AfterConstruction procedure wordt aangeroepen, blijft het frame leeg. Wanneer Draw later, bijvoorbeeld na het indrukken van een knop, wordt aangeroepen is het tekenen geen probleem.

Ik heb het idee dat e.e.a. nog niet ingesteld is tijdens de AfterConstruction procedure (handles e.d.) zodat het tekenen op het frame niet mogelijk is.
Weet iemand een oplossing hier voor?

Developer Accused Of Unreadable Code Refuses To Comment


  • Depress
  • Registratie: Mei 2005
  • Laatst online: 03-04 10:13
Wat is de parent?

Die ben je vergeten. Zonder Parent niks om weer te geven!

Verwijderd

Ik denk niet dat het aan ligt dat bepaalde punten nog niet zijn ingesteld, het is immers een AfterConstruction event, maar ik denk dat wanneer de frame (de eerste keer) getoond wordt je eigen ellipse overtekend wordt.

Je moet die tekening dan gewoon in een eigen component houden, en niet meteen daarna freeen.

Of je moet na het showen van de frame de tekening pas tekenen.
Depress schreef op woensdag 01 maart 2006 @ 13:57:
Wat is de parent?

Die ben je vergeten. Zonder Parent niks om weer te geven!
Dan zou ie het sowieso niet doen. Ik weet niet precies hoe een controlcanvas werkt, maar als je de control property associeerd met een ander (in dit geval het frame) dan wordt ook de parent property overgenomen lijkt me.

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 03-04 10:13
Nee, wordt overrided door de settings van zijn eigen script.

  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 25-03 13:37

MicroWhale

The problem is choice

1. wanneer roep je je afterconstruction procedure aan? vanuit een create heeft dit zowiezo geen zin.

1. maak een nieuwe create voor je TFrame, waarbij je je width en height op de juiste waarden zet (delphi doet de rest),
Delphi:
1
2
3
4
5
6
constructor TJouwFrame.Create;
begin
  inherited Create;
  Width:=140;
  Height:=160;
end;



2. je kunt beter een TPaintbox op je frame leggen om te tekenen, zo kun je je plaatje nog verplaatsen mocht dat nodig zijn.

[ Voor 38% gewijzigd door MicroWhale op 01-03-2006 15:09 ]

Het enige belangrijke is dat je vandaag altijd rijker bent dan gisteren. Als dat niet in centen is, dan wel in ervaring.


  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 25-03 13:37

MicroWhale

The problem is choice

Nog even ter verduidelijking (een frame met een TPaintBox en een TButton):

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
type
  TTestFrame = class(TFrame)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    constructor Create(AOwner : TComponent); override;
    { Public declarations }
  end;

implementation

procedure TTestFrame.Button1Click(Sender: TObject);
begin
  {als je op de knop drukt, tekent deze code wel wat}
  PaintBox1.Canvas.Brush.Color:=clBlue;
  PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect);
  PaintBox1.Canvas.Ellipse( 16, 16, 128, 128 );
end;

constructor TTestFrame.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  Width:=140;
  Height:=160;
  PaintBox1.Align:=alClient;
  {}
  {Deze code tekent helemaal niks (staat in de help dat dat niet kan):}
  PaintBox1.Canvas.Brush.Color:=clBlue;
  PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect);
  PaintBox1.Canvas.Brush.Color:=clBtnFace;
  {}
  Invalidate;
end;

Het enige belangrijke is dat je vandaag altijd rijker bent dan gisteren. Als dat niet in centen is, dan wel in ervaring.


  • Icelus
  • Registratie: Januari 2004
  • Niet online
Bedankt, ik ben bekend met de PaintBox component maar dit lijkt me niet de meest geschikte oplossing.
Ik wil op de achtergrond van het frame eenmalig - tijdens het maken van het frame - een afbeelding tekenen. Deze afbeelding bestaat uit een aantal onderdelen waarbij e.e.a. berekend moet worden. Daarna wordt de afbeelding nooit meer aangepast. De beste oplossing leek me daarom om direct op het frame te tekenen.
Ik gebruik nu een TImage die het volledige frame beslaat.

Overigens maakt het direct aanroepen van de Draw methode ook niet uit, zowel voor of na het instellen van de Parent.
Delphi:
1
2
3
4
5
6
7
8
// Werkt niet
procedure TForm.FormCreate(Sender:TObject);
var  f:TFrame;
begin
     f := TFrame.Create( Self );
     f.Draw;
     f.Parent := Self;
end;
Delphi:
1
2
3
4
5
6
7
8
// Werkt niet
procedure TForm.FormCreate(Sender:TObject);
var  f:TFrame;
begin
     f := TFrame.Create( Self );
     f.Parent := Self;
     f.Draw;
end;

Developer Accused Of Unreadable Code Refuses To Comment

Pagina: 1