Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.03.11;
Скачать: [xml.tar.bz2];

Вниз

Мастера, как правильно сделать подчёркивание надписи на SpeedButton   Найти похожие ветки 

 
Катя   (2002-02-20 13:24) [0]

делаю так, подчёркивается, но потом не убирается черта.
procedure TForm1.SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
SpeedButton1.Font.Style:=[fsUnderline];
end;


 
Юрий Зотов   (2002-02-20 13:46) [1]

А почему она должна убираться, если Вы ее нигде не убираете?

Попробуйте вот что.

type
TForm1 = class(TForm)
...
private
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
...
end;

procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
if Message.LParam = Integer(SpeedButton1) then
with SpeedButton1.Font do Style := Style + [fsUnderline];
inherited
end;

procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
if Message.LParam = Integer(SpeedButton1) then
with SpeedButton1.Font do Style := Style - [fsUnderline];
inherited
end;


 
Катя   (2002-02-20 20:42) [2]

Спасибо, Юрий, ошибку не выдаёт, но и не работает :(


 
reonid   (2002-02-22 22:31) [3]

Возможно, кнопка лежит не непосредственно на форме
(т.е. парентом кнопки является другой контрол, напр. панель )
- тогда для её парента можно переписать оконную процедуру,
добавив обработку сообщений CM_MOUSEENTER/CM_MOUSELEAVE
от конкретной кнопки.

На самом деле гораздо проще написать наследника кнопки с
обработчиками сообщений CM_MOUSEENTER/CM_MOUSELEAVE.
Проблема состоит в том, что не хочется захламлять панель компонентов различным хламом, нужным только для одного приложения.

Можно ещё написать новый компонент, и, не регистрируя его в
среде, заменить им уже существующий в реалтайме.
(сохранив св-ва и обработчики событий старого,
которые были установлены в дизайнтайме).

Я тут немного поизвращался на эту тему.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, ExtCtrls, {rtti,} TypInfo, StdCtrls, Menus;

type
TForm1 = class(TForm)
Panel1: TPanel; // на ней лежат кнопки
SpeedButton1: TSpeedButton; // подчеркивание реализуется через замену оконной процедуры парента
BTest: TSpeedButton; // подчеркивание реализовано через наследника
ListBox1: TListBox;
PopupMenu1: TPopupMenu;
N11: TMenuItem;
N21: TMenuItem;
N31: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure BTestClick(Sender: TObject);
private
FOldBtnParentWndProc: TWndMethod;
public
procedure NewBtnParentWndProc(var Message: TMessage);
end;

TMyBtn = class(TSpeedButton)
private
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
end;

procedure UpgradeComponent(OldCmp: TComponent; NewCmpClass: TComponentClass);

var
Form1: TForm1;
OldF, NewF: TFont;

implementation

{$R *.DFM}

procedure UpgradeComponent(OldCmp: TComponent; NewCmpClass: TComponentClass);
var NewCmp: TComponent;
CmpName: string;
Cls: TClass;
i: Integer;

PropCnt: Integer;
PropList: PPropList;
PropInfo: PPropInfo;

function IsField(PropProc: Pointer): Boolean;
type ba = array[0..3]of Byte;
begin
Result := ba(PropProc)[3] > $FE;
end;
begin
if not NewCmpClass.InheritsFrom(OldCmp.ClassType) then
raise Exception.CreateFmt("Cannot upgrade %s to %s",
[OldCmp.ClassName, NewCmpClass.ClassName]);

NewCmp := NewCmpClass.Create(OldCmp.Owner);

PropCnt := GetTypeData(OldCmp.ClassInfo)^.PropCount;
GetMem(PropList, PropCnt*SizeOf(Pointer));

try
GetPropInfos(OldCmp.ClassInfo, PropList);

for i := 0 to PropCnt-1 do
begin
PropInfo := PropList^[i];
if (PropInfo^.Name <> "Name") then
begin
if PropInfo^.PropType^^.Kind = tkMethod then
SetMethodProp(NewCmp, PropInfo,
GetMethodProp(OldCmp, PropInfo))
else if PropInfo^.PropType^^.Kind = tkClass then
begin
Cls := GetTypeData(PropInfo^.PropType^).ClassType;
if (not Cls.InheritsFrom(TComponent)) and
(Cls.InheritsFrom(TPersistent)) and
IsField(PropInfo^.SetProc)
then
// По непонятной причине свойство
// property Constraints: TSizeConstraints read FConstraints write FConstraints;
// производит запись прямо в поле, а не через Set-метод + Assign
// Поэтому приходится делать обходной маневр.
TPersistent(GetObjectProp(NewCmp, PropInfo)).Assign
(TPersistent(GetObjectProp(OldCmp, PropInfo)))
else
begin
SetObjectProp(NewCmp, PropInfo,
GetObjectProp(OldCmp, PropInfo));
end;
end
else
SetPropValue(NewCmp, PropInfo^.Name, GetPropValue(OldCmp, PropInfo^.Name));
end;
end;
finally
FreeMem(PropList, PropCnt*SizeOf(Pointer));
end;

CmpName := OldCmp.Name;
if OldCmp is TControl then
with TControl(OldCmp) do
begin
TControl(NewCmp).Parent := Parent;
TControl(NewCmp).Visible := Visible;
TControl(NewCmp).Enabled := Enabled;
Hide;
end;

OldCmp.Free;
NewCmp.Name := CmpName; // -> NewCmp.SetReference
end;



 
reonid   (2002-02-22 22:32) [4]

// продолжение

procedure TForm1.NewBtnParentWndProc(var Message: TMessage);
begin
if (Message.Msg = CM_MOUSEENTER) or (Message.Msg = CM_MOUSELEAVE) then
begin
if Pointer(Message.LParam) = SpeedButton1 then
begin
if Message.Msg = CM_MOUSEENTER then
with SpeedButton1.Font do Style := Style + [fsUnderline]
else
with SpeedButton1.Font do Style := Style - [fsUnderline];
end;
end;
FOldBtnParentWndProc(Message);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
FOldBtnParentWndProc := TWinControl(SpeedButton1.Parent).WindowProc;
TWinControl(SpeedButton1.Parent).WindowProc := NewBtnParentWndProc;



UpgradeComponent(BTest, TMyBtn);
end;

{ TMyBtn }

procedure TMyBtn.CMMouseEnter(var Message: TMessage);
begin
with Font do Style := Style + [fsUnderline];
inherited;
end;

procedure TMyBtn.CMMouseLeave(var Message: TMessage);
begin
with Font do Style := Style - [fsUnderline];
inherited;
end;

procedure TForm1.BTestClick(Sender: TObject);
begin
ShowMessage("Test: "+BTest.Name); // BTest ссылается уже на новый компонент
end;

end.


 
Набережных С.   (2002-02-23 09:15) [5]

Не худо-бы сначало поискать в ответах, а потом спрашивать...

private
FOld:TWndMethod;
procedure NewSBProc(var Msg: TMessage);

procedure TForm.FormCreate(Sender: TObject);
begin
FOld:=SpeedButton1.WindowProc;
SpeedButton1.WindowProc:=NewSBProc;
end;

procedure TForm.NewSBProc(var Msg: TMessage);
begin
FOld(Msg);
case Msg.Msg of
CM_MOUSEENTER: with SpeedButton1.Font do Style:=Style + [fsUnderline];
CM_MOUSELEAVE: with SpeedButton1.Font do Style:=Style - [fsUnderline];
end;
end;



> reonid © (22.02.02 22:31)


> Я тут немного поизвращался на эту тему.

Это точно.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.03.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
3-32419
vis
2002-02-11 19:55
2002.03.11
Help


3-32406
ivans
2002-02-11 16:26
2002.03.11
Подгрузка картинок в DBGrid на лету по имени файла


7-32587
wHammer
2001-11-30 13:05
2002.03.11
Speaker


1-32459
b00ts0
2002-02-22 23:01
2002.03.11
ламерский вопрос относительно чата для локальной сети


3-32396
HDD
2002-02-11 15:11
2002.03.11
Help DEAR PEOPLE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский