Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Посоветуйте, как реализовать   Найти похожие ветки 

 
Darvin ©   (2007-09-18 11:53) [0]

Здравствуйте!
В Ворде, в режиме предварительного просмотра есть кнопочка [Несколько страниц], позволяющая выбрать кол-во страниц по горизонтали и по вертикали. По нажатии выпадает окошко с гридом из страниц. Если НЕ БРОСАЕШЬ КНОПКУ МЫШКИ ПОСЛЕ НАЖАТИЯ НА КНОПКУ и двигаешь курсор по гриду, выделяются ячейки этого грида и меняется его размер. При отпускании кнопки мыши окошко прячется и запоминается количество ячеек (страниц) по горизонтали и вертикали.

Я хочу в своем проекте сделать такой-же диалог выбора. Для этого сделал форму с BorderStyle = bsNone, на нее поместил StringGrid. Далее на событии MouseDown кнопки показываю и позиционирую данное окно. Все работает, но возникает проблема. Грид на появившейся форме не получает события MouseMove и MouseUp до тех пор, пока принудительно не нажмешь кнопку мыши и соответственно не выделяются ячейки на гриде и не меняет он своего размера.
Вопрос:
Как сделать так, чтоб появившаяся форма и грид на ней СРАЗУ воспринимал события MouseMove и MouseUp, без предварительного нажатия на гриде в этой форме?


 
Галинка ©   (2007-09-18 12:18) [1]

фокус ей сразу передать. По появлению. Наверное в OnShow().


 
Darvin ©   (2007-09-18 12:22) [2]

>Галинка ©   (18.09.07 12:18) [1]
Form1.SetFocus не работает


 
homm ©   (2007-09-18 12:24) [3]

> на нее поместил StringGrid

А зачем? Ради вертикальных и горизонтальных палочек?


 
Darvin ©   (2007-09-18 12:25) [4]

>homm ©   (18.09.07 12:24) [3]
И страниц в ячейках. А ты как предлагаешь?


 
homm ©   (2007-09-18 12:27) [5]

> [4] Darvin ©   (18.09.07 12:25)
> А ты как предлагаешь?

На канве рисовать. StringGrid для отображения и редактирования СТРОК.


 
Darvin ©   (2007-09-18 12:30) [6]

>homm ©   (18.09.07 12:27) [5]
Хорошо. А как фокус передать форме и отследить перермещение мыши? Рисование на канве проблему не решит


 
Галинка ©   (2007-09-18 12:31) [7]

homm ©   (18.09.07 12:27) [5]

на канве чего? Выпадающего списка? Там же я так понимаю ToolButton с выпадающим списком. Или?


 
Галинка ©   (2007-09-18 12:33) [8]

Автор, а как вообще у тебя все работает? Как вызов самой формы происходит?


 
Darvin ©   (2007-09-18 12:34) [9]

>Галинка ©   (18.09.07 12:31) [7]
Туллбуттон с выпадающим списком не подойдет. Посмотри, как это сделано в ворде. У меня просто SpeedButton, открывающий по MouseDown окно.


 
Darvin ©   (2007-09-18 12:36) [10]

>Галинка ©   (18.09.07 12:33) [8]
procedure TfrmReporter.btnPageMultiMouseDown ( Sender : TObject;
                                              Button : TMouseButton;
                                              Shift  : TShiftState;
                                              X, Y   : Integer );
var
 P : TPoint;
begin
 FfmSetPagesArray.Show;
 P.X := 0;
 P.Y := 0;
 P := btnPageMulti.ClientToScreen(P);
 FfmSetPagesArray.Left := P.X;
 FfmSetPagesArray.Top := P.Y - FSelPageCount.Height;
 FfmSetPagesArray.SetFocus;  <- Добавлено по твоему совету ;-)
end;


 
Галинка ©   (2007-09-18 12:42) [11]

