AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Möchte TPanel mit Image von ImageList koppeln

Ein Thema von Jumpy · begonnen am 9. Apr 2013 · letzter Beitrag vom 15. Apr 2013
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

Möchte TPanel mit Image von ImageList koppeln

  Alt 9. Apr 2013, 11:17
Hallo,

ich möchte ein eigenes Panel erstellen, das optisch wie z.B. ein BitBtn aufgebaut ist: Links ein Icon und daran anschließend eine Caption. Das Icon soll zur Laufzeit änderbar sein und ich könnte mir vorstellen, die Icons in einer ImageList zu verwalten, diese dem Panel zuzuweisen und über den ImageIndex zur Laufzeit das Icon zu ändern.

- Ginge die grundsätzliche Konstruktion oder kann man die Idee mit der Imagelist vergessen? Sollte man stattdessen jedes mal das Image von Irgendwoher laden?
- Wie bekommt man überhaupt ein Icon/Image auf das Panel? TImage erzeugen und auf dem Panel platzieren oder doch direkt als bmp o.ä. auf dem Panel direkt zeichenen, da ich ja eh eine eigenes Panel dafür ableite, könnte ich mir doch Zugriff auf den Canvas besorgen (hab in der DP schon für beides Threads gefunden, mein ich).
- Alle Icons sollen gleich groß sein, aber um deren Breite versetzt müsste ich doch den Text dann selber zeichnen. Gibt es sowas wie OwnerDraw für TPanel?

- Oder gibt es vllt. schon eine ähnliche Komponente? Hab mal bei Torry gesucht und ein paar ganze nette Panel-Erweiterungen gefunden wo ich mir vllt. auch was abgucken kann, aber nicht das, was mir hier vorschwebt.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Möchte TPanel mit Image von ImageList koppeln

  Alt 9. Apr 2013, 11:56
TPanel verfügt bereits über eine Canvas-Property, man sieht die nur deshalb im Normalfall nicht, weil sie protected ist. Du kannst also auf Deiner Komponente herumzeichnen, wie Du magst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Möchte TPanel mit Image von ImageList koppeln

  Alt 9. Apr 2013, 11:58
Also soll es eine eigene Komponente werden?
Anbei mal, wie ich das gelöst habe. Das TImage ignoriert einfach Mausereignisse (Hittest).

Die Zuweisung der Bilder kannst Du dann klassisch regeln (in meinem Fall werden die Daten über ein Framework geholt).

Von Deinem Panel kannst Du die Methode Paint überschreiben und an Deine Bedürfnisse anpassen (im Grunde nur den Platz für den Text ändern) oder rechts einfach ein Label einsetzen und dort den Text zuweisen.
Ok da stellt sich sich die gleiche Frage wieder.

Ist halt die Frage, wie oft Du dieses Panel brauchst und wo die Daten herkommen bzw. wie diese zugewiesen werden.
Angehängte Dateien
Dateityp: pas odImage.pas (3,0 KB, 14x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Möchte TPanel mit Image von ImageList koppeln

  Alt 9. Apr 2013, 12:10
ganz kurz angerissen

Delphi-Quellcode:
unit Unit2;

interface

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

type
  TMyPanel=Class(TCustomPanel)
    Procedure Paint;override;
    private
      FImageList:TImageList;
    FImageIndex: Integer;
    procedure SetImageIndex(const Value: Integer);
    procedure SetImageList(const Value: TImageList);
    published
    Property ImageList:TImageList read FImageList Write SetImageList;
    Property ImageIndex:Integer Read FImageIndex Write SetImageIndex;

  End;

  TForm2 = class(TForm)
    ImageList1: TImageList;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TMyPanel }

procedure TMyPanel.Paint;
const
 C_LOFS=10;
var
 ico:TIcon;
 Toffs:Integer;
