AGB  ·  Datenschutz  ·  Impressum  







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

Probleme mit einer eigenen Komponente

Ein Thema von Wal · begonnen am 4. Nov 2006 · letzter Beitrag vom 5. Nov 2006
Antwort Antwort
Wal

Registriert seit: 22. Sep 2006
57 Beiträge
 
#1

Probleme mit einer eigenen Komponente

  Alt 4. Nov 2006, 13:37
Habe Probleme mit dem Click und MouseDown Ereignis, hier der Code :
Delphi-Quellcode:
unit cPOSCompo;

interface

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

type
  TOnMouseEvent = procedure( Msg: TWMMouse ) of object;

  TcPOSCompo = class(TCustomControl)
  protected

    procedure WMMouseEnter( var Msg : TWMMouse ); message CM_MOUSEENTER;
    procedure WMMouseLeave( var Msg : TWMMouse ); message CM_MOUSELEAVE;
    procedure WMLButtonUp( var Msg : TWMLButtonUp ); message WM_LBUTTONUP;
    procedure WMLButtonDown( var Msg : TWMLButtonUp ); message WM_LBUTTONDOWN;
  private
    FImage: TImage;
    FLabel: TLabel;
    FEntered : boolean;
    FDown : boolean;
    FPic : TPicture;
    FPicDown : TPicture;
    FPicUp : TPicture;
    FOnMouseEnter : TOnMouseEvent;
    FOnMouseLeave : TOnMouseEvent;
    FOnMouseDown : TOnMouseEvent;
    FOnMouseUp : TOnMouseEvent;
    procedure setCaption(Value: String);
    function getCaption: String;
    procedure setFont(Value: TFont);
    function getFont: TFont;
    procedure SetPic( Value : TPicture );
    procedure SetPicDown( Value : TPicture );
    procedure SetPicUp( Value : TPicture );
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Resize; override;
  published
    property Caption: String read getCaption write setCaption;
    property Font: TFont read getFont write setFont;
    property Pic : TPicture read FPic write SetPic;
    property PicDown : TPicture read FPicDown write SetPicDown;
    property PicUp : TPicture read FPicUp write SetPicUp;
    property OnMouseDown : TOnMouseEvent read FOnMouseDown write FOnMouseDown;
    property OnMouseEnter : TOnMouseEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave : TOnMouseEvent read FOnMouseLeave write FOnMouseLeave;
    property OnMouseUp : TOnMouseEvent read FOnMouseUp write FOnMouseUp;
    property OnClick;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('cPos_Live', [TcPOSCompo]);
end;

constructor TcPOSCompo.Create(AOwner: TComponent);
begin
  Inherited;
  FImage := TImage.Create(self);
  FImage.Parent := self;
  FLabel:= TLabel.create(self);
  FLabel.Parent := self;
  FPic := TPicture.Create;
  FPicUp := TPicture.Create;
  FPicDown := TPicture.Create;
  FLabel.Visible := False;
  FLabel.Transparent := True;
  Self.AutoSize := True;
  FImage.AutoSize := True;
  FEntered := False;
  FDown := False;
end;

destructor TcPOSCompo.Destroy;
begin
  FPic.Free;
  FPicDown.Free;
  FPicUp.Free;
  Inherited;
end;

procedure TcPOSCompo.Resize;
begin
  FImage.Picture := FPic;
End;

procedure TcPOSCompo.WMMouseEnter( var Msg: TWMMouse );
begin
  FEntered := True;
  if FDown then FImage.Picture := FPicDown else FImage.Picture := FPicUp;
  if Assigned( FOnMouseEnter ) then FOnMouseEnter( Msg );
end;

procedure TcPOSCompo.WMMouseLeave( var Msg: TWMMouse );
begin
  FEntered := False;
  FImage.Picture := FPic;
  if Assigned( FOnMouseLeave ) then FOnMouseLeave( Msg );
end;

procedure TcPOSCompo.WMLButtonDown(var Msg: TWMMouse);
begin
  inherited;
  FDown := True;
  if FEntered then FImage.Picture := FPicDown;
  if Assigned( FOnMouseDown ) then FOnMouseDown( Msg );
end;

procedure TcPOSCompo.WMLButtonUp(var Msg: TWMMouse);
begin
  inherited;
  FDown := False;
  if FEntered then FImage.Picture := FPicUp;
  if Assigned( FOnMouseUp ) then FOnMouseUp( Msg );
end;

procedure TcPOSCompo.setCaption(Value: String);
begin
  FLabel.Caption := Value;
  If FLabel.Caption = 'then FLabel.Visible := False
  else FLabel.Visible := True;
end;

function TcPOSCompo.getCaption: String;
begin
  result := FLabel.Caption;
end;

