Программирование в Delphi. Барков И.А - 19 стр.

UptoLike

Составители: 

19
имеющий ненулевой контекст.
Оконный компонент может управлять положением и размерами своих дочерних компонентов.
Прокрутку (скроллинг) элементов на интервал DeltaX, DeltaY осуществляет метод:
procedure ScrollBy(DeltaX, DeltaY: Integer);
Прибегая к вызову этой процедуры, можно при желании осуществить прокрутку нестандарт-
ным способом, т. е. без привлечения полос прокрутки. Приведенный ниже фрагмент кодасоставная
часть примера IMGSCROL на дискете позволяет "тащить"
изображение Imagel вслед за мышью с
нажатой кнопкой:
type TMouseState = (msNormal, msDragging);
var OldPos, NewPos, MaxShift: TPoint; PMouseState : TMouseState;
procedure TFormI.ScrollMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integers);
begin
MaxShift.X := Imagel.Parent.Width - Imagel.Width;
MaxShift.Y := Imagel.Parent.Height - Imagel.Height;
if (MaxShift.X > 0) and (MaxShift.Y > 0) then Exit;
FMouseState := msDragging;
OldPos := Point(X, Y) ;
Screen.Cursor := crDrag;
end;
procedure TFormI.ScrollMouseMove(Sender : TObject; Shift: TShiftState; X, Y: Integers);
begin
if FMouseState = msDragging then
begin
NewPos := Point(X - OldPos.X, Y - OldPos.Y) ;
if Imagel.Left + NewPos.X > 0 then NewPos.X := - Imagel.Left;
if Imagel.Left + NewPos.X < MaxShift.X
then NewPos.X := MaxShift.X - Imagel.Left;
if Imagel.Top + NewPos.Y > 0 then NewPos.Y := - Imagel.Top;
if Imagel.Top + NewPos.Y < MaxShift.Y
then NewPos.Y := MaxShift.Y - Imagel.Top;
Imagel.Parent.ScrollBy(NewPos.X, NewPos. Y) ;
end;
end;
procedure TFormI.ScrollMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseState -.= msNormal;
Screen.Cursor := crDefault;
end;
Обратите внимание, что прокрутка неоконного компонента Imagel осуществляется посредством
вызова Image l.Parent.ScrollBy. Это свидетельствует о том, что конкретный родительский тип для этого
безразличен. В примере изображение помещено на панель (TPanel). Впрочем, метод ScrollBy использу-
ется также и полосами прокрутки, которые есть в
компоненте TScrollingWinControl и его потомках, на-
пример, в TForm.
В VCL предусмотрена возможность написания приложений, которые будут сохранять относи-
тельный размер и положение при всех разрешениях дисплея. Более подробно эти механизмы описаны в
разделе, посвященном формам; для TWinControl упомянем лишь метод
procedure ScaleBy(M, D: Integer);
который изменяет масштаб элемента управления в M/D раз, при этом верхний левый угол остается
не-
подвижным. Так же изменяются и размеры всех дочерних элементов. Соответственно изменяется и
масштаб шрифта (свойство Font). Флаги csFixedWidth и csFixedHeight в свойстве ControlStyle предот-
имеющий ненулевой контекст.
       Оконный компонент может управлять положением и размерами своих дочерних компонентов.
       Прокрутку (скроллинг) элементов на интервал DeltaX, DeltaY осуществляет метод:
              procedure ScrollBy(DeltaX, DeltaY: Integer);
       Прибегая к вызову этой процедуры, можно при желании осуществить прокрутку нестандарт-
ным способом, т. е. без привлечения полос прокрутки. Приведенный ниже фрагмент кода — составная
часть примера IMGSCROL на дискете— позволяет "тащить" изображение Imagel вслед за мышью с
нажатой кнопкой:
       type TMouseState = (msNormal, msDragging);
       var OldPos, NewPos, MaxShift: TPoint; PMouseState : TMouseState;
        procedure TFormI.ScrollMouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integers);
        begin
                MaxShift.X := Imagel.Parent.Width - Imagel.Width;
                MaxShift.Y := Imagel.Parent.Height - Imagel.Height;
                if (MaxShift.X > 0) and (MaxShift.Y > 0) then Exit;
                FMouseState := msDragging;
                OldPos := Point(X, Y) ;
                Screen.Cursor := crDrag;
        end;
        procedure TFormI.ScrollMouseMove(Sender : TObject; Shift: TShiftState; X, Y: Integers);
        begin
                if FMouseState = msDragging then
                begin
                         NewPos := Point(X - OldPos.X, Y - OldPos.Y) ;
                         if Imagel.Left + NewPos.X > 0 then NewPos.X := - Imagel.Left;
                         if Imagel.Left + NewPos.X < MaxShift.X
                         then NewPos.X := MaxShift.X - Imagel.Left;
                         if Imagel.Top + NewPos.Y > 0 then NewPos.Y := - Imagel.Top;
                         if Imagel.Top + NewPos.Y < MaxShift.Y
                         then NewPos.Y := MaxShift.Y - Imagel.Top;
                         Imagel.Parent.ScrollBy(NewPos.X, NewPos. Y) ;
                end;
        end;
        procedure TFormI.ScrollMouseUp(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
        begin
                FMouseState -.= msNormal;
                Screen.Cursor := crDefault;
        end;
        Обратите внимание, что прокрутка неоконного компонента Imagel осуществляется посредством
вызова Image l.Parent.ScrollBy. Это свидетельствует о том, что конкретный родительский тип для этого
безразличен. В примере изображение помещено на панель (TPanel). Впрочем, метод ScrollBy использу-
ется также и полосами прокрутки, которые есть в компоненте TScrollingWinControl и его потомках, на-
пример, в TForm.
        В VCL предусмотрена возможность написания приложений, которые будут сохранять относи-
тельный размер и положение при всех разрешениях дисплея. Более подробно эти механизмы описаны в
разделе, посвященном формам; для TWinControl упомянем лишь метод
                procedure ScaleBy(M, D: Integer);
который изменяет масштаб элемента управления в M/D раз, при этом верхний левый угол остается не-
подвижным. Так же изменяются и размеры всех дочерних элементов. Соответственно изменяется и
масштаб шрифта (свойство Font). Флаги csFixedWidth и csFixedHeight в свойстве ControlStyle предот-


                                                     19