Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > не Down-кнопка


Автор: santilaas 27.10.2007, 12:29
Привет всем! 
Вопрос такой: нужно (пожалуйста, не спрашивайте зачем) сделать так, чтобы кнопка SpeedButton не переходила в состояние Down, даже при клике (в момент клика) по ней. Как это сделать?
Заранее спасибо!

Автор: Alix 27.10.2007, 12:34
Enabled := false или просто сделать картинку с изображение отжатой кнопки

Автор: santilaas 27.10.2007, 15:55
это не то, 
мне нужно, чтобы именно в момент клика на кнопку ничего (кроме того, что написано в OnClick-е) не происходило, т.е чтобы состояние кнопки до клика, в момент клика и после клика не менялось

Автор: VICTAR 27.10.2007, 16:03
А нужна обязательно SpeedButton?

Автор: santilaas 28.10.2007, 13:27
Желательно SpeedButton, ну на край сойдет и Toolbutton

Автор: lukas 28.10.2007, 20:49
GroupIndex:=0, а сообствено по умолчанию она не обладает свойством переходить в down...

Автор: santilaas 29.10.2007, 03:46
Цитата

GroupIndex:=0, а сообствено по умолчанию она не обладает свойством переходить в down... 

-
Цитата

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

Автор: Rennigth 29.10.2007, 10:04
santilaas, А TPanel непойдет?  smile 

Автор: Alix 29.10.2007, 11:25
Можно вот так. Но может ты все же расскажешь, зачем оно надо?
Код
unit Unit1;

interface

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

type
  TSpeedButton = class(Buttons.TSpeedButton)
  private
    procedure WndProc(var Message: TMessage); override;
  end;

  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    SpeedButton2: TSpeedButton;
    BitBtn1: TBitBtn;
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TSpeedButton }

procedure TSpeedButton.WndProc(var Message: TMessage);
begin
  // не совсем корректно, правда, но главное - идея ;)
  if message.Msg = WM_LBUTTONDOWN then begin
    if assigned(OnClick) then
      OnClick(self);
    exit;
  end;

  inherited WndProc(message);
end;

{ TForm1}

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  caption := 'xxx';
end;

end.


Автор: santilaas 29.10.2007, 11:28
Цитата

santilaas, А TPanel непойдет?

- нет, объясню подробнее:
вообще, на самом деле я хочу сделать свое PopupMenu, которое выпадает при щелчке по кнопке;
делаю меню на основе отдельной формы без бордюра, форма открывается когда нужно и в нужном мне месте. 
НО возникли следующие проблемы:
- из каких стандартных компонентов сделать что-либо похожее на пункты стандартного PopupMenu и притом чтобы при перемещении по пунктам - пункты подсвечивались другим цветом?;
- как сделать чтобы моя форма-PopupMenu пряталась, когда пользователь нажимал бы кнопку мыши в другом (т.е не на самом меню) месте экрана? - сразу скажу OnDeactivate - не подходит - оно срабатывает только относительно моего приложения.
- как сделать, чтобы моя форма-PopupMenu не отбирала фокус у главного окна приложения, вернее чтобы у главного окна всегда был фокус, а у формы-PopupMenu он появлялся только при её открытии?    

В общем в идеале должно получиться меню а-ля выпадающий список для непоместившихся значков в "панели быстрого запуска" в Winde

Автор: bober 30.10.2007, 17:21
Цитата

вообще, на самом деле я хочу сделать свое PopupMenu, которое выпадает при щелчке по кнопке;

Так вы хотите сделать именно свое или вас не устраивает стандартное?


Цитата

- из каких стандартных компонентов сделать что-либо похожее на пункты стандартного PopupMenu и притом чтобы при перемещении по пунктам - пункты подсвечивались другим цветом?;

TLabel, для изменения цвета использовать события onMouseLeave, onMouseEnter

Автор: bems 30.10.2007, 17:47
а чем не устраивает стандартное меню со своей отрисовкой?

Автор: Alix 30.10.2007, 18:20
bems, http://forum.vingrad.ru/forum/topic-176267.html

Автор: santilaas 30.10.2007, 19:04
Цитата

Так вы хотите сделать именно свое или вас не устраивает стандартное?

- именно свое, хотя я его бы не делал, если бы в стандартном PopupMenu все было

Цитата

bems, http://forum.vingrad.ru/forum/topic-176267.html
 
- Alix, все верно - это мой топик

Автор: bems 30.10.2007, 19:20
Цитата(santilaas @  9.10.2007,  15:20 Найти цитируемый пост)

  -- PopupMenu было фикисрованной ширины, той которую задам я?
  -- PopupMenu открывалось относительно заданной координаты только вверх и влево?
  -- у каждого пункта PopupMenu было свое контекстное меню?
  -- самостоятельно можно было регулировать открытие и закрытие PopupMenu - т.е. чтобы оно не закрывалось свмо при нажатии на него

1)WM_MEASUREITEM
2)TrackPopupMenuEx, аргумент lptpm
3)TMP_RECURSE