begin
 // inherited; nicht aufrufen
  Canvas.Brush.Color := clSilver;
  Canvas.FillRect(ClientRect);
  Toffs := C_LOFS;
  if Assigned(FImageList) and (FImageList.Count>ImageIndex )then
    try
      ico:=TIcon.Create;
      FImageList.GetIcon(ImageIndex,ico);
      Canvas.Draw(C_LOFS,(Height - FImageList.Height) div 2,ico);
      Toffs := Toffs + FImageList.Width + 5;
    finally
       ico.Free;
    end;
  Canvas.TextOut(Toffs,(Height - Canvas.TextHeight('X')) div 2, Caption);
end;

procedure TMyPanel.SetImageIndex(const Value: Integer);
begin
  FImageIndex := Value;
  invalidate;
end;

procedure TMyPanel.SetImageList(const Value: TImageList);
begin
  FImageList := Value;
  invalidate;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
   With TMyPanel.Create(self) do
    begin
      Parent := Self;
      Caption := 'Mein Testpanel';
      Width := 200;
      Height := 50;
      Left := 50;
      Top := 50;
      Imagelist := IMagelist1;
      ImageIndex := 0;
    end;
end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Möchte TPanel mit Image von ImageList koppeln

  Alt 9. Apr 2013, 13:38
Hallo und natürlich erstmal danke für's Antworten!
Warum ich gerne auf Canvas malen würde ist, damit ich so MouseOver/Click usw. direkt im Panel verarbeiten kann und nicht erst noch das darauf platzierte Image so umschreiben muss, dass es das ans Panel durchreicht. Hab glaub ich Beispiele gesehen, dass das auch geht, aber so ist's mir lieber.

stahlis odImage wäre glaub ich so was wie ich im obigen Satz meinte, wobei ich mich noch Frage, da TodImage von TodPanel abgeleitet ist, was ist an TodPanel interessant gegenüber TPanel.

Bummis "kurz angerissenes" sieht doch so aus, wie ich mir das gedacht habe, mal gucken, ob ich das nachvollzogen bekomme. Interessant da noch, das im Paint das inherited bewußt nicht aufgerufen wird. In den Beispielen, die ich z.B. auf Tory gefunden habe, wurde das drin gelassen und dann scheinbar noch was "dazugemalt".

Und dann noch eine andere Frage dazu: Wenn ich das Ganze erstmal nur für ein Projekt brauchen möchte und diesem nur die .Pas beilegen und die Panels nur zur Laufzeit erzeugen möchte, dann brauch ich doch diese RegisterComponents-Geschichte nicht, oder?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Möchte TPanel mit Image von ImageList koppeln

  Alt 9. Apr 2013, 13:51
RegisterComponents ist nur für die Installation in die IDE (Komponentenpalette) zuständig, Du kannst die Komponente natürlich auch ohne Installation zur Laufzeit erzeugen und benutzen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Möchte TPanel mit Image von ImageList koppeln

  Alt 9. Apr 2013, 14:42
DeddyH erklärt das korrekt.

Statt von einen TodPanel könntest Du von einem TPanel ableiten. TodPanel beinhaltet Erweiterungen bzgl. der Datenbindung.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Möchte TPanel mit Image von ImageList koppeln

  Alt 15. Apr 2013, 10:35
Hallo,

hier jetzt mal mein fertiges TStatusPanel nach Bummis Anriss, danke aber auch an alle anderen.
- Man kann das Bild als Icon oder Bitmap malen
- Bei MausUp bekommt das Panel den Fokus
- Hintergrund und Font können anders gefärbt werden, wenn es den Fokus hat
- Man kann eine Rahmenfarbe und -Breite definieren
- Man kann eine zweite Rahmenfarbe definieren um das Panel zu "Highlighten".

Delphi-Quellcode:
unit uStatusPanel;

interface

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

type TImageMode = (Icon,Bitmap);

