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

Вниз

помогите пожалуйста написать программу в Delphi   Найти похожие ветки 

 
chery ©   (2009-12-23 12:16) [40]

ну что может у кого нибудь появились мысли как сохранит положение тулбара кода он не на контроле и выглядит как отдельное окно? Просто у меня уже ничего не получается)))=


 
StriderMan ©   (2009-12-23 12:16) [41]

Че-то у меня кончились идеи как программно стащить ToolBar в свободное плавание, кроме как сгенерить цепочку сообщений, эмулирующих стаскивание мышью :D


 
chery ©   (2009-12-23 12:17) [42]


> В Мурманске не все пиво фиговое. Я б даж сказал, получше,
>  чем в Питере.

у нас пиво с местной пивоварни(пилегрим) просто шикарное((=


 
chery ©   (2009-12-23 12:18) [43]


> Че-то у меня кончились идеи как программно стащить ToolBar
> в свободное плавание, кроме как сгенерить цепочку сообщений,
>  эмулирующих стаскивание мышью :D

вот и я не знаю как в программе описать "стаскивание" тулбара.


 
StriderMan ©   (2009-12-23 12:18) [44]


> chery ©   (23.12.09 12:16) [40]

Проблема не в сохранении и загрузке, а в том как сделать программно тулбар "плавающим". Че-то я туплю. Мастера, ау!


 
chery ©   (2009-12-23 12:23) [45]


>  Мастера, ау!

у меня такое подозрение, что мастера либо спят еще, либо уже трудятся на работе(=


 
Anatoly Podgoretsky ©   (2009-12-23 13:19) [46]

> Petr V. Abramov  (23.12.2009 00:57:29)  [29]

Раз подписался, то читай.


 
chery ©   (2009-12-23 13:27) [47]


> Раз подписался, то читай

(=


 
MacroDenS ©   (2009-12-23 14:55) [48]

chery © посмотри может здесь что полезного найдешь http://www.delphi3000.com/articles/article_1010.asp?SK=
правда там на инглише


 
Ega23 ©   (2009-12-23 15:06) [49]

А как вы вообще ToolBar таскаете? Стандартный с вкладки Win32 я так и не смог сдвинуть никуда (Delphi 2007).


 
MacroDenS ©   (2009-12-23 15:09) [50]

А как вы вообще ToolBar таскаете?
выставь в инспекторе объекта:
DragKind = dkDock
DragMode = dmAutomatic


 
Ega23 ©   (2009-12-23 15:28) [51]

Что-то мне подсказывает, что нужно вдумчиво это дело просмотреть

procedure TToolBar.WndProc(var Message: TMessage);
var
 Control: TControl;
 CapControl: TControl;
 Msg: TMsg;

 function IsToolButtonMouseMsg(var Message: TWMMouse): Boolean;
 begin
   if GetCapture = Handle then
   begin
     CapControl := GetCaptureControl;
     if (CapControl <> nil) and (CapControl.Parent <> Self) then
       CapControl := nil;
   end
   else
     CapControl := nil;
   Control := ControlAtPos(SmallPointToPoint(Message.Pos), False);
   Result := (Control <> nil) and (Control is TToolButton) and
     not Control.Dragging;
 end;

 procedure SendDropdownMsg(Button: TToolButton);
 var
   Msg: TNMToolBar;
 begin
   FillChar(Msg, SizeOf(Msg), 0);
   with Msg, hdr do
   begin
     hwndFrom := Handle;
     idFrom := Handle;
     code := TBN_DROPDOWN;
     iItem := Button.Index;
   end;
   SendMessage(Handle, WM_NOTIFY, Handle, Longint(@Msg));
 end;

begin
 if not (csDesigning in ComponentState) then
 begin
   case Message.Msg of
     WM_MOUSEMOVE:
       begin
         { Call default wndproc to get buttons to repaint when Flat = True. }
         if IsToolButtonMouseMsg(TWMMouse(Message)) then
         begin
           { Prevent painting of flat buttons when they are dock clients }
           if TControlAccess(Control).DragMode <> dmAutomatic then
             DefaultHandler(Message);
         end
         else
           DefaultHandler(Message);
       end;
     WM_LBUTTONUP:
       { Update button states after a click. }
       if IsToolButtonMouseMsg(TWMMouse(Message)) then
       begin
         DefaultHandler(Message);
         if (CapControl = Control) or (Control is TToolButton) then
         begin
           with TToolButton(Control) do
             if Down and Grouped and AllowAllUp and (Style = tbsCheck) then
               Down := False;
           UpdateButtonStates;
         end
         else if (CapControl is TToolButton) or (TToolButton(Control).Style = tbsDropDown) then
           Exit;
       end;
     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
       if IsToolButtonMouseMsg(TWMMouse(Message)) then
       begin
         { Check if mouse is clicked on a drop-down button"s arrow (for IE4+
           the arrow is within 13 pixels from the right, for IE3 there is no
           distinction - the entire button is used).  If an arrow click is
           detected then don"t process this mouse event - a TBN_DROPDOWN
           notification will be created for us by the default wndproc. }
         with TToolButton(Control) do
         begin
           { Allow IsControlMouseMsg to deliver message to button.
             This causes the clicking to happen. }
           if FInMenuLoop and Self.MouseCapture then
             MouseCapture := True;
           { When the style is tbsDropDown, and we have IE4+, we need
             to subtract the drop down button width of 14 pixels, otherwise
             it will cause the drop down menu to "stick" down }
           if (Style <> tbsDropDown) or
              (GetComCtlVersion >= ComCtlVersionIE4) and
              (TWMMouse(Message).XPos < Left + Width - 14) then
             inherited WndProc(Message);
         end;
         if not Control.Dragging then
           DefaultHandler(Message);

         if (TToolButton(Control).Style <> tbsDropDown) and
           ((TToolButton(Control).DropdownMenu <> nil) or
           (TToolButton(Control).MenuItem <> nil)) then
         begin
           try
             SendDropDownMsg(TToolButton(Control));
           finally
             { Here we remove WM_LBUTTONDOWN message sent and instead dispatch
               it as a WM_LBUTTONUP to get a Click fired. }
             Msg.Message := 0;
             if PeekMessage(Msg, Handle, WM_LBUTTONDOWN, WM_LBUTTONDOWN,
               PM_REMOVE) and (Msg.Message = WM_QUIT) then
               PostQuitMessage(Msg.WParam)
             else
             begin
               Message.Msg := WM_LBUTTONUP;
               Dispatch(Message);
             end;
           end;
         end;
         Exit;
       end;
   end
 end;
 inherited WndProc(Message);
end;


и сделать как-то также. В смысле - сообщение послать.


 
chery ©   (2009-12-23 17:32) [52]


> Ega23

посмотрим опробуем, спс(=


 
chery ©   (2009-12-23 17:34) [53]


> посмотри может здесь что полезного найдешь http://www.delphi3000.
> com/articles/article_1010.asp?SK=правда там на инглише

на первый взгляд что то есть, жаль все на англ., а у меня с ним не очень(=


 
chery ©   (2009-12-23 17:37) [54]


> А как вы вообще ToolBar таскаете?

MacroDenS прав просто выбираешь тулбар и в свойствах ставишь DragKind = dkDock


 
chery ©   (2009-12-23 20:47) [55]


> StriderMan ©   (23.12.09 12:16) [41]
> Че-то у меня кончились идеи как программно стащить ToolBar
> в свободное плавание, кроме как сгенерить цепочку сообщений,
>  эмулирующих стаскивание мышью :D

Есть идея:ввести переменную, если он на форме то она единица и координаты из памяти не грузятся. Если нет - то она равна нулю и приходится подгружать координаты из памяти, чтобы определить положение в пространстве экрана.


 
Ega23 ©   (2009-12-23 21:13) [56]


> Есть идея:ввести переменную, если он на форме то она единица
> и координаты из памяти не грузятся. Если нет - то она равна
> нулю и приходится подгружать координаты из памяти, чтобы
> определить положение в пространстве экрана.


Эта переменная у тебя уже есть, называется ToolBar1.Parent


 
Kyn66 ©   (2009-12-23 21:49) [57]


> chery ©   (22.12.09 23:57) [13]
> Вот вариант данной работы  http://depositfiles.com/files/xpc2ma774


А ты круто придумал, исходник для задания вопроса на депозит выкладывать. Сам то понял чего сделал? Или решил что сейчас все ломанутся его оттуда выкачивать? :)


 
chery ©   (2009-12-23 21:50) [58]


> Kyn66

ок скажи мне куда залить.


 
Ega23 ©   (2009-12-23 22:11) [59]


> ок скажи мне куда залить.


А он никому не нужен. Ты уже указал проблему.


 
chery ©   (2009-12-23 22:15) [60]


> А он никому не нужен.

просто подумал что может комуто интересно будет посмотреть программу.


 
Petr V. Abramov ©   (2009-12-23 23:09) [61]


> просто подумал что может комуто интересно будет посмотреть
> программу.

"программы" всем своей хватает, не работает нифига в полнолуние.


 
Ega23 ©   (2009-12-23 23:36) [62]


> просто подумал что может комуто интересно будет посмотреть
> программу.


Всю - увольте-с. это за деньги.
А вот вопрос ты задал интересный. В плане как ToolBar в отдельном окошке вывести. И это уже не за деньги, а за личный интерес. :)


 
Petr V. Abramov ©   (2009-12-23 23:45) [63]


> Ega23 ©   (23.12.09 23:36) [62]


> В плане как ToolBar в отдельном окошке вывести.

вопрос-то был как координаты сохранить, ась? :)


 
Ega23 ©   (2009-12-23 23:54) [64]


> вопрос-то был как координаты сохранить, ась? :)


ты снчала его принудительно в отдельное окно выведи...


 
Ega23 ©   (2009-12-23 23:59) [65]

С координатами-то всё просто:

procedure TForm1.Button3Click(Sender: TObject);
var
 tdf : TToolDockForm;
begin
 if not (tb1.Parent is TToolDockForm) then Exit;
 tdf := TToolDockForm(tb1.Parent);
 Label1.Caption := "left : " + IntToStr(tdf.Left) + "; top : " + IntToStr(tdf.Top);
end;


 
Petr V. Abramov ©   (2009-12-24 00:00) [66]


> Ega23 ©   (23.12.09 23:54) [64]
>
>

э. да. в основную :)


 
Ega23 ©   (2009-12-24 00:26) [67]

