Announcement

Collapse
No announcement yet.

TImage(s) auf einem abgeleiteten TPanel - als Komponente (D5.x)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TImage(s) auf einem abgeleiteten TPanel - als Komponente (D5.x)

    <font face="verdana">
    Hi!<br>
    <br>
    Ich wollte eine Komponente erstellen die von TPanel/TCustomPanel abgeleitet wird und auf der dann in einer Reihe 9 TImage(s) erzeugt werden.<br>
    Das klappt ja auch soweit, nur habe ich das Problem, das die Images nicht sichtbar sind und als <i>parent</i> auch nicht die von mir erstellte Komponente besitzen...<br>
    <br>
    <b>Wie also kann ich auf einer selbsterstellten, sichtbaren Komponente weitere, wiederum sichtbare Opjekte erstellen und definiert anordnen ?</b>
    <br>
    <br>
    <font size="2">D A N K E !</font><br>
    &nbsp;&nbsp;&nbsp;Nico Stöckigt
    </font>

  • #2
    Hallo Nico,<br>
    da Du keinen Source gepostet hast, kann ich nur raten.<br>
    Ich gehe davon von aus, das Du den constructor des TCustomPanels überschrieben hast<br>
    und dort die 9 TImages erzeugst. Wenn ich so eine Komponente entwicklen müßte,<br>
    dann würde ich ungefähr so anfangen.<br>
    <pre>
    <font face="Verdana" size="1" color="#000000">unit ImagePanel;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls;

    type
    TImageArray = Array [0..8] of TImage;

    TImagePanel = class(TCustomPanel)
    private
    { Private-Deklarationen }
    FImages : TImageArray;
    procedure PaintBackGroundOnImages(Images : TImageArray);
    protected
    { Protected-Deklarationen }
    public
    { Public-Deklarationen }
    constructor Create(AOwner : TComponent); override;
    published
    { Published-Deklarationen }
    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('Mycomps', [TImagePanel]);
    end;

    { TImagePanel }

    constructor TImagePanel.Create(AOwner: TComponent);
    var
    iCnt : Integer;
    begin
    inherited Create(AOwner);
    For iCnt:=0 to High(FImages) do
    begin
    FImages[iCnt]:=TImage.Create(Self); //&lt;- Da TImagePanel von TComponent abgeleitet ist,
    // sorgt hier der Parameter Self dafür, dass die
    // Images in die interne Komponentenliste (ComponentCount)eingetragen
    // werden. Dadurch wird TImagePanel zum Besitzer der Images. D.h.
    // Die Images werden durch TImagePanel freigegeben. Deshalb habe ich
    // den destructor nicht überschrieben.
    <b> FImages[iCnt].Parent:=Self; // oberwichtig
    </b> FImages[iCnt].SetBounds(iCnt*(Width div High(FImages)),0,Width div High(FImages),Height);
    end;
    PaintBackGroundOnImages(FImages); // Damit was zusehen ist
    end;

    procedure TImagePanel.PaintBackGroundOnImages(Images: TImageArray);
    var
    iCnt : Integer;
    ImageRect : TRect;
    begin
    For iCnt:=0 to High(Images) do
    begin
    ImageRect:=Images[iCnt].ClientRect;
    <b> Images[iCnt].Picture.Bitmap.Width:=ImageRect.Right;
    Images[iCnt].Picture.Bitmap.Height:=ImageRect.Bottom;
    </b> With Images[iCnt].Picture.Bitmap.Canvas do
    begin
    Brush.Color:=clBlack;
    Pen.Color:=clBlack;
    Rectangle(ImageRect);
    InflateRect(ImageRect,-1,-1);
    Brush.Color:=clRed;
    Rectangle(ImageRect);
    end;
    end;
    end;

    end.</font>
    </pre>
    Jens Schumann<br&gt

    Comment

    Working...
    X