procedure TcPOSCompo.setFont(Value: TFont);
begin
  FLabel.Font := Value;
end;

function TcPOSCompo.getFont: TFont;
begin
  result := FLabel.Font;
end;

procedure TcPOSCompo.SetPic( Value : TPicture );
begin
  FPic.Assign( Value );
end;

procedure TcPOSCompo.SetPicDown( Value : TPicture );
begin
  FPicDown.Assign( Value );
end;

procedure TcPOSCompo.SetPicUp( Value : TPicture );
begin
  FPicUp.Assign( Value );
end;

end.
Das MouseDown für die PicDown-Umschaltung und das Click für das reagieren auf den Button im Programm funzt nicht, ich gehe mal davon aus, da ich ja auf das Image oder Label Klicke und nicht auf das Kompo. Wie könnte ich das lösen ?
Vielen Dank im vorraus.

Wal
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Probleme mit einer eigenen Komponente

  Alt 4. Nov 2006, 13:52
Hallo,

erst mal:
Statt alles neu zu programmieren, solltest Du lieber die Methoden MouseDown und MouseUp überschreiben.

Jetzt zu Deiner Frage:
Wie wäre es, statt zig Pictures einfach Bitmaps zu nehmen, und diese in der Paint-Methode je nach Status zu zeichnen? Das ist wesentlich sauberer und ressourcenschonender. Außerdem erledigen sich Deine Probleme damit wie von selbst.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Wal

Registriert seit: 22. Sep 2006
57 Beiträge
 
#3

Re: Probleme mit einer eigenen Komponente

  Alt 4. Nov 2006, 15:31
Die Bilder sind Jpeg's. Ich denke 10k Jpeg's sind doch bestimmt Ressorcenschonender als 200k BMP's. Habe allerdings auch die TPictures mal mit TBitmaps getauscht, bleibt aber das gleiche Problem.

Wal
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Probleme mit einer eigenen Komponente

  Alt 4. Nov 2006, 15:46
Du kannst auch JPEGs laden und zeichnen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Probleme mit einer eigenen Komponente

  Alt 4. Nov 2006, 16:11
Zitat von Wal:
Die Bilder sind Jpeg's. Ich denke 10k Jpeg's sind doch bestimmt Ressorcenschonender als 200k BMP's.
Sind sie. Aber egal ob TPicture oder TBitmap, die JPEGs werden als reine Bitmaps in den Speicher gelegt, du gewinnst also keinen Vorteil.
Zitat:
Habe allerdings auch die TPictures mal mit TBitmaps getauscht, bleibt aber das gleiche Problem.
Zeichne die Bitmaps und den Text direkt auf die Komponentencanvas, dann benötigst du überhaupt keine anderen Komponenten mehr und der Mausklick kommt auf jeden Fall durch.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Wal

Registriert seit: 22. Sep 2006
57 Beiträge
 
#6

Re: Probleme mit einer eigenen Komponente

  Alt 4. Nov 2006, 16:36
Danke.

Wal
  Mit Zitat antworten Zitat
Wal

Registriert seit: 22. Sep 2006
57 Beiträge
 
#7

Re: Probleme mit einer eigenen Komponente

  Alt 5. Nov 2006, 13:22
So habe das Teil soweit fertig, evtl. könnte ein Profi mal drüberschauen ob noch was zu verbessern ist.
Ich möchte noch ein paar Kleinigkeiten einbauen, da wäre es gut wenn ich nicht mehr so viel ändern müßte.
Delphi-Quellcode:
unit cPosCompo;

interface

uses
  Classes, Graphics, Controls, Messages, Jpeg;

type
  TcPosCompo = class(TGraphicControl)
  private
    FUpPic : TJpegImage;
    FDownPic : TJpegImage;
    FOverPic : TJpegImage;
    FBoolTruePic : TBitmap;
    FBoolFalsePic : TBitmap;
    FShowBoolPic : Boolean;
    FButtonDown : Boolean;
    FLabelXPos : Integer;
    FLabelYPos : Integer;
    FEntered : Boolean;
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure WMMouseEnter( var Message : TWMMouse ); message CM_MOUSEENTER;
    procedure WMMouseLeave( var Message : TWMMouse ); message CM_MOUSELEAVE;
    procedure SetDownPic(const Value: TJpegImage);
    procedure SetUpPic(const Value: TJpegImage);
    procedure SetOverPic(const Value: TJpegImage);
    procedure SetBoolTruePic(const Value: TBitmap);
    procedure SetBoolFalsePic(const Value: TBitmap);
    procedure SetText(const Value: TCaption); reintroduce;
    procedure SetShowBoolPic(const Value: Boolean);
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Caption write SetText;
    property UpPicture: TJpegImage read FUpPic write SetUpPic;
    property DownPicture: TJpegImage read FDownPic write SetDownPic;
    property OverPicture: TJpegImage read FOverPic write SetOverPic;
    property BoolTruePicture: TBitmap read FBoolTruePic write SetBoolTruePic;
    property BoolFalsePicture: TBitmap read FBoolFalsePic write SetBoolFalsePic;
    property ShowBoolPic: Boolean read FShowBoolPic write SetShowBoolPic;
    property OnMouseDown;
    property OnMouseUp;
    property OnClick;
  end;