Короче - сделал. Автор, с тебя пиво.

procedure TForm1.Button4Click(Sender: TObject);
begin
 tb1.ControlState :=  tb1.ControlState + [csLButtonDown];
 tb1.BeginDrag(True, 5);
 tb1.EndDrag(True);
 TToolDockForm(tb1.Parent).Left := 100;
 TToolDockForm(tb1.Parent).Top := 100;
end;


 
Petr V. Abramov ©   (2009-12-24 00:37) [68]


> Ega23 ©   (24.12.09 00:26) [67]
смотрел  обсуждение. тут явно не пиво, а минимум банька, хрен с ним в Мурманске, но чтоб в Белое Море кунуться и свежей красной рыбкой заесть.
:)


 
Petr V. Abramov ©   (2009-12-24 00:47) [69]


> красной рыбкой заесть.

и чтоб не на базаре купленной, а тута пойманной, фиг c ним, пока мы в бане :)


 
Ega23 ©   (2009-12-24 00:49) [70]

Петрович, щас наступишь.


 
KilkennyCat ©   (2009-12-24 00:54) [71]


> Petr V. Abramov ©   (24.12.09 00:37) [68]

В Баренцево, а не Белое


 
chery ©   (2009-12-24 01:09) [72]


> Короче - сделал. Автор, с тебя пиво.procedure TForm1.Button4Click(Sender:
>  TObject);begin  tb1.ControlState :=  tb1.ControlState +
> [csLButtonDown];  tb1.BeginDrag(True, 5);  tb1.EndDrag(True);
>   TToolDockForm(tb1.Parent).Left := 100;  TToolDockForm(tb1.
> Parent).Top := 100;end;

это круто одна просьба объясни плз мне подоходчивее как долбоюзеру(=


 
Ega23 ©   (2009-12-24 01:17) [73]


> это круто одна просьба объясни плз мне подоходчивее как
> долбоюзеру(=


Имитация Drag"n"Drop с последующим переносом получившейся ToolDocForm в нужное место.

З.Ы. Код небезопасный. Надо ставить все проверки (DragKind = ..., DragMode = ..., if (toolBar.Parent is TToolDocForm)) и т.п. Но это уже тебе в качестве самостоятельного упражнения.
З.З.Ы. А совсем хорошо будет, если ты залезешь в код TToolBar.WndProc и очень внимательно по нему пройдёшься, со всеми inherited вызовами. Но это уже для тебя на пять с плюсом.


 
chery ©   (2009-12-24 01:17) [74]

проблема с программным выводом тула с контрола понятна, но проблема сохранения так и не решилаь(=


 
Ega23 ©   (2009-12-24 01:20) [75]


> проблема с программным выводом тула с контрола понятна,
> но проблема сохранения так и не решилаь(=


Что конкретно непонятно?

Впрочем, полюбому это уже утром, пора баиньки.


 
chery ©   (2009-12-24 01:23) [76]


> пора баиньки

это точно.

> Что конкретно непонятно

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


 
chery ©   (2009-12-24 01:24) [77]

увы наверно я слишком туп )))=


 
chery ©   (2009-12-24 01:31) [78]

ладно всем спокойной ночи


 
MacroDenS ©   (2009-12-24 09:34) [79]

Дабы с выносом Tollbar"а в отдельное окно разобрались (Спасибо Ega23 © )

Вот что тебе нужно для сохранения:

сохраняем 3 значения
1. Left:Integer;
2. Top:Integer;
3. isToolForm:Boolean; флаг ToolBar"а (в окне или нет)

дополнительные переменные:
Buffer:array[0..255] of Char;

Перед сохранением выесняешь в каком состоянии находится ToolBar
GetClassName(ToolBar1.parent.Handle, Buffer, 255);
если String[Buffer]="TToolDockForm" - значит ToolBar в окне
Left:=TToolDockForm(toolbar1.Parent).Left;
Top:=TToolDockForm(toolbar1.Parent).Top;
isToolForm:=True;
если не в окне, то
Left:=Toolbar1.Left;
Top:=Toolbar1.Top;
isToolForm:=false;

При загрузке параметров ориентируйся на флаг isToolForm
если True, то как описал Ega23 ©
только вместо статических значений присваиваешь сохраненные,
если False то просто присваиваешь значения ToolBar1.left/top.
Думаю для написания кода вполне достаточно


 
Kyn66 ©   (2009-12-24 09:40) [80]


> chery ©   (23.12.09 21:50) [58]
> > Kyn66ок скажи мне куда залить.

Обычно, на форуме задается вопрос и здесь же выкладывается чать кода, в котором закралась непонятка.(А про всякие там депозиты с лететбитами забудь)



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

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

Наверх




Память: 0.65 MB
Время: 0.016 c
4-1230196376
OlegNik
2008-12-25 12:12
2010.03.14
CreateFile


2-1262902311
dis12345
2010-01-08 01:11
2010.03.14
скрыть панель задач


8-1203602841
MBo
2008-02-21 17:07
2010.03.14
Демонстрация наклона


2-1263309374
Евгений Р.
2010-01-12 18:16
2010.03.14
Работа с tAdoQuery


2-1263452790
TRSteep
2010-01-14 10:06
2010.03.14
ValueListEditor - как пользоваться