Добавлено через 11 минут и 50 секунд
4)http://forum.vingrad.ru/index.php?showtopic=159234&view=findpost&p=1168857

Автор: santilaas 31.10.2007, 07:33
с шириной списка вроде как разобрался - сделал так:
свойство OwnerDraw поставил в True и для первого пункта меню в событии OnMeasureItem написал 
Код

Width:= 150; //т.е. указал сколько нужно пикселей.

Цитата
2)TrackPopupMenuEx, аргумент lptpm

- здесь, поскольку мое меню появляется при нажатии на кнопку, пишу в её OnClick-е так:  
Код

 TrackPopupMenuEx(FMain.PopupMenu1.Handle,
                          TPM_LEFTALIGN + TPM_VERTICAL,
                          Popup_X,
                          Popup_Y,
                          handle,nil);

- 1) меню открывается, но в нем нет ни одного моего пункта (ранее созданного)
- 2) пытался поставить аргумент lptpm вместо nil - Delphi ругается (Undeclared identifier)
Цитата
3)TMP_RECURSE

- что это и как его применить - в какую процедуру определить?

и еще - т.к. мой список-меню открывается при нажатии на кнопку, как сделать, чтобы при повторном нажатии на кнопку этот список закрывался?

- посмотрел ссылочку - испробовал, но там что-то много чего работает не так, как мне нужно - и потом хотелось бы как-нибудь попроще все это реализовать.

Автор: bober 31.10.2007, 15:27
Имхо лепить из чего то свое меню - избыточное изобретение велосипеда
Посмотрите на этот пакет, там есть попап меню с кучей настроек может вам подойдет. 
SpTBXLib
http://www.torry.net/authorsmore.php?id=6409

Автор: bems 31.10.2007, 17:34
Цитата(santilaas @  31.10.2007,  07:33 Найти цитируемый пост)
 1) меню открывается, но в нем нет ни одного моего пункта (ранее созданного)
это как? пустое совсем открывается?

Цитата(santilaas @  31.10.2007,  07:33 Найти цитируемый пост)
 2) пытался поставить аргумент lptpm вместо nil - Delphi ругается (Undeclared identifier)
покажи как делал

Цитата(santilaas @  31.10.2007,  07:33 Найти цитируемый пост)
TMP_RECURSE

- что это и как его применить - в какую процедуру определить?

это фляжок для TrackPopupMenuEx, указывающий что меню показывается как контекстное для другого меню. Если делфи старая, то хелп тоже старый. Почитай описание TrackPopupMenuEx в MSDN

Цитата(santilaas @  31.10.2007,  07:33 Найти цитируемый пост)
и еще - т.к. мой список-меню открывается при нажатии на кнопку, как сделать, чтобы при повторном нажатии на кнопку этот список закрывался?
из этой цитаты
Цитата(santilaas @  29.10.2007,  11:28 Найти цитируемый пост)
- как сделать чтобы моя форма-PopupMenu пряталась, когда пользователь нажимал бы кнопку мыши в другом (т.е не на самом меню) месте экрана?
я сделал вывод, что нужно чтобы она закрывалось при щелчке в любом месте, а не только по кнопке. А что, если щелкаешь не по меню, то оно остатся?

Автор: santilaas 2.11.2007, 09:45
Цитата

http://www.torry.net/authorsmore.php?id=6409
- что-то не получается у меня эти компоненты установить - при компиляции выдает сообщение, - "Required package 'tb2k_d6' not found" - видимо требует установленного Toolbar2000, а он мне и никогда не был нужен, да и потом зачем такие зависимые компоненты?

Цитата

это как? пустое совсем открывается?
- абсолютно пустое - высотой примерно пикселей 100 и в ширину пикселей -20?!
Цитата

покажи как делал
-так и делал:
Код

TrackPopupMenuEx(FMain.PopupMenu1.Handle,
                         TPM_RECURSE,
                         Popup_X,
                         Popup_Y,
                         FMain.Handle,lptpm);
здесь я Popup_X и Popup_Y я определяю заранее.
TMP_RECURSE мне ничего не дало
Цитата

я сделал вывод, что нужно чтобы она закрывалось при щелчке в любом месте, а не только по кнопке. А что, если щелкаешь не по меню, то оно остатся?
- здесь не нужно путать: в начале топика я просил помочь мне с формой-PopupMenu (т.е. из формы я хотел сделать меню и описал трудности,которые у меня возникли), но затем Вы мне посоветовали все-таки остановиться на стандартном PopupMenu - так вот это именно для него я и написал:
т.к. мой список-меню открывается при нажатии на кнопку, как сделать, чтобы при повторном нажатии на кнопку этот список закрывался? 

И потом - все-таки главное здесь - 
чтобы самостоятельно можно было регулировать открытие и закрытие PopupMenu - т.е. чтобы оно не закрывалось само при нажатии на него?

Автор: santilaas 5.11.2007, 17:20
неужели больше никто не поможет?!  smile 

Автор: santilaas 9.11.2007, 17:33
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)