Текущий архив: 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.53 MB
Время: 0.039 c