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.
 |