Hallo liebe Delphi-Helfer
Den folgenden Code habe ich 1:1 von dem kopiert, was der TButton hat.
Aber wenn ich meinen TJButton auf mein Formular legen will, bekomme ich eine "Eine WIN32-API-Funktion ist fehlgeschlagen."-Fehlermeldung.
Wenn ich in meiner Komponente "CreateSubClass" auskommentiere,
bekomme ich zwar keine Fehlermeldung mehr, aber der Schalter zeichnet sich auch nicht richtig.
Wenn ich in meiner Komponente "CreateSubClass" nicht auskommentiere und den Schalter in Programmzeit mit Schalter:= TJButton.Create(Self); erstelle,
bekomme ich auch keine Fehlermeldung mehr und der Schalter ist da.
Weiss einer warum?
MfG und Danke
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188:
| unit JButton;
interface
uses Classes, Graphics, StdCtrls, Controls, Forms, Messages, Windows;
type TJButton = class(TButtonControl) private FDefault: Boolean; FCancel: Boolean; FActive: Boolean; FModalResult: TModalResult; procedure SetDefault(Value: Boolean); procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; protected procedure CreateParams(var Params: TCreateParams); override; procedure CreateWnd; override; procedure SetButtonStyle(ADefault: Boolean); virtual; public constructor Create(AOwner: TComponent); override; procedure Click; override; function UseRightToLeftAlignment: Boolean; override; published property Action; property Anchors; property BiDiMode; property Caption; property Constraints; property DragCursor; property DragKind; property DragMode; property Enabled; property Font; property ParentBiDiMode; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; property TabStop default True; property Visible; property OnClick; property OnContextPopup; property OnDragDrop; property OnDragOver; property OnEndDock; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDock; property OnStartDrag; property Cancel: Boolean read FCancel write FCancel default False; property Default: Boolean read FDefault write SetDefault default False; property ModalResult: TModalResult read FModalResult write FModalResult default 0; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('Jakane', [TJButton]); end;
constructor TJButton.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := [csSetCaption, csOpaque, csDoubleClicks]; Width := 75; Height := 25; TabStop := True; end;
procedure TJButton.Click; var Form: TCustomForm; begin Form := GetParentForm(Self); if Form <> nil then Form.ModalResult := ModalResult; inherited Click; end;
function TJButton.UseRightToLeftAlignment: Boolean; begin Result := False; end;
procedure TJButton.SetButtonStyle(ADefault: Boolean); const BS_MASK = $000F; var Style: Word; begin if HandleAllocated then begin if ADefault then Style := BS_DEFPUSHBUTTON else Style := BS_PUSHBUTTON; if GetWindowLong(Handle, GWL_STYLE) and BS_MASK <> Style then SendMessage(Handle, BM_SETSTYLE, Style, 1); end; end;
procedure TJButton.SetDefault(Value: Boolean); var Form: TCustomForm; begin FDefault := Value; if HandleAllocated then begin Form := GetParentForm(Self); if Form <> nil then Form.Perform(CM_FOCUSCHANGED, 0, Longint(Form.ActiveControl)); end; end;
procedure TJButton.CreateParams(var Params: TCreateParams); const ButtonStyles: array[Boolean] of DWORD = (BS_PUSHBUTTON, BS_DEFPUSHBUTTON); begin inherited CreateParams(Params); CreateSubClass(Params, 'BUTTON'); Params.Style := Params.Style or ButtonStyles[FDefault]; end;
procedure TJButton.CreateWnd; begin inherited CreateWnd; FActive := FDefault; end;
procedure TJButton.CNCommand(var Message: TWMCommand); begin if Message.NotifyCode = BN_CLICKED then Click; end;
procedure TJButton.CMDialogKey(var Message: TCMDialogKey); begin with Message do if (((CharCode = VK_RETURN) and FActive) or ((CharCode = VK_ESCAPE) and FCancel)) and (KeyDataToShiftState(Message.KeyData) = []) and CanFocus then begin Click; Result := 1; end else inherited; end;
procedure TJButton.CMDialogChar(var Message: TCMDialogChar); begin with Message do if IsAccel(CharCode, Caption) and CanFocus then begin Click; Result := 1; end else inherited; end;
procedure TJButton.CMFocusChanged(var Message: TCMFocusChanged); begin with Message do if Sender is TButton then FActive := Sender = Self else FActive := FDefault; SetButtonStyle(FActive); inherited; end;
procedure TJButton.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin DefaultHandler(Message); end;
end. |