Форум: "Начинающим";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];
ВнизДвойной клик по заголовку формы Найти похожие ветки
← →
Alexey (2011-11-30 22:42) [0]Добрый вечер!
Подскажите, пожалуйста, форма имеет стиль bsSingle, иконка biMaximaze запрещена, окно распахнуто на весь экран.
НО, при двойном клике на заголовке формы она восстанавливает свой размер, и, соответственно, обратно не разворачивается.
Вопрос - как запретить такой двойной клик?
Заранее спасибо!
← →
sniknik © (2011-11-30 23:23) [1]> она восстанавливает свой размер
не восстанавливает
> Вопрос - как запретить такой двойной клик?
не мешать в кучу VCL и WinApi, особенно если не знаешь ни того ни другого.
← →
Alexey (2011-11-30 23:37) [2]> не мешать в кучу VCL и WinApi, особенно если не знаешь ни того ни другого.
Я ничего не мешал, просто задал вопрос...
← →
sniknik © (2011-11-30 23:44) [3]не мешал, значит все работает.
← →
Ega23 © (2011-12-01 00:26) [4]
> Вопрос - как запретить такой двойной клик?
Обработать WM_NCLBUTTONDBLCLK
← →
Германн © (2011-12-01 01:29) [5]
> Подскажите, пожалуйста, форма имеет стиль bsSingle, иконка
> biMaximaze запрещена, окно распахнуто на весь экран.
>
> НО, при двойном клике на заголовке формы она восстанавливает
> свой размер, и, соответственно, обратно не разворачивается.
>
>
> Вопрос - как запретить такой двойной клик?
>
http://www.gunsmoker.ru/2008/10/x-y-z.html
Форма работает в полном соответствии с тем, какие свойства ей ты задал.
<offtop>
А Олежке я бы тоже посоветовал перечитать сию сагу.
</offtop>
← →
Alexey (2011-12-01 06:16) [6]Всем спасибо, тему можно закрывать
← →
Anatoly Podgoretsky © (2011-12-01 09:54) [7]> Alexey (30.11.2011 22:42:00) [0]
Запретил biMaximaze и теперь возмущаешься, хорошо, что хоть система
исправила неверно созданое окно при первом двойном клике
← →
sniknik © (2011-12-01 10:26) [8]> Запретил biMaximaze
запретил, и тут же программно его таким сделал. ... далее по тексту.
+1
← →
Anatoly Podgoretsky © (2011-12-01 12:07) [9]> sniknik (01.12.2011 10:26:08) [8]
Далее дважды щелкнул и система все исправила, и больше гадость не дает
делать.
← →
Alexey (2011-12-01 20:52) [10]Господа, я переформулирую вопрос, понял, что не правильно его задал - мне нужно, чтобы при двойном клике форма не восстанавливала свой размер.
Даже еще проще напишу - мне нужно чтобы форма была распахнута на весь экран всегда, имела заголовок и кнопку "свернуть" и при двойном клике на заголовке ничего не происходило.
Подскажите, пожалуйста, если такое возможно, то как сделать?
Спасибо!
← →
sniknik © (2011-12-01 21:37) [11]в дизайне у формы выставить WindowState = wsMaximized и BorderIcons = [biSystemMenu,biMinimize] и все. стиль оставит bsSizeable как есть по умолчанию.
← →
sniknik © (2011-12-01 21:42) [12]ха. сори, вот так действительно не работает. у меня стоял пустой обработчик от вчерашнего...
Ega23 © (01.12.11 00:26) [4]
> Обработать WM_NCLBUTTONDBLCLK
← →
Alexey (2011-12-01 22:39) [13]>ха. сори, вот так действительно не работает. у меня стоял пустой обработчик от >вчерашнего...
>Ega23 © (01.12.11 00:26) [4]
>> Обработать WM_NCLBUTTONDBLCLK
Я не знаю, правильное ли это решение, но сделал так же и, собственно, добился того, чего хотел)
Так что спасибо за помощь, в итоге-то получилось.
Правда, если это решение не правильное и есть правильное решение - буду рад его узнать.
Спасибо!
← →
Германн © (2011-12-02 01:03) [14]
> Правда, если это решение не правильное и есть правильное
> решение - буду рад его узнать.
Для нестандартных вопросов/задач "правильных решений", как правило, не существует.
← →
Ega23 © (2011-12-02 01:37) [15]
> А Олежке я бы тоже посоветовал перечитать сию сагу.
Олежка когда-то давно поимел проблем с этим делом. Чтобы форма была не диалогом, но при этом максимайзд и не изменялась по дабл-клику. Так что он (Олежка) залез в древний код и вспомнил, как оно делалось.
Хотя он (Олежка) до сих пор не уверен, что это было действительно правильное и грамотное решение.
← →
Омлет © (2011-12-02 09:56) [16]Такие формы - архитектурная (интерфейсная) ошибка.
← →
OW © (2011-12-02 10:04) [17]от магических чисел избавится по справочнику сообщений
public { Public declarations }
procedure DefaultHandler(var Message); override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.DefaultHandler(var Message);
begin
if TMessage(Message).Msg = 274 then
begin
if TMessage(Message).WParam = 61730 then
begin
mmo1.Lines.Add(IntToStr(TMessage(Message).WParam));
mmo1.Lines.Add(IntToStr(TMessage(Message).LParam));
end else
inherited;
end else
inherited;
end;
← →
Омлет © (2011-12-02 10:15) [18]> if TMessage(Message).Msg = 274 then
> begin
> if TMessage(Message).WParam = 61730 then
> begin
> mmo1.Lines.Add(IntToStr(TMessage(Message).WParam));
> mmo1.Lines.Add(IntToStr(TMessage(Message).LParam));
> end else
> inherited;
> end else
> inherited;
Некрасиво.
← →
OW © (2011-12-02 10:40) [19]
> Омлет © (02.12.11 10:15) [18]
ну не знаю,
у меня DefaultHandler обычно работает на полную катушку(по моим, прикладным делам), воткнуть туда еще одну проверку - вполне вариант
if TMessage(Message).Msg = КАКТО_SYSCOMMAND
and TMessage(Message).WParam = КАК_ТО_КESTORE then
съесть сообщение else
inherited
← →
OW © (2011-12-02 11:31) [20]
> у меня DefaultHandler обычно работает на полную катушку(по
> моим, прикладным делам)
Буду толкать эту мысль еще раз
(а что делать, система закрыта на перерасчет, программисты у нас сегодня курят:) )
в DefaultHandler конструкция
if TMessage(Message).Msg = XXX then
дает очень много.
объявив где то в отдельном модуле
TAgent = record
ID_AGENT: int64;
AName: string;
AComment: string;
Alias: string;
end;
TContract = record
IdContract: Integer;
CNumber: string;
DateBegin: TDateTime;
DateEnd: TDateTime;
Agent: TAgent;
Subject: TSubjectFor; // еще что-то еще можно, не важно
end;
и
TMsgContract = packed record
Msg: LongInt;
Contract: TContract;
end;
а так же имея
Const
ESBD_BASIC = WM_USER + $200;
..
ESBD_SELECT_CONTRACT = ESBD_BASIC + $90;
..
ESBD_LAST = ESBD_BASIC + $FF;
пишем например
procedure TMainForm.DefaultHandler(var Message);
var
i:Integer;
begin
if (TMessage(Message).Msg >= ESBD_BASIC)
and (TMessage(Message).Msg <= ESBD_LAST) then
begin
case TMessage(Message).Msg of
// это только для меня
ESBD_SEND_HANDLE_PLUGIN : InitPlugin(TMsgPluginInfo(Message).P);
ESBD_REBUILDBUTTON: ReBuildButton(nil);
ESBD_SUBJECT_REMOVE_FROM_MEMORY: RemoveSubjectFromMemory(TMSGSubjectRemoveFromMemory(Message).Subject.ID);
ESBD_BRANCH_REMOVE_FROM_MEMORY : RemoveBranchFromMemory(TMSGBranchRemoveFromMemory(Message).Branch.ID);
ESBD_LOGIN_USER: ReLoginUser(TMsgLoginUser(Message).UserID);
else
// а это для всех
begin
// эти и для меня тоже
if TMessage(Message).Msg = ESBD_SUBJECT_FOR_EDIT then
begin
if not(TMSGSubjectForEdit(Message).Subject.IsNew) then
AddSubjectToBuffer(TMSGSubjectForEdit(Message).Subject.ID);
end;
if TMessage(Message).Msg = ESBD_FILIAL_CHANGE then
begin
FilialChange(TFilialChangeMSG(Message).Filial);
end;
// остальные не знаю, но всем разошлю
for i := 0 to MainForm.MDIChildCount - 1 do MainForm.MDIChildren[i].Dispatch(Message);
end;
end;
end else
inherited;
теперь, любое окно, что-то сделав, может сказать главному
procedure TfrmContract.Select(Sender: TObject);
var
Msg: TMsgContract;
begin
MSG.Msg := ESBD_SELECT_CONTRACT;
Msg.Contract.IdContract := oqBase.FieldByName("ID_CONTRACT").AsInteger;
Msg.Contract.CNumber := oqBase.FieldByName("CNUMBER").AsString;
Msg.Contract.DateBegin := oqBase.FieldByName("DATE_BEGIN").AsDateTime;
Msg.Contract.DateEnd := oqBase.FieldByName("DATE_END").AsDateTime;
Msg.Contract.Agent.ID_AGENT := oqBase.FieldByName("ID_AGENT").AsInteger;
Msg.Contract.Agent.AName := oqBase.FieldByName("ANAME").AsString;
Msg.Contract.Subject.ID := oqBase.FieldByName("ID_SUBJECT").AsInteger;
Msg.Contract.Subject.Name := oqBase.FieldByName("SNAME").AsString;
MainForm.Dispatch(MSG);
И все окна (приложения (и не только, если надо)) получат это сообщение, а кто из них заинтересован в смене юзером текущего контракта, могут рефрешнуть свои данные, породить иные сообщения, послав их в MainForm, что бы отреагировали на них иные.
главное окно, не зная сообщений, все равно их рассылает.
остальные окна , не зная сообщений, все равно их принимают и игнорируют(ну, раз не знают как реагировать).
В любой момент в соотв. DefaultHandler любого окна просто вставляем реакцию на имеющиеся в хождении в программе сообщения, и окно реагирует на эти эээ.. "публичные" действия всех участников процесса :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.003 c