type
  TStatusPanel=Class(TPanel)
    Procedure Paint;override;
   private
     FOnMouseDown: TNotifyEvent;
     FImageList:TImageList;
     FImageIndex: Integer;
     FImageMode:TImageMode;
     FImageBorder:integer;
     FBorderSize:integer;
     FBackColor:TColor;
     FFontColor:TColor;
     FBorderColor:TColor;
     FShowBorder:Boolean;
     FHighColor:TColor;
     FFontHighColor:TColor;
     FBorderHighColor:TColor;
     FShowBorderHighlighted:Boolean;
     FActive:Boolean;
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
    procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
    procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED;
    procedure SetImageIndex(const Value: Integer);
    procedure SetImageList(const Value: TImageList);
    function GetBackColor: TColor;
    procedure SetBackColor(const Value: TColor);
    function GetBorderColor: TColor;
    function GetHighColor: TColor;
    function GetShowBorder: Boolean;
    procedure SetBorderColor(const Value: TColor);
    procedure SetHighColor(const Value: TColor);
    procedure SetShowBorder(const Value: Boolean);
    function GetBorderHighColor: TColor;
    procedure SetBorderHighColor(const Value: TColor);
    function GetShowBorderHigh: Boolean;
    procedure SetShowBorderHigh(const Value: Boolean);
    function GetBorderSize: integer;
    procedure SetBorderSize(const Value: integer);
    function GetFontColor: TColor;
    function GetFontHighColor: TColor;
    procedure SetFontColor(const Value: TColor);
    procedure SetFontHighColor(const Value: TColor);
   public
    constructor create(AOwner:TComponent); override;
   published
    Property ImageList:TImageList read FImageList Write SetImageList;
    Property ImageIndex:Integer Read FImageIndex Write SetImageIndex;
    Property ImageMode:TImageMode Read FImageMode Write FImageMode;
    Property ImageBorderSize:integer Read FImageBorder Write FImageBorder;
    Property BackGroundColor:TColor Read GetBackColor Write SetBackColor;
    Property HighlightColor:TColor Read GetHighColor Write SetHighColor;
    Property BorderColor:TColor Read GetBorderColor Write SetBorderColor;
    Property BorderSize:integer Read GetBorderSize Write SetBorderSize;
    Property BorderHighlightColor:TColor Read GetBorderHighColor Write SetBorderHighColor;
    Property FontColor:TColor Read GetFontColor Write SetFontColor;
    Property FontHighlightColor:TColor Read GetFontHighColor Write SetFontHighColor;
    Property ShowBorder:Boolean Read GetShowBorder Write SetShowBorder;
    Property ShowBorderHighlighted:Boolean Read GetShowBorderHigh Write SetShowBorderHigh;
  End;

implementation

{ TStatusPanel }

procedure TStatusPanel.CMFocusChanged(var Message: TCMFocusChanged);
begin
  if Message.Sender is TStatusPanel then
    FActive := Message.Sender = Self
  else
    FActive:=false;
  Repaint;
  inherited;
end;

constructor TStatusPanel.create(AOwner: TComponent);
begin
  inherited;
  FImageIndex:=-1;
  FImageBorder:=5;
  FBackColor:=clBtnFace;
  FHighColor:=clSilver;
  FBorderHighColor:=clRed;
  FBorderColor:=clBlack;
  FShowBorder:=False;
  FShowBorderHighlighted:=False;
  FActive:=false;
  FFontColor:=Font.Color;
  FFontHighColor:=Font.Color;
end;

function TStatusPanel.GetBackColor: TColor;
begin
  Result:=FBAckColor;
end;

function TStatusPanel.GetBorderColor: TColor;
begin
  Result:=FBorderColor;
end;

function TStatusPanel.GetBorderHighColor: TColor;
begin
  Result:=FBorderHighColor;
end;

function TStatusPanel.GetBorderSize: integer;
begin
  Result:=FBorderSize;
end;

function TStatusPanel.GetFontColor: TColor;
begin
  Result:=FFontColor;
end;

function TStatusPanel.GetFontHighColor: TColor;
begin
  Result:=FFontHighColor;
end;

function TStatusPanel.GetHighColor: TColor;
begin
  Result:=FHighColor;
end;

function TStatusPanel.GetShowBorder: Boolean;
begin
  Result:=FShowBorder;
end;

function TStatusPanel.GetShowBorderHigh: Boolean;
begin
  Result:=FShowBorderHighlighted;
end;

procedure TStatusPanel.Paint;
var
 ico:TIcon;
 btm:TBitmap;
 graph:TGraphic;
 Toffs:Integer;
begin
  // inherited; nicht aufrufen
  // Background:
  if FActive then
    Canvas.Brush.Color := HighlightColor
  else
    Canvas.Brush.Color := BackGroundColor;
  Canvas.FillRect(ClientRect);
  // Border:
  if ShowBorder or ShowBorderHighlighted then
  with Canvas do
  begin
    if ShowBorderHighlighted then
      Canvas.pen.color:=BorderHighlightColor
    else
    Canvas.pen.color:=BorderColor;
    Canvas.Pen.Width:=BorderSize;
    Canvas.moveto(0,0);
    Canvas.lineto(width-1,0);
    Canvas.lineto(width-1,height-1);
    Canvas.lineto(0,height-1);
    Canvas.lineto(0,0);
  end;

  // Image:
  Toffs := ImageBorderSize;
  if Assigned(FImageList) and (FImageList.Count>ImageIndex )then
    begin
    Case ImageMode of
      Icon: begin
              ico:=TIcon.Create;
              FImageList.GetIcon(ImageIndex,ico);
              Canvas.Draw(Toffs,(Height - FImageList.Height) div 2,ico);
              ico.Free;
              end;
      Bitmap: begin
              btm:=TBitmap.Create;
              FImageList.GetBitmap(ImageIndex,btm);
              Canvas.Draw(Toffs,(Height - FImageList.Height) div 2,btm);
              btm.Free;
              end;
      end;
    Toffs := Toffs + FImageList.Width + Toffs;
    end;
  // Text ausgeben
  if FActive then
    Canvas.Font.Color:=FontHighlightColor
  else
    Canvas.Font.Color:=FontColor;
  Canvas.TextOut(Toffs,(Height - Canvas.TextHeight('X')) div 2, Caption);
end;

procedure TStatusPanel.SetBackColor(const Value: TColor);
begin
  FBackColor:=value;
  invalidate;
end;

procedure TStatusPanel.SetBorderColor(const Value: TColor);
begin
  FBorderColor:=value;
  invalidate;
end;

procedure TStatusPanel.SetBorderHighColor(const Value: TColor);
begin
  FBorderHighColor:=value;
  invalidate;
end;

procedure TStatusPanel.SetBorderSize(const Value: integer);
begin
  FBorderSize:=value;
end;

procedure TStatusPanel.SetFontColor(const Value: TColor);
begin
  FFontColor:=Value;
  invalidate;
end;

procedure TStatusPanel.SetFontHighColor(const Value: TColor);
begin
  FFontHighColor:=value;
  invalidate;
end;

procedure TStatusPanel.SetHighColor(const Value: TColor);
begin
  FHighColor:=value;
  invalidate;
end;

procedure TStatusPanel.SetImageIndex(const Value: Integer);
begin
  FImageIndex := Value;
  invalidate;
end;

procedure TStatusPanel.SetImageList(const Value: TImageList);
begin
  FImageList := Value;
  invalidate;
end;

procedure TStatusPanel.SetShowBorder(const Value: Boolean);
begin
  FShowBorder:=value;
  invalidate;
end;

procedure TStatusPanel.SetShowBorderHigh(const Value: Boolean);
begin
  FShowBorderHighlighted:=value;
  invalidate;
end;

procedure TStatusPanel.WMLButtonUp(var Message: TWMLButtonUp);
begin
  inherited;
  self.SetFocus;
  if Assigned(FOnMouseDown) then
    FOnMouseDown(Self);
end;

procedure TStatusPanel.WMRButtonUp(var Message: TWMRButtonUp);
begin
  inherited;
  self.SetFocus;
  if Assigned(FOnMouseDown) then
    FOnMouseDown(Self);
end;

end.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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