У меня нет ворда. (( Тока опеноффис. Там эта фича тоже есть. И по виду там вроде тулбатон. Из которого выпадающее меню. И поведение вроде соответствующее.

ПыСы: может исходники опенофиса посмотреть?


 
Darvin ©   (2007-09-18 12:46) [12]

>Галинка ©   (18.09.07 12:42) [11]
не знаю, как в openoffice, но в ворде там не выпадающий список, а выпадающая матрица с исзменяющимися размерами (количеством итемов). Может, я чего не знаю.... и выпадающие списки бывают такого вида?


 
Darvin ©   (2007-09-18 12:50) [13]

>Галинка ©   (18.09.07 12:42) [11]
Смотрел в опенофисе. Там тоже выпадающая матрица с изменяющимися размерами.


 
Галинка ©   (2007-09-18 12:51) [14]

Darvin ©   (18.09.07 12:46) [12]

так вот я потому и спрашивала у homm, можно ли рисовать на выпадающем списке. Есть ли у него вообще канва? Если есть, то решение вполне тривиально.  Делаешь кнопочку, делаешь к ней выпадающее меню с одним итемом. И потом уже в нем рисуешь с опережением "кирпичики" и закрашиваешь их в нужный цвет, оставляя крайние "опережающие" белыми.

Это все можно осуществить, например, и в том случае, если в пункт меню можно поместить PictureBox скажем. И уже на нем рисовать будешь.


 
Darvin ©   (2007-09-18 12:52) [15]

>Галинка ©   (18.09.07 12:51) [14]
спасибо, попробую


 
homm ©   (2007-09-18 12:53) [16]

> [14] Галинка ©   (18.09.07 12:51)
> Есть ли у него вообще канва?

GetDC(HWnd) :)


 
Галинка ©   (2007-09-18 12:54) [17]

Матрица - суть картинка. В которой с опережением дорисовываются клеточки. Что-то вроде проверки:
if (X > picbox.Width - cell.Width)
{
дориосвать еще один столбик
}

И так же для Y.


 
Галинка ©   (2007-09-18 12:56) [18]

homm ©   (18.09.07 12:53) [16]

я в такие дебри пока не вдавалась )) Хотя это скорее для формы. А я вроде про пункт меню. Наверное все же будет легче туда типа PictureBox"а что-то туркнуть... Или хотя бы вросто Image.


 
Darvin ©   (2007-09-18 13:04) [19]

>Галинка ©   (18.09.07 12:51) [14]
Не получается сделать выпадающий список с использованием TollButton или SpeedButton аналогично работе соотв. кнопке ворда или опенофиса


 
Darvin ©   (2007-09-18 13:07) [20]

>Галинка ©   (18.09.07 12:51) [14]
Меню выпадает ТОЛЬКО ПОСЛЕ ОТПУСКАНИЯ кнопки мышки, вызвавшего меню


 
Галинка ©   (2007-09-18 13:08) [21]

в дотнете есть SplitToolButton. По исполнению очень похоже на то, что в опенофисе. Поищи в VCL что-то подобное.


 
Галинка ©   (2007-09-18 13:19) [22]

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


 
Darvin ©   (2007-09-18 13:22) [23]

>Галинка ©   (18.09.07 13:19) [22]
Если мыша не нажата, то окошки выделяются, а изменение размеров окно / грида не происходит. С нажатой кнопкой происходит


 
{RASkov} ©   (2007-09-18 13:32) [24]

> [19] Darvin ©   (18.09.07 13:04)

Попробуй развить вот эту идею:
Брось на форму СпидБатон и ПаинтБокс и пропиши обработчики

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, Buttons;

type
 TForm1 = class(TForm)
   SpeedButton1: TSpeedButton;
   PaintBox1: TPaintBox;
   procedure SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure PaintBox1Paint(Sender: TObject);
   procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormCreate(Sender: TObject);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 DoubleBuffered:=True;
end;

procedure TForm1.SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 PaintBox1.Left:=SpeedButton1.Left;
 PaintBox1.Top:= SpeedButton1.Top+SpeedButton1.Height;
 PaintBox1.Width:=100;
 PaintBox1.Height:=140;
 PaintBox1.Show;
 ReleaseCapture;
end;

procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 PaintBox1.Hide;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var Rc: TRect; C, R, W, H, BDR: Integer; P: TPoint;
begin
 with PaintBox1.Canvas do begin
  Rc:=ClipRect; GetCursorPos(P);
  P:=PaintBox1.ScreenToClient(P);
  W:=PaintBox1.Width div 25;
  H:=PaintBox1.Height div 25;
  DrawEdge(Handle, Rc, BDR_RAISEDOUTER , BF_RECT);
  for C:= 0 to W do
   for R := 0 to H do begin
    Rc.Left:=C*25; Rc.Top:=R*35;
    Rc.Right:=Rc.Left+25; Rc.Bottom:=Rc.Top+35;
    if (C<=(P.X div 25)) and (R<=(P.Y div 35)) then begin
     BDR:=BDR_SUNKENOUTER;
     Brush.Color:=clWhite;
    end else begin
     BDR:=BDR_RAISEDOUTER;
     Brush.Color:=PaintBox1.Color;
    end;
    DrawEdge(Handle, Rc, BDR, BF_RECT);
    InflateRect(Rc, -2, -2);
    FillRect(Rc);
   end;
 end;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if (X>95) then
  if (X>PaintBox1.Width-5) then begin
   PaintBox1.Width:=PaintBox1.Width+25;
   PaintBox1.Invalidate;
  end else if X<PaintBox1.Width-50 then PaintBox1.Width:=PaintBox1.Width-25;
 if (Y>135) then
  if (Y>PaintBox1.Height-5) then begin
   PaintBox1.Height:=PaintBox1.Height+35;
  end else if Y<PaintBox1.Height-70 then PaintBox1.Height:=PaintBox1.Height-35;
 PaintBox1.Invalidate;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 SpeedButton1.Perform(WM_LBUTTONUP, 0, 0);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 SpeedButton1.Perform(WM_LBUTTONUP, 0, 0);
end;

end.

Код кривой.... так для раздумия, что StringGrid(или нечто другое как обычно любят) не для этих целей :)


 
Галинка ©   (2007-09-18 13:32) [25]

в опене и с не нажатой все прекрасно меняется.


 
{RASkov} ©   (2007-09-18 13:34) [26]

> Попробуй развить вот эту идею:

Хм... Пока писал код эту идею уже предложили :)


 
{RASkov} ©   (2007-09-18 13:38) [27]

> procedure TForm1.PaintBox1Paint(Sender: TObject);
> var Rc: TRect; C, R, W, H, BDR: Integer; P: TPoint;
> begin
......
>  W:=PaintBox1.Width div 25;
>  H:=PaintBox1.Height div 25;!

Правильно должно быть 35 Т.е.
H:=PaintBox1.Height div 35;
Впрочем там есть и еще ошибки, но я не код а идею хотел показать....


 
Darvin ©   (2007-09-18 13:52) [28]

>{RASkov} ©   (18.09.07 13:38) [24]
Сделал после создания формы, как у тебя в примере:

Form1.Grid.Perform(WM_LBUTTONDOWN, 0, 0);
и заработало :-)
Но кнопка, по нажатии которой вызывается форма TSpeedButton остается нажатой. Делаю так:
 Button1.Perform ( WM_LBUTTONUP, 0, 0 );
 Form1.Grid.Perform(WM_LBUTTONDOWN, 0, 0);

все равно нажатая!
Вопрос:
Какие сообщения надо посылаются кнопке при отпускании кнопки мышки?


 
DVM ©   (2007-09-18 15:29) [29]


> Какие сообщения надо посылаются кнопке при отпускании кнопки
> мышки?

TSpeedButton никакие сообщения не могут посылаться, т.к. она не окно


 
homm ©   (2007-09-18 15:31) [30]

> [29] DVM ©   (18.09.07 15:29)
> TSpeedButton никакие сообщения не могут посылаться, т.к.
> она не окно

CM_ вякие же посылаются вроде


 
DVM ©   (2007-09-18 15:36) [31]


> CM_ вякие же посылаются вроде

он то WM_XXX посылать пытается

А CM_XXX это другое совсем. Да и обрабатываются они не оконной процедурой TSpeedButton, тем более, что у нее ее нет.



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

Текущий архив: 2007.12.09;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.023 c
15-1194465471
Jolik
2007-11-07 22:57
2007.12.09
Макроязык как в 1С:Бухгалтерии...


15-1194896394
Tracy Hide
2007-11-12 22:39
2007.12.09
Касательно ИИ


2-1195122648
San1
2007-11-15 13:30
2007.12.09
как избавиться от зависания


3-1185952264
dimaL
2007-08-01 11:11
2007.12.09
Хранимые процедуры Interbase


2-1194847526
Sergl
2007-11-12 09:05
2007.12.09
Проблемка с отчетами QuickReport