Форум: "Прочее";
Текущий архив: 2010.03.14;
Скачать: [xml.tar.bz2];
Внизпомогите пожалуйста написать программу в 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;
Скачать: [xml.tar.bz2];
Память: 0.63 MB
Время: 0.009 c