Announcement

Collapse
No announcement yet.

TPicture als property

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

  • TPicture als property

    Hallo erstmal,<br>ich möchte in einer Komponenten eine TPicture property verwenden, damit der Anwender auch ein Bild in Komponente schieben kann. Leider gibt es gelegentlich Abstürze, die ich mir nicht erklären kann. Hat jemand ein Patentrezept, wie TPicture in eine Komponente einzubauen ist?<br>Hier ist auszugsweise der Code, den ich verwende:<br>

    <pre>

    // Hier wird TPicture verwendet
    With aCanvas do
    begin
    Pen.Color:=FFrame.Color;
    Pen.Width:=FFrame.Width;
    Brush.Style:=bsSolid;
    Brush.Color:=FFrame.BkGrnd;
    If (FFrame.Picture.Graphic<>Nil) and (FFrame.UsePicture) then
    Brush.Bitmap:=FFrame.Picture.Bitmap;
    Ellipse(X1,Y1,X2,Y2);
    end; // With aCanvas do

    // Das steht im FFrame constructor
    FPicture:=TPicture.Create;
    FPicture.OnChange:=PictureChanged;

    // und das im destructor
    FPicture.Free;
    inherited destroy;

    // Hier wird die TPicture property gesetzt
    procedure TFrame.SetPicture(const Value: TPicture);
    begin
    FPicture.Assign(Value);
    FParent.Paint;
    end;

    </pre>
    <br>
    Ich verwende D5 Pro<br>:-) Jens Schumann

  • #2
    Hi

    1.
    <pre>
    If (FFrame.Picture.Graphic<>Nil) and (FFrame.UsePicture) then
    Brush.Bitmap:=FFrame.Picture.Bitmap;
    </pre>

    enthält TPicture auch eine TBitmap ?
    Picture kapselt TBitmaps,TIcons und TMetafile, damit kann es durchaus sein das z.B. ein Metafile anstatt Bitmap im Picture ist.

    Du solltest das TPicture durch die Klasse TBitmap ersetzen, falls NUR Bitmaps benötigt werden. TPicture versucht zwar (glaub ich) ein Metafile bei Bedarf in eine Bitmap zu konvertieren, ABER es ist nicht leicht einen Apfel in eine Birne zu "konvertieren" :-)

    2.

    <pre>
    FPicture.Assign(Value);
    FParent.Paint;
    </pre>

    Ist FParent ein gültiges Object.
    Wenn TFrame ein Control ist solltest Du

    <pre>
    if csDestroying in ComponentState then Exit;
    FPicture.Assign(Value);
    Invalidate;
    oder
    Refresh;
    oder
    Repaint;
    </pre>


    verwenden.

    Gruß Hage

    Comment


    • #3
      Hi

      Nochwas:

      Die Bitmap eines Brushes sollte 8x8 Pixel groß sein.
      Es wäre auch folgendes besser:

      <pre>
      Brush.Bitmap := FFrame.Picture.Bitmap;

      und am Ende der Zeichenroutine

      try
      finally
      Brush.Bitmap := nil;
      end;

      </pre>

      Gruß Hage

      Comment

      Working...
      X