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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.042 c
1-1189520493
VovaL
2007-09-11 18:21
2007.12.09
Как расширить компоненту диалога?


2-1195070123
olegusis
2007-11-14 22:55
2007.12.09
ICO #2


2-1194334476
Dmitriy O...
2007-11-06 10:34
2007.12.09
Как загрузить список всех текстовых файлов в комбобокс из какой


15-1194481742
Riply
2007-11-08 03:29
2007.12.09
Отрицательные стороны рекурсии.


15-1194604829
Cerberus
2007-11-09 13:40
2007.12.09
Удаленное ведение проекта.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский