Delphi-PRAXiS
Seite 2 von 2     12   

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 Dynamisches Editfeld als Komponente (https://www.delphipraxis.net/97438-dynamisches-editfeld-als-komponente.html)

DelphiManiac 28. Aug 2007 13:04

Re: Dynamisches Editfeld als Komponente
 
Ich habe es zurzeit folgendermaßen geregelt:

Delphi-Quellcode:
// Hier fange ich das loslassen der Linken Maustaste und Pfeiltaste 'hoch' ab
procedure TForm12.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if (Msg.message = (WM_LBUTTONUP)) or (Msg.message = WM_KEYUP ) then
  begin
    Timer1.Enabled:=false; // Timer wird gestoptt
    RxSpinEdit1.Increment:=Power(10,-(RxSpinEdit1.Decimal)); // Erhöhungsschritt wird zurückgsetzt auf kleinste (letzte Stelle)
    end;
end;
// Zeitbasis wird beim Hoch/Runter klicken der Spinbuttons aktiviert
procedure TForm12.RxSpinEdit1TopClick(Sender: TObject);
begin
  Timer1.Enabled:=true;
end;
//
procedure TForm12.Timer1Timer(Sender: TObject);
begin
  RxSpinEdit1.Increment:= RxSpinEdit1.Increment+(Power(10,-(RxSpinEdit1.Decimal))); // Erhöhungsschritt wird erhöht
  // Beispiel: Decimal steht auf 2 (also 2 Nachkommastellen), das heißt es sieht folgendermaßen aus:
  // '0.00' gut nun wird der Incrementschritt um 0.01 erhöht
end;
Wie kann ich das nun in meiner 'neuen' Komponente unterbringen?

DelphiManiac 28. Aug 2007 13:09

Re: Dynamisches Editfeld als Komponente
 
Ich will ja auch von JVSpinEdit ableiten, da hier schon die Möglichkeit gegeben ist mit Fliesskommazahlen zu arbeiten,
was sehr wichtig ist für meine Komponente.

Habe in SpinEdit.pas geguckt, habe natürlich den Fehler gemacht, dass ich bei TSpinEdit geguckt habe un nicht bei TTImerspeedButton....

Meine Frage ist wie oben dargestellt:

Ich will die Zeitbasis mit dem Klick auf den Button Up/Down starte (in meiner Komponente), die hat jedoch nur die privaten
Attribute:
FOnTopClick: TNotifyEvent;
FOnBottomClick: TNotifyEvent;
,die mit den Propertys OnTopClick, OnBottomClick verknüpft sind...

Sidorion 29. Aug 2007 08:00

Re: Dynamisches Editfeld als Komponente
 
Mit den Jedis kenn ich mich nicht aus, aber es wäre kein Problem einen eigenen Spin von Anfang an nachzubauen, da Du die Quellen ja hast. Dann kannste nebenbei auch das völlig falsche Zeichenverhalten bei aktivierten Themes korrigieren. Du musst alle drei Klassen nachbauen: den Timerbutton, den UpDown Button und den SpinEdit. Hier mal die Header zu meinen Nachbauten:
Delphi-Quellcode:
  TSpinBtn=Class(TCustomControl)
   Private
    bMouseDown: Boolean;
    bMouseOver: Boolean;
    bMouseOverUp: Boolean;
    oDownGlyph: TBitMap;
    oFocusControl: TWinControl;
    oOnDownClick: TNotifyEvent;
    oOnUpClick: TNotifyEvent;
    oRepeatTimer: TTimer;
    oUpGlyph: TBitMap;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
   Protected
    procedure Click; Override;
    procedure DoRepeatTimer(Sender: TObject);
    function GetDownGlyph: TBitmap;
    function GetUpGlyph: TBitmap;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); Override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); Override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); Override;
    procedure Notification(AComponent: TComponent;
      Operation: TOperation); override;
    procedure Paint; Override;
    procedure SetDownGlyph(Value: TBitmap);
    procedure SetEnabled(Value: Boolean); Override;
    procedure SetUpGlyph(Value: TBitmap);
    property DownGlyph: TBitmap read GetDownGlyph write SetDownGlyph;
    property UpGlyph: TBitmap read GetUpGlyph write SetUpGlyph;
   Public
    Constructor Create(Owner: TComponent); Override;
    Destructor Destroy; Override;
  published
    property Align;
    property Anchors;
    property Constraints;
    property Ctl3D;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property FocusControl: TWinControl read oFocusControl write oFocusControl;
    property ParentCtl3D;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property Visible;
    property OnDownClick: TNotifyEvent read oOnDownClick write oOnDownClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnStartDock;
    property OnStartDrag;
    property OnUpClick: TNotifyEvent read oOnUpClick write oOnUpClick;
  End;

  TSpinEdt = class(TCustomEdit)
  private
    FMinValue: Single;
    FMaxValue: Single;
    FIncrement: Single;
    FButton: TSpinBtn;
    FEditorEnabled: Boolean;
    function GetMinHeight: Integer;
    function GetIntValue: LongInt;
    function GetValue: Single;
    function CheckIntValue (NewValue: LongInt): LongInt;
    function CheckValue (NewValue: Single): Single;
    procedure SetIntValue (NewValue: LongInt);
    procedure SetValue (NewValue: Single);
    procedure SetEditRect;
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
    procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
    procedure CMExit(var Message: TCMExit);  message CM_EXIT;
    procedure WMPaste(var Message: TWMPaste);  message WM_PASTE;
    procedure WMCut(var Message: TWMCut);  message WM_CUT;
  protected
    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
    function IsValidChar(Key: Char): Boolean; virtual;
    procedure UpClick (Sender: TObject); virtual;
    procedure DownClick (Sender: TObject); virtual;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyPress(var Key: Char); override;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure SetEnabled(Value: Boolean); Override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Button: TSpinBtn read FButton;
  published
    property Anchors;
    property AutoSelect;
    property AutoSize;
    property Color;
    property Constraints;
    property Ctl3D;
    property DragCursor;
    property DragMode;
    property EditorEnabled: Boolean read FEditorEnabled write FEditorEnabled default True;
    property Enabled;
    property Font;
    property Increment: Single read FIncrement write fIncrement;
    property MaxLength;
    property MaxValue: Single read FMaxValue write fMaxValue;
    property MinValue: Single read FMinValue write fMinValue;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ReadOnly;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property IntValue: LongInt read GetIntValue write SetIntValue;
    property Value: Single read GetValue write SetValue;
    property Visible;
    property OnChange;
    property OnClick;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDrag;
  end;
Hab das auf zwei Klassen Reduziert, weil der TSpinBtn beide Knöpfe zeichnet und bedient. Mehr Code rück ich aber nicht raus, weil ich hab noch keine Lizenz gefunden, die mir passt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr.
Seite 2 von 2     12   

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