procedure Register;

implementation

  procedure Register;
begin
  RegisterComponents('cPOS_Live', [TcPosCompo]);
end;

{ TcPosCompo }

constructor TcPosCompo.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FUpPic := TJpegImage.Create();
  FDownPic := TJpegImage.Create();
  FOverPic := TJpegImage.Create();
  FBoolTruePic := TBitmap.Create();
  FboolTruePic.TransparentColor := clblack;
  FboolTruePic.Transparent := True;
  FBoolFalsePic := TBitmap.Create();
  FboolFalsePic.TransparentColor := clblack;
  FboolFalsePic.Transparent := True;
  FButtonDown := False;
  FEntered := False;
  FShowBoolPic := False;
  FLabelXPos := 0;
  FLabelYPos := 0;
  Canvas.Brush.Style := bsClear;
end;

destructor TcPosCompo.Destroy;
begin
  FUpPic.Free();
  FDownPic.Free();
  FOverPic.Free();
  FBoolTruePic.Free();
  FBoolFalsePic.Free();
  inherited;
end;

procedure TcPosCompo.Paint;
begin
  if FButtonDown then
  begin
    Canvas.Draw(0, 0, FDownPic);
    if FShowBoolPic then Canvas.Draw(5, 4, FBoolTruePic) else Canvas.Draw(5, 4, FBoolFalsePic);
    Canvas.Font.Color := clWhite;
    Canvas.TextOut(FLabelXPos + 1, FLabelYPos + 1, Caption);
    Canvas.Font.Color := clBlack;
    Canvas.TextOut(FLabelXPos, FLabelYPos, Caption);
  end else
  begin
    if FEntered then Canvas.Draw(0, 0, FOverPic) else
    Canvas.Draw(0, 0, FUpPic);
    if FShowBoolPic then Canvas.Draw(5, 4, FBoolTruePic) else Canvas.Draw(5, 4, FBoolFalsePic);
    Canvas.Font.Color := clBlack;
    Canvas.TextOut(FLabelXPos + 1, FLabelYPos + 1, Caption);
    Canvas.Font.Color := clWhite;
    Canvas.TextOut(FLabelXPos, FLabelYPos, Caption);
  end;
end;

procedure TcPosCompo.SetBoolTruePic(const Value: TBitmap);
begin
  FBoolTruePic.Assign(Value);
end;

procedure TcPosCompo.SetBoolFalsePic(const Value: TBitmap);
begin
  FBoolFalsePic.Assign(Value);
end;

procedure TcPosCompo.SetOverPic(const Value: TJpegImage);
begin
  FOverPic.Assign(Value);
end;

procedure TcPosCompo.SetDownPic(const Value: TJpegImage);
begin
  FDownPic.Assign(Value);
end;

procedure TcPosCompo.SetUpPic(const Value: TJpegImage);
begin
  FUpPic.Assign(Value);
end;

procedure TcPosCompo.WMLButtonDown(var Message: TWMLButtonDown);
begin
  FButtonDown := True;
  Repaint();
  inherited;
end;

procedure TcPosCompo.WMLButtonUp(var Message: TWMLButtonUp);
begin
  FButtonDown := False;
  Repaint();
  inherited;
end;

procedure TcPosCompo.WMMouseEnter( var Message: TWMMouse );
begin
  FEntered := True;
  Repaint();
  inherited;
end;

procedure TcPosCompo.WMMouseLeave( var Message: TWMMouse );
begin
  FEntered := False;
  Repaint();
  inherited;
end;

procedure TcPosCompo.SetText(const Value: TCaption);
begin
  if Caption <> Value then
  begin
    SetTextBuf(PChar(Value));
    Repaint();
  end;
end;

procedure TcPosCompo.SetShowBoolPic(const Value: Boolean);
begin
  if ShowBoolPic <> Value then
  begin
    FShowBoolPic := Value;
    Repaint();
  end;
end;

end.
Funktion:
Es sollen 3 Jpeg-Bilder eingebunden werden, für: up,down,over. Eine Bitmap für den Status des Buttons, wenn er als Schalter und nicht als Taster benutzt wird.
Eine Beschriftung soll angezeigt werden.
Das ganze funzt auch soweit.
Die Status und Beschriftungskoordinaten muß ich noch einbinden.

Wal
  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 04:42 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