Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigene Komponte: Eigene Grafiken einbinden (https://www.delphipraxis.net/87927-eigene-komponte-eigene-grafiken-einbinden.html)

Ares 7. Mär 2007 14:06


Eigene Komponte: Eigene Grafiken einbinden
 
Hallo!

Ich hatte gestern ja schon geschrieben, dass ich mir zur Übung eine eigene Komponente schreiben will. Es geht um ein Panel das ein Hintergrundbild anzeigt. In der Ursprünglichen Version konnte man das Bild über die Eigenschaft HintergrundBild einstellen. Im nächsten Schritt soll das Hintergrundbild fest in der Kompontene verankert sein. Jedes Panel dieser Art soll also den gleichen, nicht änderbaren Hintergrund anzeigen.

Aber wie füge ich das Bild in die Komponente ein?

Ich habe folgendes Versucht:

Delphi-Quellcode:
unit MyPanelUnit;

{$R 'background.res' 'background.rc'}

interface

uses ExtCtrls, Graphics, Classes;

type
   TMyPanel = class(TPanel)
   private
     { private-Deklarationen }
     FHindergrundBild: TPNGObject;

   protected
     { protected-Deklarationen }
     procedure Paint; override;
   public
     { public-Deklarationen }
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;

   published
     { published-Deklarationen }
   end;


procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Eigene', [TMyPanel]);
end;

constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FHindergrundBild := TPNGObject.Create;

  //FHindergrundBild.LoadFromFile('MeinHintergrund.png');
  FHindergrundBild.LoadFromResourceName(HInstance, 'hintergrund');
end;

destructor TMyPanel.Destroy;
begin
  FHindergrundBild.Free;
  inherited;
end;

procedure TMyPanel.Paint;
begin
   inherited;
   Canvas.Draw(0, 0, FHindergrundBild);

   Canvas.TextRect(ClientRect, 5, 5, IntToStr(FHindergrundBild.Width)+'x'+IntToStr(FHindergrundBild.Height)) ;

   Canvas.Refresh;
end;

end.
Ich habe also einmal versucht die Grafik aus einer Datei zu laden und einmal eine Ressource-Datei anzubinden. Beides funktioniert nicht. Die Komponente lässt sich zwar fehlerfrei compilieren und ich kann auch entsprechende Panels auf ein Formular setzten und diesen compilieren, es wird jedoch kein Hintergrundbild angezeigt...

Die Ausgabe BreitexHöhe funktioniert aber korrekt. Es wird also die korrekte Breite und Höhe des Bildes ausgegeben. Irgendwie wird das Bild also richtig eingebunden aber nicht richtig ausgegeben.

Habt ihre eine Idee was ich falsch mache? Bzw. was ich anders machen muss?

Besten Dank
Ares

franktron 7. Mär 2007 14:10

Re: Eigene Komponte: Eigene Grafiken einbinden
 
Du musst die DCR mit ins Package einbinden

Ares 7. Mär 2007 14:15

Re: Eigene Komponte: Eigene Grafiken einbinden
 
Öhm, DCR? Sorry, aber ich bin noch nicht sooo der Profi...

Die Komponente besteht im Moment nur aus der einen Unit MyPanelUnit.pas. Beim Compilieren des Package wird dann noch die Datei MyPanelUnit.dcu erstellt. Wo finde ich die DCR?

Ares 7. Mär 2007 14:46

Re: Eigene Komponte: Eigene Grafiken einbinden
 
Ok, ich habe nun raus gefunden, dass eine DCR Datei eine Bild als compilierte Ressource ist. Stimmt das? Erstellen kann man die z.B. mit dem Bild-Editor. Aber wo finde ich den in Delphi 2006? Ich weiß, dass der in Delphi 6 bei den Tools war. In Delphi 2006 konnte ich ihn aber nirgendwo finden...

Wie erstelle ich also auch dem Bild eine DCR-Datei?

Ares 7. Mär 2007 14:56

Re: Eigene Komponte: Eigene Grafiken einbinden
 
Ok, nun habe ich herausgefunden, dass eine DCR Datei wohl einfach nur eine umbenannte RES Datei ist. Stimmt das?

Ich habe somit die background.res in background.dcr umbennant und zum Projekt hinzugefügt:

Delphi-Quellcode:
package MeinPack;

{$R *.res}
{$R 'background.dcr'}
...
Die Komponenten zeigt aber genau das gleiche Verhalten wie zuvor. Sie lässt sich also fehlerfrei compilieren, das Package problemlos installieren und ein Panel kann prima auf einem Form platziert werden. Dort wird aber kein Hintergrundbild angezeigt. Die Angabe BreitexHöhe wird nachwievor korrekt ausgegeben... Daran kann es also eigentlich nicht liegen, oder?

Hawkeye219 7. Mär 2007 15:18

Re: Eigene Komponte: Eigene Grafiken einbinden
 
Hallo Ares,

könnte es sein, daß du mit dem Befehl TextRect das Hintergrundbild übermalst? TextRect() füllt das gesamte angegebene Rechteck mit der aktuellen Hintergrundfarbe. Wenn du das verhindern möchtest, mußt du den Füllstil auf den Wert bsClear setzen:

Delphi-Quellcode:
Canvas.Brush.Style := bsClear;
Canvas.TextRect(...)
Gruß Hawkeye

Ares 7. Mär 2007 15:31

Re: Eigene Komponte: Eigene Grafiken einbinden
 
Ah, vielen Dank für den Tipp! Das scheints gewesen zu sein...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz