Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
procedureEndScreenUpdate(hwnd : THandle; erase : Boolean);
begin
if(hwnd = 0) thenhwnd := Application.MainForm.Handle;
SendMessage(hwnd, WM_SETREDRAW, 1, 0);
RedrawWindow(hwnd, nil, 0, DW_FRAME + RDW_INVALIDATE + RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);
if(erase) thenWindows.InvalidateRect(hwnd, nil, True);
end;
– Jeff Johnson
Минимизация модального окна
Мне нужно открыть из моей формы модальное окно, т.е. приостановить работу в моей форме до обработки этого модального окна. Но при этом я теряю возможность убрать (минимизировать) мою форму
Nomadicсоветует:
functionTMyForm.Execute: TModalResult;
begin
Show;
try
SendMessage(Handle, CM_ACTIVATE, 0, 0);
ModalResult := 0;
repeat
Application.HandleMessage;
ifApplication.Terminated thenModalResult := mrCancel;
ifModalResult = mrCancel thenCloseModal;
untilModalResult <> 0;
Hide;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
finally
Hide;
end;
end;
Конечно, в TMyForm должно быть FormStyle := fsStayOnTop;
Прозрачная форма
Dmitry V. Koreybaсоветует:
Высылаю прогу которая делает прозрачной форму. Может кому-нибудь поможет в его дизайнерских изысканиях.
var FullRgn, ClientRgn, CtlRgn : THandle;
procedureTForm1.DoInvisible;
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
begin
Margin := (Width - ClientWidth) div2;
FullRgn := CreateRectRgn(0, 0, Width, Height);
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
forA := 0 toControlCount - 1 do begin
AControl := Controls[A];
if(AControl isTWinControl) or(AControl isTGraphicControl) then
withAControl do begin
ifVisible then begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
end;
end;
end;
SetWindowRgn(Handle, FullRgn, TRUE);
end;
procedureTForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(ClientRgn);DeleteObject(FullRgn);
DeleteObject(CtlRgn);
end;
procedureTForm1.DoVisible;
begin
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
SetWindowRgn(Handle, FullRgn, TRUE);
end;
procedureTForm1.FormCreate(Sender: TObject);
begin
DoInvisible;
end;
Каким образом можно изменить системное меню формы?
Nomadicсоветует:
Hе знаю как насчет акселераторов,надо поискать, а вот добавить пункт меню(Item) — пожалуйста
typeTMyForm= class(TForm)
procedurewmSysCommand( var Message:TMessage); messageWM_SYSCOMMAND;
end;
const
ID_ABOUT = WM_USER+1;
ID_CALENDAR=WM_USER+2;
ID_EDIT = WM_USER+3;
ID_ANALIS = WM_USER+4;
implementation
procedureTMyForm.wmSysCommand;
begin
caseMessage.wParam of
ID_CALENDAR:DatBitBtnClick(Self);
ID_EDIT :EditBitBtnClick(Self);
ID_ANALIS:AnalisButtonClick(Self);
end;
inherited;
end;
procedureTMyForm.FormCreate(Sender: TObject);
varSysMenu:THandle;
begin
SysMenu:=GetSystemMenu(Handle,False);
InsertMenu(SysMenu, Word(-1), MF_SEPARATOR, ID_ABOUT, '');
InsertMenu(SysMenu, Word(-1), MF_BYPOSITION, ID_Calendar, 'Calendar');
InsertMenu(SysMenu, Word(-1), MF_BYPOSITION, ID_Analis, 'Analis');
InsertMenu(SysMenu, Word(-1), MF_BYPOSITION, ID_Edit, 'Edit');
end;
Как сделать MDI-приложение, в котором способны сливаться не только меню дочернего и главного окна, но и полосы инструментов?
Nomadicсоветует:
procedureTMainForm.SetBands(AControls: array ofTWinControl;ABreaks: array ofboolean);
vari: integer;
begin
withCoolBar do begin
fori:=0 toHigh(AControls) do begin
ifBands.Count=succ(i) thenTCoolBand.Create(Bands);
withBands[succ(i)] do begin
ifAssigned(Control) thenControl.Hide;
MinHeight:=AControls[i].Height;
Break:=ABreaks[i];
Control:=AControls[i];
Control.Show;
Visible:=true;
end
end;
fori:=High(AControls)+2 topred(Bands.Count) do Bands[i].Free
end
end;
и
procedureTMsgForm.FormActivate(Sender: TObject);
begin
MainForm.SetBands([ToolBar],[false])
end;
Примечание:
Оба массива равны по длине. CoolBar.Bands[0] должен существовать всегда,.. на нём я размешаю «глобальные» кнопки. СoolBar[1] тоже можно сделать в DesignTime с Break:=false и придвинуть поближе с началу. При CoolBar.AutoSize:=true возможно «мигании» (при добавлении на новую строку) так что можно добавить:
AutoSize:=false; try … finallyAutoSize:=true;
TMainForm
…
objectSpeedBar: TPanel
...
Align = alTop
BevelOuter = bvNone
objectToolBar: TPanel
...
Align = alLeft
BevelOuter = bvNone
end
objectRxSplitter1: TRxSplitter
...
ControlFirst = ToolBar
ControlSecond = ChildBar
Align = alLeft
BevelOuter = bvLowered
end
objectChildBar: TPanel
...
Align = alClient
BevelOuter = bvNone
end
end
TMdiChild {прародитель всех остальных}
..
objectpnToolBar: TPanel
…
Align = alTop
BevelOuter = bvNone
Visible = False
end
end;
procedureTMDIForm.FormActivate(Sender: TObject);
begin
pnToolBar.Parent:=MainForm.ChildBar;
pnToolBar.Visible:=True;
end;
procedureTMDIForm.FormDeactivate(Sender: TObject);
begin
pnToolBar.Visible:=false;
pnToolBar.Parent:=self
{pnToolBar.Visible:=false}
end;
Заполнение изображением MDI-формы IV
Nomadicсоветует:
Я делал так:
type
…. = class(TForm)
....
procedureFormCreate(Sender:TObject);
procedureFormDestroy(Sender:TObject);
....
private
FHBrush: HBRUSH;
FCover: TBitmap;
FNewClientInstance: TFarProc;
FOldClientInstance: TFarProc;
procedureNewClientWndProc( var Message:TMessage);
....
protected
....
Интервал:
Закладка: