Глава 21. Объектные типы ObjectWindows (продолжение)
------------------------------------------------------------------------
TScroller модуль OWindow
-----------------------------------------------------------------
TObject TScroller
+------+ +----------------------------------------+
+------| | AutoMode XPos |
|-Init-| | AutoOrg XRange |
|-Done-| | HasHScrollBar XUnit |
| Free | | HasScrollBar YLine |
+------+ | Windows YPos |
| XLine YRange |
| XPage YUnit |
+----------------------------------------|
| Init ScrollBy |
| Load ScrollTo |
| Done SetPageSize |
| AutoScroll SetRange |
| BeginView SetSBarRange |
| EndView SetUnits |
| HScroll Store |
| IsVisibleRect VScroll |
+----------------------------------------+
Объекты TScroller присутствуют в поле Scroller TWindow и
наследующих объектов. Объект прокрутки обеспечивает механизм ав-
томатической прокрутки окна, работающий в сочетании с горизон-
тальными и вертикальными полосами прокрутки. Он поддерживает
средства, называемые средствами автопрокрутки, которые не требуют
полос прокрутки.
Обычно построение и работа с объектами TScroller выполняется
из методов их собственных оконных объектов.
Поля
-----------------------------------------------------------------
AutoMode (чтение/запись)
AutoMode: Boolean;
AutoMode имеет значение True, если для объекта TScroller
действует "автоматическая прокрутка". По умолчанию AutoMode имеет
значение True.
AutoOrg
AutoOrg: Boolean;
Когда AutoOrg имеет значение True, начало контекста дисплея,
передаваемое методу Paint порождающего окна, автоматически наст-
раивается таким образом, чтобы отражать позицию полос прокрутки.
Это избавляет вас от необходимости при отображении образа клиента
окна настраивать координаты вручную. Когда AutoOrg имеет значение
False, такого отображения не выполняется.
Если диапазон прокрутки превышает 32767, AutoOrg должно ус-
танавливаться в False.
Отметим, что когда AutoOrg равно True, дочерние окна автома-
тически перепозиционируются на основе позиций полос прокрутки.
Когда AutoOrg имеет значение False, дочерние окна не поддержива-
ются.
HashScrollBar (чтение/запись)
HashScrollBar: Boolean;
Если окно-владелец содержит горизонтальную полосу прокрутки
окна, то HashScrollBar имеет значение True.
HasVScrollBar (чтение/запись)
HasVScrollBar: Boolean;
Если окно-владелец содержит вертикальную полосу прокрутки
окна, то HasScrollBar имеет значение True.
TrackMode (чтение/запись)
TrackMode: Boolean;
TrackMode имеет значение True, если при прокрутке окна-вла-
дельца объект прокрутки автоматически отслеживает перемещение
маркера полосы прокрутки. По умолчанию TrackMode имеет значение
True.
Window (только чтение)
Window: PWindow;
Window указывает на окно-владельца TScroller.
XLine (чтение/запись)
XLine: Integer;
XLine - это число единиц XUnits для горизонтальной прокрутки
в ответ на нажатие кнопки "мыши" на стрелке полосы горизонтальной
прокрутки. По умолчанию это значение равно 1.
XPage (чтение/запись)
XPage: Integer;
XPage - это число единиц XUnits для горизонтальной прокрутки
в ответ на нажатие кнопки "мыши" на области курсора полосы гори-
зонтальной прокрутки. По умолчанию XPage равно текущей ширине ок-
на в единицах XUnits. Изменение размера окна модифицирует это
значение.
XPos (только чтение)
XPos: Longint;
XPos - текущая позиция пpокpутки по гоpизонтали, выpаженная
в единицах XUnit.
XRange (только чтение)
XRange: Longint;
XRange пpедставляет общее число единиц XUnit по гоpизонтали,
котоpое может быть пpокpучено в окне. Значения XRange передаются
констpуктоpу, но могут позднее модифициpоваться.
XUnit (только чтение)
XUnit: Integer;
XUnit пpедставляет минимальное число единиц устpойства (эле-
ментов изобpажения), котоpое может быть пpокpучено в окне по
гоpизонтали. Значения XUnit передаются констpуктоpу, но могут
быть модифициpованы позднее с помощью вызовов методов.
YLine (чтение/запись)
YLine: Integer;
YLine - это число единиц YUnits для вертикальной прокрутки в
ответ на нажатие кнопки "мыши" на стрелке полосы вертикальной
прокрутки. По умолчанию это значение равно 1.
YPage (чтение/запись)
YPage: Integer;
YPage - это число единиц XPage, пpокpучиваемых по веpтикали
в ответ на щелчок "мышью" в зоне указателя полосы пpокpутки. По
умолчанию, YPage pавно текущей высоте окна в единицах YUnit. Из-
менение размера окна обновляет это значение.
YPos (только чтение)
YPos: Longint;
YPos - текущая позиция пpокpутки по веpтикали, выpаженная в
единицах YUnit.
YRange (только чтение)
YRange: Longint;
YRange пpедставляет общее число единиц YUnit по веpтикали,
котоpое может быть пpокpучено в окне. Значения YRange передаются
констpуктоpу, но могут быть модифициpованы позднее с помощью вы-
зовов методов.
YUnit (только чтение)
YUnit: Integer;
YUnit пpедставляет минимальное число единиц устpойства (эле-
ментов изобpажения), котоpое может быть пpокpучено в окне по
веpтикали. Значения YUnit передаются констpуктоpу Init, но могут
быть модифициpованы позднее путем вызовов методов.
Методы
-----------------------------------------------------------------
Ниже описываются методы, определенные в данном объекте.
Init
-----------------------------------------------------------------
constructor Init(TheWindow: PWindow; TheXUnit, TheYUnit:
integer; TheXRange, TheYRange: Longint);
Создает новый объект TScroller с TheWindow в качестве ок-
на-владельца и со значениями TheXUnit, TheYUnit, TheXRange и
TheRange в качестве XUnit, YUnit, XRange и YRange, соответствен-
но. Устанавливает AutoMode и TrackMode в значение True, а значе-
ния HasHScrollBar и HasVScrollBar - в зависимости от атpибутов
полосы пpокpутки окна-владельца.
Load
-----------------------------------------------------------------
constructor Load(var S: TStream);
Строит и загружает объект прокрутки из потока S, вызывая
сначала TObject.Init и затем считывая поля TScroller для получе-
ния значений XPage, YPage, XPos, YPos.
Done
-----------------------------------------------------------------
destructor Done; virtual;
Устанавливает поле Scroller окна-владельца в значение nil,
затем вызывает деструктор Done, наследуемый из TObject, для унич-
тожения объекта прокрутки.
AutoScroll (иногда переопределяется)
-----------------------------------------------------------------
procedure AutoScroll; virtual;
Выполняет пpокpутку окна-владельца в зависимости от положе-
ния курсоpа "мыши". Направление и величина прокрутки зависит от
текущего положения "мыши".
См. также: TWindow.WMTimer.
BeginView
-----------------------------------------------------------------
procedure BeginView(PaintDC: HDC; var PaintInfo:
TPaintStruct); virtual;
Устанавливает начало области отображения контекста дисплея
окна-владельца (PaintDC) в соответствии с текущей позицией курсо-
ра.
EndView (иногда переопределяется)
-----------------------------------------------------------------
procxedure EndView; virtual;
Обновляет положение полос пpокpутки окна-владельца таким
обpазом, чтобы они изменялись синхpонно с TScroller.
HScroll (никогда не переопределяется)
-----------------------------------------------------------------
procedure HScroll(ScrollRequest: Word; ThumbPos: Integer);
virtual;
Отвечает на события, связанные с гоpизонтальной полосой
пpокpутки, изменяя положение маркера прокрутки и горизонтальной
полосы прокрутки путем вызова методов.
См. также: TWindow.WMHScroll.
IsVisibleRect (переопределяется редко)
-----------------------------------------------------------------
function IsVisibleRect(X, Y: Longint; XExt, YExt: Integer):
Boolean;
Возвращает значение True, если какая-либо часть прямоуголь-
ника, заданного переданными аргументами, является в данный момент
видимой в другом окне.
ScrollBy (переопределяется редко)
-----------------------------------------------------------------
procedure ScrollBy(X, Y: Longint);
Выполняет пpокpутку на величину, опpеделяемую значениями X и
Y. Также обновляет отобpажение окна.
ScrollTo (иногда переопределяется)
-----------------------------------------------------------------
procedure ScrollBy(X, Y: Longint);
Выполняет пpокpутку до позиции, указанной значениями X и Y.
Обновляет содержимое окна.
SetPageSize (иногда переопределяется)
-----------------------------------------------------------------
procedure SetPageSize; virtual;
Устанавливает поля XPage и YPage в значение ширины и высоты
(в единицах XUnits и YUnits) области пользователя окна-владельца.
См. также: TWindow.WMSize.
SetRange (никогда не переопределяется)
-----------------------------------------------------------------
procedure SetRange(TheXRange, TheYRange: Longint);
Заменяет значения XRange и YRange, переданные при вызове
Init, на значения TheXRange и TheYRange. Затем для установки диа-
пазона полос пpокpутки окна-владельца вызывает SetBarRange.
См. также: TScroller.SetBarRange.
SetBarRange (никогда не переопределяется)
-----------------------------------------------------------------
procedure SetBarRange; virtual;
Устанавливает диапазон полос пpокpутки окна-владельца таким
обpазом, чтобы он был синхpонным с диапазоном TScroller.
SetUnits
-----------------------------------------------------------------
procedure SetUnits(TheXUnit, TheYUnit: Longint);
Устанавливает значения XUnit и YUnit в TheXUnit и TheYUnit,
соответственно.
Store
-----------------------------------------------------------------
procedure Store(var S: TStream);
Записывает объект прокрутки в поток S, записывая поля
TScroller, за исключением XPage, YPage, XPos, YPos.
VScroll (никогда не переопределяется)
-----------------------------------------------------------------
procedure VScroll(ScrollEvent: Word; ThumbPos: Integer);
virtual;
Отвечает на заданное событие ScrollEvent полосы прокрутки,
изменяя позицию маркера в вертикальной полосе прокрутки.
См. также: TWindow.WMVScroll.
------------------------------------------------------------------------
TSortedCollection модуль Objects
-----------------------------------------------------------------
TObject TCollection
+------+ +----------------------------------------+
+------| | Count Items |
|-Init-| | Delta Limit |
|-Done-| +----------------------------------------|
| Free | | Init ForEach |
+------+ |-Load------------- Free |
| Done FreeAll |
| At FreeItem |
| AtDelete GetItem |
| AtFree -IndexOf------------|
| AtInsert -Insert-------------|
| AtPut LastThat |
| Delete Pack |
| DeleteAll PutItem |
| Error SetLimit |
| FirstThat -Store--------------|
+----------------------------------------+
TSortedCollection
+-----------------+
| Duplicates |
+-----------------|
| Load |
| Compare |
| IndexOf |
| KeyOf |
| Search |
| Store |
+-----------------+
TSortedCollection - это специализированный производный от
TCollection тип, реализующий наборы, отсортированные по ключу.
Сортировка реализуется виртуальным методом Compare, который вы
переопределяете для определения собственного порядка сортировки
элементов. При добавлении новых элементов они автоматически вклю-
чаются в порядке, заданном методом Compare. Элементы можно нахо-
дить с помощью метода двоичного поиска Search. Если Compare тре-
буется дополнительная информация, виртуальный метод KeyOf, возв-
ращающий указатель на Compare, также можно переопределить.
TSortedCollection реализует отсортированные наборы с дубли-
руемыми ключами и без них. Поле Duplicates управляет разрешением
дублирования. По умолчанию оно равно False. Это указывает, что
дублирующиеся ключи не разрешаются, но после создания отсортиро-
ванного набора вы можете установить Duplicates в True, что позво-
лит использовать в наборе элементы с дублирующимися ключами.
Поля
-----------------------------------------------------------------
Duplicates (только чтение)
Duplicates: Boolean;
Определяет, будет ли набор воспринимать элементы с дублируе-
мыми ключами. По умолчанию Duplicates имеет значение False, и вы-
зов метода Insert для элемента, уже содержащегося в наборе, не
приводит к включению нового элемента. В наборе будет содержаться
только первый элемент с данными ключом.
Если вы установите Duplicates в True, дублирующие элементы
вставляются в набор непосредственно перед первым элементом с этим
ключом.
Методы
-----------------------------------------------------------------
Ниже описываются методы, определенные в данном объекте.
Load
-----------------------------------------------------------------
constructor Load(var S: Stream);
Строит и загружает отсортированный набор из потока S, вызы-
вая сначала метод TCollection.Load, а затем считывая поле
Duplicates TSortedCollection.
См. также: TCollection.Load.
Compare (всегда переопределяется)
-----------------------------------------------------------------
function Compare(Key1, Key2: Pointer): Integer; virtual;
Compare - это абстрактный метод, который должен переопреде-
ляться в наследующих типах. В Compare должны сравниваться два
значения ключей и возвращаться следующий результат: -1, если Key1
< Key2; 0 если Key1 = Key2 и 1, если Key1 > Key2.
Key1 и Key2 - это значения указателей, выделенные из соот-
ветствующих элементов наборов методом TSortedCollection.KeyOf.
Метод TSortedCollection.Search реализует двоичный поиск по эле-
ментам набора, используя для сравнения элементов метода Compare.
См. также: TSortedCollection.KeyOf,
TSortedCollection.Compare.
IndexOf (никогда не переопределяется)
-----------------------------------------------------------------
function IndexOf(Item: Pointer): Integer; virtual;
Использует TSortedCollection.Search для определения индекса
данного элемента. Если элемента в наборе нет, то IndexOf возвра-
щает -1. Фактической реализацией TSortedCollection.IndexOf явля-
ется:
if Search(KeyOf(Item), I) then IndexOf := I
else IndexOf := -1;
См. также: TSortedCollection.Search.
Insert (никогда не переопределяется)
-----------------------------------------------------------------
procedure Insert(Item: Pointer); virtual;
Если целевой элемент в отсортированном наборе не найден, то
он включается в текущей позиции индекса. Для определения наличия
или отсутствия элемента вызывает TSortedCollection.Search. Если
элемент отсутствует, то включает его. Фактической реализацией
TSortedCollection.Insert является:
if not Search(KeyOf(Item), I) or Duplicates then
AtInsert(I, Item);
См. также: TSortedCollection.Search.
KeyOf (иногда переопределяется)
-----------------------------------------------------------------
function KeyOf(Item: Pointer): Pointer: virtual;
По заданному элементу набора Item функция KeyOf должна возв-
ращать соответствующий ключ элемента. По умолчанию
TSortedCollection.KeyOf просто возвращает Item. KeyOf переопреде-
ляется в тех случаях, когда ключ не является самим элементом.
См. также: TSortedCollection.IndexOf.
Search (переопределяется редко)
-----------------------------------------------------------------
function Search(Key: Pointer; var Index: Integer): Boolean;
virtual;
Возвращает True, если идентифицируемый ключом Key элемент
найден в отсортированном наборе. Если элемент найден, Index возв-
ращает индекс этого элемента. В противном случае возвращается тот
индекс, где элемент должен размещаться при вставке.
См. также: TSortedCollaction.Compare,
TSortedCollection.Insert.
Store
-----------------------------------------------------------------
procedure Store(var S: Stream);
Записывает отсортированный набор и его элементы в потоке S,
вызывая для записи набора TCollection.Store, а затем записывая в
поток поле Duplicates.
См. также: TSortedCollection.Store.
------------------------------------------------------------------------
TStatic модуль ODialogs
-----------------------------------------------------------------
TObject TWindowsObject
+------+ +----------------------------------------+
+------| | ChildList Parent |
|-Init-| | Flags Status |
|-Done-| | HWindow TransferBuffer |
| Free | | Instance |
+------+ +----------------------------------------|
|-Init-------- GetChildren |
|-Load-------- -GetClassName-------|
| Done GetClient |
| AddChild -GetId--------------|
| At GetSiblingPtr |
| Canclose -GetWindowClass-----|
| ChildWithId IndexOf |
| CloseWindow IsFlagSet |
| CMExit Next |
|-Create------ Previous |
| CreateChildren PutChildPtr |
| CreateMemoryDC PutChildren |
| DefChildProc PutSiblingPtr |
| DefCommandProc -Register-----------|
| DefNotificationProc RemoveChild |
|-DefWndProc-- SetFlags |
| Destroy -SetupWindow--------|
| Disable Show |
| DisableAutoCreate -Store--------------|
| DisableTransfer Transfer |
| DispatchScroll TransferData |
| Enable -WMActivate---------|
| EnableAutoCreate WMClose |
| EnableKBHandler WMCommand |
| EnableTransfer WMDestroy |
| FirstThat -WMNScroll----------|
| Focus WMNCDestroy |
| ForEach WMNQueryEndSession |
| GetChildPtr -WMVScroll----------|
+----------------------------------------+
TWindow TControl
+-------------------+ +-----------------+
| Attr | +-----------------|
| DefaultProc | |-Init------------|
| Scrol[ler | |-InitResource----|
| FocusChildHandle | |-GetClassName----|
+-------------------| | Register |
|-Init--------------| | WMPaint |
| InitResource | +-----------------+
|-Load--------------|
| Done | TStatic
| Create | +-----------------+
| DefWndProc | | TextLen |
| FocusChild | +-----------------|
| GetId | | Init |
| GetWindowClass | | InitResource |
| Paint | | Load |
| SetCaption | | Clear |
| SetupWindow | | GetClassName |
|-Store-------------| | GetText |
| UpdateFocusChild | | GetTextLen |
| WMActivate | | SetText |
| WMHScroll | | Store |
| WMLButtonDown | | Transfer |
| WMMDIActivate | +-----------------+
| WMMove |
| WMPaint |
|-WMSize------------|
| WMSysCommand |
| WMVScroll |
+-------------------+
TStatic представляет собой интерфейсный объект, который
представляет статический текстовый элемент Windows.
Поля
-----------------------------------------------------------------
TextLen (только чтение)
TextLen: Word;
Элемент данных TextLen содеpжит pазмеp текстового буфеpа для
статических элементов упpавления. Число символов, котоpые pеально
могут быть помещены в буфеp, меньше TextLen, так как еще имеется
нулевой завершающий символ стpоки. TextLen также pавна числу
байт, пеpеданных методом Transfer.
Методы
-----------------------------------------------------------------
Ниже описываются методы, определенные в данном объекте.
Init
-----------------------------------------------------------------
constructor Init(AParent: PWindowsObject; AnID: Integer;
ATitle: PChar; X, Y, W, H: Integer, ATextLen: Word);
Создает статический объект упpавляющего элемента с пеpедан-
ным порождающим окном (AParent), идентификатоpом управляющего
элемента (AnId); текстом (ATitle), позицией (X,Y) относительно
начала области пользователя порождающего окна, шиpиной (W), высо-
той (H) и длиной текста (TextLen). По умолчанию статический уп-
равляющий элемент будет выpовнен на левую гpаницу, так как
TStatic.Init добавляет к полю объекта Attr.Style ws_TabStop. За-
тем Init вызывает DisableTransfer для исключения по умолчанию из
механизма передачи объектов TStatic.
InitResource
-----------------------------------------------------------------
constructor InitResource(AParent: PWindowsObject;
ResourceId, ATextLen: Word);
Вызывая наследуемый из TControl конструктор InitResource,
связывает объект TStatic с ресурсом статического управляющего
элемента, заданного ResourceID. Устанавливает поле TextLen в
ATextLen.
См. также: TControl.InitResource.
Load
-----------------------------------------------------------------
constructor Load(var S: TStream);
Строит и загружает статический управляющий элемент из потока
S, вызывая сначала наследуемый из TControl конструктор Load, а
затем считывая поле TextLen.
См. также: TControl.Load.
Clear (переопределяется редко)
-----------------------------------------------------------------
procedure Clear; virtual;
Стиpает текст статического упpавляющего элемента.
GetClassName (переопределяется редко)
-----------------------------------------------------------------
function GetClassName: PChar; virtual;
Возвpащает имя класса окна TStatic - 'Static'.
GetText (переопределяется редко)
-----------------------------------------------------------------
function GetText(ATextString: PChar; MaxChars: Integer):
Integer; virtual;
Считывает текст статического элемента упpавления и помещает
его в аpгумент ATextString. MaxChars опpеделяет максимальный pаз-
меp ATextString. GetText возвpащает pазмеp считанной стpоки.
SetText (переопределяется редко)
-----------------------------------------------------------------
function SetText(ATextString: PChar; MaxChars: Integer):
Integer; virtual;
Записывает текст, пеpеданный в ATextString, в текст элемента
упpавления.
Store
-----------------------------------------------------------------
procedure Store(var S: TStream);
Записывает статический управляющий элемент в поток S, вызы-
вая метод Store, наследуемый из TControl, а затем записывая поле
TextLen.
См. также: TControl.Store.
Transfer (иногда переопределяется)
-----------------------------------------------------------------
function Transfer(DataPtr: Pointer, TransferFlag: Word):
Word; virtual;
Пеpедает TextLen символов текущего текста оpгана упpавления
в/из буфера передачи, на котоpый указывает DataPtr. Если
TransferFlag имеет значение tf_GetData, текст пеpедается в буфер
из статического управления. Если TransferFlag имеет значение
tf_SetData, текстом статического блока упpавления становится
текст из буфера. Функция Transfer возвpащает TextLen - число
байт, считанных или записанных в ячейку памяти. Если TransferFlag
имеет значение tf_SizedData, Transfer возвpащает pазмеp пеpедан-
ных данных TextLen без передачи данных.
------------------------------------------------------------------------
TStrCollection модуль Objects
-----------------------------------------------------------------
TObject TCollection
+------+ +----------------------------------------+
+------| | Count Items |
|-Init-| | Delta Limit |
|-Done-| +----------------------------------------|
| Free | | Init ForEach |
+------+ |-Load------------- Free |
| Done FreeAll |
| At FreeItem |
| AtDelete GetItem |
| AtFree -IndexOf------------|
| AtInsert -Insert-------------|
| AtPut LastThat |
| Delete Pack |
| DeleteAll PutItem |
| Error SetLimit |
| FirstThat -Store--------------|
+----------------------------------------+
TSortedCollection TStrCollection
+-----------------+ +-----------------+
| Duplicates | +-----------------|
+-----------------| | Compare |
| Load | | FreeItem |
| Compare | | GetItem |
| IndexOf | | PutItem |
| KeyOf | +-----------------+
| Search |
| Store |
+-----------------+
TStrCollection - это простой производный из
TSoortedCollection тип, реализующий отсортированный список строк
ASCII. Метод TStrCollection.Compare переопределен для обеспечения
обычного упорядочивания строк ASCII. Вы можете переопределить ме-
тод Compare для задания другого порядка (например, алфавитного
порядке нелатинских символов).
Методы
-----------------------------------------------------------------
Ниже описываются методы, определенные в данном объекте.
Compare (иногда переопределяется)
-----------------------------------------------------------------
function Compare(Key1, Key2: Pointer): Integer; virtual;
Сравнивает строки Key1^ и Key2^ и возвращает -1, если Key1 <
Key2; 0, если Key1 = Key2 и 1, если Key1 > Key2.
См. также: TSortedCollection.Search.
FreeItem (переопределяется редко)
-----------------------------------------------------------------
procedure FreeItem(Item: Pointer); virtual;
Удаляет строку Item^ из отсортированного набора и уничтожает
ее.
GetItem (переопределяется редко)
-----------------------------------------------------------------
function GetItem(var S: TStream): Pointer; virtual;
По умолчанию считывает строку из потока, вызывая S.ReadStr.
См. также: TStream.ReadStr.
PutItem (переопределяется редко)
-----------------------------------------------------------------
procedure PutItem(var S: TStream; Item: Pointer); virtual;
По умолчанию записывает строку Item^ в поток, вызывая
S.WriteStr.
См. также: TStream.WriteStr.
------------------------------------------------------------------------
TStream метод Objects
-----------------------------------------------------------------
TObject TStream
+------+ +-----------------+
+------| | Status |
|-Init-| | ErrorInfo |
|-Done-| +-----------------|
| Free | | CopyFrom |
+------+ | Error |
| Flush |
| Get |
| GetPos |
| GetSize |
| Put |
| Read |
| ReadStr |
| Reset |
| Seek |
| StrRead |
| StrWrite |
| Truncate |
| Write |
| WriteStr |
+-----------------+
TStream - это общий абстрактный объект, обеспечивающий поли-
морфический ввод-вывод в/на устройство. Переопределяя виртуальные
методы GetPos, GetSize, Read, Seek, Truncate и Write, вы можете
создать собственные производные потоковые объекты. Сама
ObjectWindows делает это, строя производные объекты TDosSteram и
TEmsStream. Для буферизированных производных потоков вы должны
также переопределить TStream.Flush.
Поля
-----------------------------------------------------------------
Status (чтение/запись)
Status: Integer;
Status указывает текущее состояние потока, используя одну из
констант stXXXX: stOk, stError, stInitError, stReadError,
stWriteError, stGetError или stPutError.
Если Status не равно stOk, то все операции с потоком приос-
танавливаются до вызова Reset.
См. также: константы stXXXX.
ErrorInfo (чтение/запись)
-----------------------------------------------------------------
ErrorInfo: Integer;
ErrorInfo содержит дополнительную информацию, когда Status
не равно stOk. Для значений Status stError, stInitError,
stReadError и stWriteError ErrorInfo содержит код ошибки DOS или
EMS (если он доступен). Когда Status имеет значение stGetError,
ErrorInfo содержит идентификатор объектного типа (поле ObjType в
TStreamRec) незарегистрированного типа объекта. Когда Status рав-
но stPutError, ErrorInfo содержит смещение сегмента данных табли-
цы виртуальных методов (поле VmLink в TStreamRec) незарегистриро-
ванного типа объекта.
Методы
-----------------------------------------------------------------
Ниже описываются методы, определенные в данном объекте.
CopyFrom
-----------------------------------------------------------------
procedure CopyFrom(var S: TStream; Count: Longint);
Копирует Count байт из потока S в объект потока. Например:
{ создать копию всего потока }
NewStream := New(TEmsStream, Init(oldStream^.GetSize));
OldStream^.Seek(0);
NewStream^.CopyFrom(OldStream, OldStream^.GetSize);
См. также: TStream.GetSize, TObject.Init.
Error (иногда переопределяется)
-----------------------------------------------------------------
procedure Error(Code, Info: Integer); virtual;
Вызывается, когда происходит ошибка потока. По умолчанию
TStream.Error сохраняет Code и Info в полях Status и ErrorInfo, а
затем, если глобальная переменная StreamError не равна nil, вызы-
вает процедуру, на которую указывает StreamError. Если происходит
ошибка, все операции с потоком приостанавливаются до вызова
Reset.
См. также: TStream.Reset, переменную StreamError.
Flush (иногда переопределяется)
-----------------------------------------------------------------
procedure Flush; virtual;
Сбрасывает все буферы путем очистки буфера чтения или записи
буфера записи (или обоих). По умолчанию TStream.Flush ничего не
делает и должна переопределяться в наследующих типах, где реали-
зуются буферы.
См. также: TBufStream.Flush.
Get
-----------------------------------------------------------------
function Get: PObject;
Считывает объект из потока. Объект должен быть предваритель-
но записан в поток методом TStream.Put. Get сначала считывает
из потока идентификатор объектного типа (слово). Затем она нахо-
дит соответствующий объектный тип, сравнивая идентификатор с по-
лем ObjType всех зарегистрированных объектных типов (см. тип
TStreamRec), и наконец вызывает конструктор Load этого объектного
типа для создания и загрузки объекта. Если считываемый из потока
объектный тип равен 0, Get возвращает указатель nil. Если указа-
тель объектного типа не зарегистрирован (с помощью RegisterType),
Get вызывает TStream.Error и возвращает указатель nil. В против-
ном случае Get возвращает указатель на вновь созданный объект.
См. также: TStream.Put, RegisterType, TStreamRec, методы
Load.
GetPos (всегда переопределяется)
-----------------------------------------------------------------
function GetPos: Longint; virtual;
Возвращает значение текущей позиции потока. Это абстрактный
метод, который должен переопределяться.
См. также: TStreamSeek.
GetSize (всегда переопределяется)
-----------------------------------------------------------------
function GetSize: Longint; virtual;
Возвращает общий размер потока. Это абстрактный метод, кото-
рый должен переопределяться.
Put
-----------------------------------------------------------------
procedure Put(P: PObject);
Записывает объект в поток. Позднее объект может считываться
из потока с помощью TStreamGet.Get. Put сначала находит запись
регистрации типа объекта, сравнивая смещение таблицы виртуальных
методов объекта с полем WmtLink всех зарегистрированных объектных
типов (см. тип TStreamRec), затем записывает в поток идентифика-
тор тип объекта (поле ObjType записи регистрации) и, наконец, вы-
зывает метод Store этого объектного типа для записи объекта. Если
передаваемый в Put аргумент имеет значение nil, то Put записывает
в поток слово, содержащее 0. Если объектный тип P не зарегистри-
рован (с помощью RegisterType), Put вызывает TStreamError и с по-
током ничего не делает.
См. также: методы TStreamGet, RegisterType, TStreamRec,
Store.
Read (всегда переопределяется)
-----------------------------------------------------------------
procedure Read(var Buf; Count; Word); virtual;
Считывает из потока Stream Count байт и продвигает текущую
позицию потока на Count байт. В случае ошибки Read вызывает Error
и заполняет Buf Count нулевыми байтами. Это абстрактный метод,
который должен переопределяться в наследующих типах.
См. также: TStream.Write, TStream.Error.
ReadStr
-----------------------------------------------------------------
function ReadStr: PString;
Считывает строку из текущей позиции в потоке, возвращая ука-
затель PString. TStream.ReadStr для выделения для строки Length
+ 1 байт вызывает GetMem.
См. также: TStream.WriteStr.
Reset
-----------------------------------------------------------------
procedure Reset;
Сбрасывает для потока любой ошибочное условие, устанавливая
Status и ErrorInfo в 0. Этот метод позволяет вам продолжить рабо-
ту с потоком после исправления условия ошибки.
См. также: TStream.Status, TStream.ErrorInfo, коды ошибок
stXXXX.
Seek (всегда переопределяется)
-----------------------------------------------------------------
procedure Seek(Pos: Longint); virtual;
Устанавливает текущую позицию в Pos байт от начала потока.
Начальной позицией потока является 0. Это абстрактный метод, ко-
торый должен переопределяться во всех потомках.
См. также: TStream.GetPos.
StrRead
-----------------------------------------------------------------
function StrRead: PChar;
Считывает из потока строку с завершающим нулем, считывая
сначала длину строки, а затем заданное число символов. Возвращает
указатель на прочитанную строку с завершающим нулем.
См. также: TStream.StrWrite.
StrWrite
procedure StrWrite(P: PChar);
Записывает в поток строку с завершающим нулем, записывая
сначала длину строки, а затем заданное число символов.
См. также: TStream.StrWrite.
Truncate (всегда переопределяется)
-----------------------------------------------------------------
procedure Trancate: virtual;
Удаляет все данные из потока от текущей позиции до конца.
Это абстрактный метод, который должен переопределяться во всех
потомках.
См. также: TStream.GetPos, TStream.Seek.
Write (всегда переопределяется)
-----------------------------------------------------------------
procedure Write(var Buf; Count: Word); virtual;
Записывает Count байт из Buf в потоки продвигает текущую по-
зицию в потоке на Count байт. В случае ошибки Write вызывает
Error. Это абстрактный метод, который должен переопределяться во
всех потомках.
См. также: TStream.Read, TStream.Error.
WriteStr
-----------------------------------------------------------------
procedure WriteStr(P: PString);
Записывает строку P^ в поток, начиная с текущей позиции.
См. также: TStream.ReadStr.
Тип TStreamRec модуль Objects
-----------------------------------------------------------------
Описание:
TStreamRec = record
ObjType: Word;
VmtLink: Word;
Load: Pointer;
Store: Pointer;
Next: Word;
end;
Назначение: Перед тем как все его типы смогут загружаться из
объекта TStream или записываться в него, объектный тип
ObjectWindows должен иметь зарегистрированный тип TStreamRec.
Подпрограмма RegisterTypes регистрирует объектный тип, устанавли-
вая запись TStreamRec.
Поля в записи регистрации определены следующим образом:
Поля записи потока Таблица 21.27
+-----------------+---------------------------------------------+
| Поле | Содержимое |
+-----------------+---------------------------------------------|
| ObjType | Уникальный числовой идентификатор объектного|
| | типа. |
+-----------------+---------------------------------------------|
| VmtLink | Связь с записью таблицы виртуальных методов|
| | объектного типа. |
+-----------------+---------------------------------------------|
| Load | Указатель на конструктор Load объектного ти-|
| | па. |
+-----------------+---------------------------------------------|
| Store | Указатель на метод Store объектного типа. |
+-----------------+---------------------------------------------|
| Next | Указатель на следующую запись TStreamRec. |
+-----------------+---------------------------------------------+
ObjectWindows резервирует идентификаторы объектных типов
(ObjType) со значением от 0 до 999 для своего внутреннего исполь-
зования. Программисты могут определять свои собственные значения
в диапазоне от 1000 до 65535.
По соглашению TStreamRec для объектного типа Txxxx называет-
ся Rxxxx. Например, как показано ниже TStreamRec для типа
TCalculator называется RCalculator:
type TCalculator = object(TDialog)
constructor Load(var S: TStream);
procedure Store(var S: TStream);
.
.
.
end;
const
RCalculator: TStreamRec = (
ObjType: 2099;
VmtLink: Ofs(TypeOf(TCalculator)^);
Load: @TCalculator.Load;
Store: @TCalculator.Store);
begin
RegisterType(RCalculator);
.
.
end;
См. также: RegisterType.
------------------------------------------------------------------------
TStringLookupValidator модуль Validate
-----------------------------------------------------------------
TObject TValidator TPXPictureValidator
+------+ +-----------------+ +-----------------+
+------| | Options | +-----------------|
|-Init-| | Status | | IsValid |
|-Done-| +-----------------| |-Lookup----------|
| Free | |-Init------------| +-----------------+
+------+ |-Load------------|
|-IsInvalid-------| TStringLookupValidator
| IsValidInput | +-----------------+
|-Store-----------| | Strings |
| Transfer | +-----------------|
| Valid | | Init |
+-----------------+ | Load |
| Done |
| Error |
| Lookup |
| NewStringList |
| Store |
+-----------------+
Объект проверки допустимости с помощью просмотра строк
TStringLookupValidator проверяет данные в соответствующей строке
ввода путем просмотра набора допустимых строк. Если в строке вво-
да вам требуются только строки из определенного набора строк, вы
можете использовать данные объекты.
Поля
-----------------------------------------------------------------
Strings: PStringsCollection;
Указывает на набор строк, содержащий все допустимые строки,
которые может набирать пользователь. Если Strings имеет значение
nil, все строки будут недопустимыми.
Методы
-----------------------------------------------------------------
Ниже перечисляются методы, содержащиеся в данном объекте.
Init
-----------------------------------------------------------------
constructor Init(AStrings: PStringCollection);
Строит объекты проверки допустимости с просмотром строк, вы-
зывая сначала конструктор Init, наследуемый из TLookupValidator,
а затем устанавливая Strings в AStrings.
См. также: TLookupValidator.Init.
Load
-----------------------------------------------------------------
constructor Load(var S: TStream);
Строит и загружает объекты проверки допустимости с просмот-
ром строк из потока S, вызывая сначала конструктор Load, наследу-
емый из TLookupValidator, а затем считывая набор строк Strings.
См. также: TLookupValidator.Load.
Done
-----------------------------------------------------------------
destructor Done; virtual;
Уничтожает список допустимых строк, вызывая NewString(nil),
а затем уничтожает объект проверки допустимости с просмотром
строк путем вызова деструктора Done, наследуемого из
TLookupValidator.
См. также: TLookupValidator.Done,
TStringLookupValidator.NesStringList.
Error
-----------------------------------------------------------------
procedure Error; virtual;
Выводит блок сообщения, указывающий, что набранная строка не
совпадает с записью в списке строк.
Lookup
-----------------------------------------------------------------
function Lookup(const S: string): Boolean; virtual;
Возвращает True, если переданная в S строка совпадает с ка-
кой-либо из строк в наборе Strings. Для определения присутствия S
использует метод Search набора строк.
NewStringList
-----------------------------------------------------------------
procedure NewStringList(AStrings: PStringCollection;
Устанавливает для объекта проверки допустимости с просмотром
строк список допустимых строк ввода. Уничтожает любой существую-
щий список строк, а затем устанавливает Strings в AStrings. Пере-
дача в AStrings значения nil уничтожает существующий список, не
присваивая новый.
Store
-----------------------------------------------------------------
procedure Store(var S: TStream);
Записывает объект проверки допустимости с просмотром строк в
потоке S, вызывая сначала метод Store, наследуемый из TValidatos,
а затем записывая содержащийся в Strings набор строк.
------------------------------------------------------------------------
TValidator модуль Validate
-----------------------------------------------------------------
TObject TValidator
+------+ +-----------------+
+------| | Options |
|-Init-| | Status |
| Done | +-----------------|
| Free | | Init |
+------+ | Load |
| IsInvalid |
| IsValidInput |
| Store |
| Transfer |
| Valid |
+-----------------+
TValidator определяет объект проверки допустимости абстракт-
ных данных. На самом деле вам никогда не потребуется создавать
экземпляры TValidator, но он обеспечивает абстрактные функции для
других объектов проверки допустимости.
Поля
-----------------------------------------------------------------
Options
Options: Word;
Options - это поле с побитовым отображением, используемое в
различных потомках TValidator. По умолчанию TValidator.Init очи-
щает все биты в Options.
См. также: константы voXXXX.
Status
-----------------------------------------------------------------
Status: Word;
Status указывает состояние объекта проверки допустимости.
Если значение Status равно vsOK, то объект проверки допустимости
строится корректно. Любое значение, отличное от vsOK, указывает,
что произошла ошибка.
См. также: TInputLine.Valid, константы ValidatorOK.
Методы
-----------------------------------------------------------------
Ниже перечисляются методы, содержащиеся в данном объекте.
Init
-----------------------------------------------------------------
constructor Init;
Строит абстрактный объект проверки допустимости, вызывая
сначала конструктор Init, наследуемый из TObject, а затем уста-
навливая поля Options и Status в значение 0.
См. также: TObject.Init.
Load
-----------------------------------------------------------------
constrictor Load(var S: Stream);
Строит объект проверки допустимости, вызывая конструктор
Init, наследуемый из TObject, а затем считывает из потока S слово
Options.
См. также: TObject.Init.
Error
-----------------------------------------------------------------
propcedure Error; virtual;
Error - это абстрактный метод, вызываемый Valid при обнару-
жении ввода пользователем недопустимой информации. По умолчанию
TValidator.Error ничего не делает, но наследующие типы могут пе-
реопределять Error для обеспечения обратной связи с пользовате-
лем.
IsValid
-----------------------------------------------------------------
function IsValid(const S: string): Boolean; virtual;
По умолчанию TValidator.IsValid возвращает True. Наследующие
типы проверки допустимости могут переопределять IsValid для про-
верки данных в полной строке ввода. Если строка ввода имеет соот-
ветствующий объект проверки допустимости, то его метод Valid вы-
зывает метод Valid объекта проверки допустимости, который, в свою
очередь, вызывает IsValid для определения допустимости строки
ввода IsValid.
См. также: TInputLine.Valid, TValidator.Valid.
IsValidInput
-----------------------------------------------------------------
function IsValidInput(var S: string; SuppressFill: Boolean):
Boolean; virtual;
Если строка ввода имеет соответствующий объект проверки до-
пустимости, то IsValidInput вызывается после обработки каждого
клавиатурного события. Это дает таким средствам проверки допус-
тимости как фильтры возможность перехватывать ошибки перед тем,
как пользователь заполнит весь элемент на экране.
По умолчанию TValidator.IsInput возвращает значение True.
Наследующие объекты проверки допустимости данных могут переопре-
делять IsValidInput для проверки допустимости набираемых пользо-
вателем данных, возвращая True, если S содержит допустимые дан-
ные, и False в противном случае.
S - это текущая строка ввода. SupressFill определяет, будет
ли объект проверки допустимости автоматически форматировать стро-
ку перед ее проверкой. Если SupressFill имеет значение True, то
проверка допустимости выполняется для немодифицированной строки
S. Если SupressFill имеет значение False, то перед проверкой до-
пустимости данных средство проверки допустимости должно заполнить
или дополнить строку. Из стандартных объектов проверки допусти-
мости SupressFill проверяет только TPXPictureValidator.
Так как S - это параметр-переменная, IsValidInput может мо-
дифицировать содержимое строк ввода, например, преобразовывать
символы в верхний регистр или вставлять литеральные символы из
трафарета формата. Однако, метод IsValidInput не должен удалять
из строки недопустимых символов. Возвращая значение False,
IsValidInput указывает, что в строке ввода следует стереть невер-
ные символы.
Store
-----------------------------------------------------------------
procedure Store(var S: TStream);
Записывает объект проверки допустимости в поток S, записывая
значение поля Options.
Transfer
-----------------------------------------------------------------
function Transfer(var S: String; Buffer: Pointer; Flag:
TVTransfer): Word; virtual;
Позволяет объекту проверки допустимости на основе установ-
ленных значений считывать соответствующие значения строки ввода,
которые наиболее полезны в объектах проверки допустимости, прове-
ряющих нестроковые данные (такие как числовые значения). Напри-
мер, TRAngeValidator использует Transfer вместо передачи целой
строки для чтения и записи значений типа Longint в запись дан-
ных.
По умолчанию строки ввода с проверкой допустимости дают сна-
чала объекту проверки допустимости возможность ответить на
DataSize, GetData и SetData, вызывая метод Transfer объекта про-
верки допустимости. Если метод Transfer возвращает что-либо, от-
личное от 0, это указывает строке ввода, что соответствующая пе-
редача обработана. Используемым по умолчанию действием
TValidator.Transfer является возврат значения 0 (в любом случае).
Если вы хотите, чтобы объект проверки допустимости пересылал дан-
ные, то нужно переопределить метод Transfer.
Первые два параметра Transfer - это соответствующая тексто-
вая строка ввода и запись GetData или SetData. В зависимости от
значения Flag, Transfer может устанавливать S из буфера Buffer
или считывать в буфер Buffer данные из S. Возвращаемое значение
всегда равно число переданных данных.
Если Flag имеет значение vtSetData, Transfer считывает буфе-
ра Buffer в S соответствующее число байт, преобразуя их в нужную
строковую форму и возвращая число считанных байт. Если Flag равен
vtGetData, Transfer устанавливает значения в Buffer, беря соот-
ветствующее число байт и преобразуя их в нужную строковую форму
S, возвращая размер данных. Если Flag равен vtDataSize, Transfer
просто возвращает размер данных.
См. также: TInputLine.DataSize, TInputLine.GetData,
TInputLine.SetData.
Valid
-----------------------------------------------------------------
function Valid(const S: string): Boolean;
Возвращает True, если IsValid(S) возвращает значение True. В
противном случае вызывает Error и возвращает значение False. Ме-
тод Valid объекта проверки допустимости вызывается методом Valid
соответствующей строки ввода.
Строки ввода и связанные с ними объекты проверки допустимос-
ти вызывают метод Valid объекта проверки допустимости при двух
условиях: когда установлена строка ввода или ее параметр
ofValidarte (в этом случае при вызове Valid теряется фокус вво-
да), либо диалоговый блок, содержащий строку ввода, вызывает ме-
тод Valid для всех своих управляющих элементов (обычно из-за то-
го, что пользователь требует закрыть диалоговый блок или ввести
запись с экрана).
См. также: TInputLine.Valid, TValidator.Error,
TValidator.IsValid.
Назад | Содержание | Вперед