Валентин Озеров - Советы по 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 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Prev.Enabled:= true;
ifTBPgFrm(Frms[i]).PgInit thenNext.Enabled:= true
elsePrevClick(Sender);
end elseNext.Enabled:= true;
end;
procedureTPagesDlg.PrevClick(Sender: TObject);
begin
Prev.Enabled:= false;
withPageControl1 do begin
ActivePage:= FindNextPage(ActivePage, false, false);
Prev.Enabled:= ActivePage.PageIndex>0;
end;
Next.Caption:= 'Next';
Next.Enabled:= true;
end;
end.
unitUnit3; //наследник с RadioGroup.
interface
uses...
type TBPgFrm3 = class(TBPgFrm)
RadioValid: TRadioGroup;
public
functionPgValid: boolean; override;
end;
implementation
{$R *.DFM}
functionTBPgFrm3.PgValid: boolean;
begin
result:= RadioValid.ItemIndex=0;
end;
end.
unitUnit4; // наследник с CheckBox.
interface
uses...
type TBPgFrm2 = class(TBPgFrm)
CheckValid: TCheckBox;
public
functionPgValid: boolean; override;
end;
implementation
{$R *.DFM}
functionTBPgFrm2.PgValid: boolean;
begin
result:= CheckValid.Checked;
end;
end.
В Delphi 4 появились новые возможности, в частности, возможность докинга визуальных компонент, в частности, форм, на различные DockSite, в том числе и на TPageControl. Это более удобно. Кроме того, Вы имеете возможность использования TFormLoader из библиотеки VG Library.
IMHO файл *.dfm – это компилированный ресурс с определением установок формы. А можно ли как-то увидеть этот ресуpс в исходном виде?
Nomadicсоветует:
1. File|Open… ТвояФорма.DFM – увидишь текст;
2. «Delphi\bin\convert ТвояФорма.DFM» — получится ТвояФорма.TXT (можно и наоборот).
Идею в массы: в DN/VC/NC можно настроить viewer'ом .DFM .BAT'ник, который скажет convert;wpview;del – и заглядывать в .DFM не открывая Delphi.
Кстати, функции, которые реализуют это преобразование, доступны для использования в личных целях :)
CLASSES.PAS:
[…]
{ Object conversion routines }
procedureObjectBinaryToText(Input, Output: TStream);
procedureObjectTextToBinary(Input, Output: TStream);
procedureObjectResourceToText(Input, Output: TStream);
procedureObjectTextToResource(Input, Output: TStream);
Определение перемещения формы
Кто-нибудь знает как мне определить перемещение пользователем главной формы приложения (не изменение ее размеров), кроме как использования таймера и проверки значений свойств Form.Top и Form.Left?
Вам можно воспользоваться обработчиками следующих системных сообщений:
1. WM_WINDOWPOSCHANGING (возникает перед перемещением),
2. WM_WINDOWPOSCHANGED (возникает после перемещения), или
3. WM_MOVE (возникает после перемещения)
– Robert Wittig
Можно ли сделать так – одновременно иметь на экране всегда доступную форму – например, "Навигатор", и, открывая модальные формы, иметь всегда доступ к форме "Навигатор"?
Nomadicсоветует:
Обманом можно все.
procedureShowAlmostModal(FormModal:TForm);
begin
NavigatorForm.Enabled:=false;
FormModal.ShowModal
end;
И вот это привесь на OnShow почти модальной формы
procedureFormShow(Sender:Tobject);
begin
NavigatorForm.Enabled:=true;
end;
Как создать окна непрямоугольной формы и работать с ними?
Nomadicсоветует:
Достаточно создать регион нужной формы и вызвать SetWindowRgn —
HRGN rgn := CreateEllipticRgn(10,10,100,100);
SetWindowRgn(hMyWnd,rgn); // Вот и будет круглое окно
При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна.
Попробуйте вот этот обpаботчик OnCreate : На меня это произвело впечатление.
procedureTForm1.FormCreate(Sender: TObject);
constW=36*pi/180;
var
R,R1,R2: HRgn;
X,Y,i:integer;
functionS(a:integer;R:integer):integer;
begin
Result:=round(R*sin(W*a));
end;
functionC(a:integer;R:integer):integer;
begin
Result:=round(R*cos(W*a));
end;
functionGetStarReg(X,Y,R:integer):HRGN;
varP : array[0..4] ofTPoint;
begin
P[0] := Point(X, Y-R);
P[1] := Point(X-S(4,R), Y-C(4,R));
P[2] := Point(X-S(8,R), Y-C(8,R));
P[3] := Point(X-S(2,R), Y-C(2,R));
P[4] := Point(X-S(6,R), Y-C(6,R));
Result := CreatePolygonRgn(P, 5, WINDING);
end;
begin
X:=Width div2;
Y:=Height div2;
R:=GetStarReg(X,Y,100);
i:=1;
repeat
R1:=GetStarReg(X-S(i,120),Y-C(i,110),40);
CombineRgn(R,R,R1,RGN_OR);
inc(i,2);
untili>9;
R1:=GetStarReg(X,Y,30);
CombineRgn(R,R,R1,RGN_DIFF);
R1:=CreateEllipticRgn(3,3,Width-6,Height-6);
R2:=CreateEllipticRgn(20,10,Width-20,Height-10);
CombineRgn(R1,R1,R2,RGN_DIFF);
CombineRgn(R,R,R1,RGN_OR);
SetWindowRgn(Handle, R, True);
end;
Как запретить кнопку Close [×] в заголовке окна?
Nomadicсоветует:
Вот кусок, который делает все, что тебе нужно:
procedureTForm1.FormCreate(Sender: TObject);
varStyle: Longint;
begin
Style := GetWindowLong(Handle, GWL_STYLE);
SetWindowLong(Handle, GWL_STYLE, Style And NotWS_SYSMENU);
end;
procedureTForm1.FormKeyDown(Sender: TObject; varKey: Word; Shift: TShiftState);
begin
if(Key = VK_F4) and(ssAlt inShift) then begin
MessageBeep(0);
Key := 0;
end;
end;
{ Disable close button }
procedureTForm1.Button1Click(Sender: TObject);
varSysMenu: HMenu;
begin
SysMenu := GetSystemMenu(Handle, False);
Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED orMF_GRAYED);
end;
{ Enable close button }
procedureTForm1.Button2Click(Sender: TObject);
begin
GetSystemMenu(Handle, True);
Perform(WM_NCPAINT, Handle, 0);
end;
Но это окно можно закрыть из TaskBar'а.
Мерцание формы
Как бы это осуществить рисование в окне без его дурацкого мерцания и без помощи создания виртуального изображения в памяти? WM_SETREDRAW здесь поможет?
Попробуйте этот код. Даже если некоторые компоненты имеют пару BeginUpdate / EndUpdate, то для таких компонентов, как TTreeView, интенсивное рисование может послужить причиной перемещения полосы прокрутки и появления других «барабашек». В таких ситуаций вместо дескриптора элемента управления используйте родительский дескриптор.
procedureBeginScreenUpdate(hwnd : THandle);
begin
if(hwnd = 0) thenhwnd := Application.MainForm.Handle;
SendMessage(hwnd, WM_SETREDRAW, 0, 0);
end;
Интервал:
Закладка: