ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 14

Управление редактированием
Управление редактированием может быть описано, как диалоговое статическое управление. Это прямоугольные области (с рамкой или без) на экране, которые пользователь приложения может заполнять текстом, изменять или удалять. Управления редактированием наибол
ее удобны в качестве полей для ввода данных на экране. Они обеспечивают следующие операции:
- Ввод текста пользователем
- Динамическое отображение текста приложением
- Вырезание, копирование и вставка в буфер вырезанного изображения
- Многострочное редактирование (удобно для текстовых редакторов)
На Рис.12.9 показано окно с двумя управлениями редактированием.
Рис.12.9. Окно с управлениями редактированием
Конструирование управления редактированием
Конструктор управления редактированием Init берет родительское окно, ID управления, (начальный) текст по умолчанию, размеры X, Y, W и H, максимальную длину текста и булевский флаг, Multiline. Управление редактированием строится со стилями ws_Child и ws_V
isible (из TControl.Init), ws_TabStop, es_Left и es_AutoHScroll. Параметр длины текста в действительности на единицу больше максимально допустимого числа символов в строке редактирования, поскольку управление должно содержать завершающий пустой символ. Е
сли значение Multiline есть False, то управление редактированием представляет собой одну строку и имеет стиль ws_Border:
EC1:=New(PEdit, Init(@Self, id_EC1, 'Default Text', 20, 50, 150,
 30, 40, False));
Если Multiline имеет значение True, то управление редактированием имеет стиль es_MultiLine, es_AutoVScroll, ws_VScroll и ws_HScroll:
EC2:=New(PEdit, Init(@Self, id_EC2, '', 20, 20, 200, 150, 40,
 True));
После вызова Init стиль управления редактированием может быть изменен:
EC3:=New(PEdit, Init(@Self, id_EC3, 'Default Text', 20, 20, 150,
 20, 40, False));
EC3^.Attr.Style:=EC3^.Attr.Style and (not ws_Border);
Результатом этих строк будет управление редактированием, показанное на Рис.12.10.
Рис.12.10. Созданное без рамки управление редактированием
Следующая таблица показывает наиболее общие стили управления редактированием:
Таблица 12.3. Общие стили управления редактированием
----------------------------------------------------------------
Стиль          Результат
----------------------------------------------------------------
es_Left        Выравнивание слева
es_Center      Выравнивание по центру
es_Right       Выравнивание справа
es_MultiLine   Управление редактированием нескольких строк
es_UpperCase   Преобразование в прописные буквы
es_LowerCase   Преобразование в строчные буквы
es_AutoVScroll Добавить автоматическую вертикальную прокрутку для
               многострочного управления
es_AutoHScroll Добавить автоматическую горизонтальную прокрутку
ws_Border      Добавить прямоугольную рамку вокруг управления
               редактированием
ws_VScroll     Добавить вертикальную линейку прокрутки
ws_HScroll     Добавить горизонтальную линейку прокрутки
----------------------------------------------------------------
Буфер вырезанного изображения и операции редактирования
Вы можете непосредственно передавать текст между объектом управления редактированием и буфером вырезанного изображения Windows. Методы буфера вырезанного изображения вызываются следующим образом:
EC1^.Cut;
EC1^.Copy;
EC1^.Paste;
Имеются и другие методы редактирования:
EC1^.Clear;
EC1^.DeleteSelection;
EC1^.Undo;
Часто вам бывает нужно предоставить пользователю доступ к этим методам через меню редактирования. Объект управления редактированием автоматически отреагирует на выбор из меню таких вариантов, как Edit|Copy и Edit|Undo. TEdit определяет основанные на кома
ндах методы (например, CMEditCopy и CMEditUndo), которые вызываются в ответ на конкретный выбор (команду) меню в родительском окне управления редактированием. CMEditCopy вызывает Copy, а CMEditUndo вызывает Undo. Следующая таблица содержит список методов
, которые вызываются в ответ на выбор варианта из меню с конкретным ID меню (определены в WOBJECTS.H):
Таблица 12.4. ID меню и вызываемые ими методы
----------------------------------------------------------------
ID меню        Вызываемый метод
----------------------------------------------------------------
cm_EditCut     Cut
cm_EditCopy    Copy
cm_EditPaste   Paste
cm_EditClear   Clear
cm_EditDelete  DeleteSelection
cm_EditUndo    Undo
----------------------------------------------------------------
Все что вам нужно сделать для добавления меню редактирования к окну, которое в качестве дочернего окна имеет объекты управления редактированием, это определить для окна ресурс, используя приведенные здесь ID. Вам не нужно писать никаких методов.
Имеется один дополнительный метод в виде булевской функции, CanUndo, который определяет, можно ли отменить последнюю операцию редактирования.
Реализация
Автоматическая реакция на меню редактирования обеспечивается механизмом передачи сообщений дочерних окон Windows, который сначала передает сгенерированное дочерним окном событие дочернему окну. В случае управления в виде дочернего окна, управление редко 
реагирует на сообщение и оно обрабатывается его родительским окном. Когда меню редактирования генерирует командное сообщение, оно поступает на управление редактированием, к которому привлечено внимание.
Управление запросами на редактирование
Иногда нужно организовать запрос к управлению редактированием для оценки введенного текста, записи ввода для его последующего использования или копирования ввода на другое управление. TEdit обладает рядом методов запросов. Многие из запросов управления р
едактированием и методов модификации возвращают или требуют вас указать номер строки или позицию символа в строке. Все эти индексы начинаются с нуля. Другими словами первая строка это нулевая строка, а первый символ в любой строке это нулевой символ. Сам
ыми важными методами запроса являются GetText, GetLine, NumLines и LineLength.
Вы можете заметить, что методы запросов TEdit, которые возвращают текст из управления редактированием, сохраняют форматирование текста. Это важно только для многострочных управлений редактированием, которые допускают появление нескольких строк текста. В 
этом случае возвращаемый текст, который занимает несколько строк в управлении редактированием содержит в конце каждой строки два дополнительных символа: возврат каретки (#13) и смена строки (#10). Если этот текст снова помещается в управление редактирова
нием, вставляется из буфера вырезанного изображения, записывается в файл или выводится на принтер, то строки прерываются так, как это было в управлении редактированием. Следовательно, при использовании метода запроса для получения определенного числа сим
волов, нужно учитывать эти два символа, которые заканчивают строку.
GetText ищет текст в управлении редактированием. Он заполняет строку, на которую указывает переданный аргумент PChar, содержимым управления редактированием, включая разрывы строк. Общее число символов задается вторым параметром. Он возвращает значение Fa
lse, если управление редактированием пусто или содержит текста больше, чем помещается в предоставленную строку. Следующая процедура берет текст из управления редактированием и помещает его в аргумент RetText:
procedure TTestWindow.ReturnText(RetText: PChar);
var TheText: array[0..20] of Char;
begin
 if EC1^.GetText(@TheText, 20) then
  RetText:=@TheText
 else RetText:=nil;
end;
GetLine более специализирован, чем GetText. В многострочном управлении редактированием он возвращает текст строки, заданной целым аргументом. Строка 0 это первая строка.
NumLines возвращает число строк, введенных в многострочное управление редактированием. До получения строки с помощью GetLine нужно использовать Lines для определения количества введенных строк в управление редактированием.
LineLength возвращает число символов в заданной строке в многострочном управлении редактированием. Если строка существует, но в ней нет символов, то LineLength возвращает ноль. Для успешного получения текста из многострочного управления редактированием н
ужно совместно использовать LineLength, NumLines и GetLine.
procedure TestWindow.ReturnLineText(RetText: PChar; LineNum:
 Integer);
var
 TheText: array[0..20] of Char;
begin
 RetText:=nil;
 if EC1^.NumLines >= LineNum then
  if EC1^.LineLength(LineNum) < 11 then
   if EC1^.GetLine(@TheText, 20, LineNum) then
    RetText:=@TheText;
end;
GetSubText это другой метод, более специализированный, чем GetText. Он берет в качестве аргументов PChar и две целые величины, которые представляют собой начальный и конечный индекс (диапазон) текста управления редактированием. Первый символ имеет индекс
 ноль. GetSubText возвращает строку символов, расположенных между указанными индексами. В многострочном управлении редактированием индекс последовательно отсчитывается начиная с первой строки на последующие. Окончание строки считается за два символа. Это
 позволяет вашей программе изменять формат текста управления редактированием при его отображении, распечатке, передаче его в другие управления редактированием и помещении его в буфер вырезанного изображения.
У вас может возникнуть вопрос о том, как можно получить индексы для их передачи в качестве аргументов в вызове метода GetSubText. Один из вариантов состоит в использовании метода GetSelection, который возвращает начальный и конечный индекс только что выб
ранного или подсвеченного текста. Обычно текст выбирается пользователем, но он может быть выбран и программой, используя SetSelection (см. "Изменение управления редактированием"). Последний возвращаемый GetSelection индекс это индекс последнего выбранног
о символа плюс один.
В приложении вы можете сократить время на обработку текста в управлении редактированием. Булевская функция метода IsModified возвращает True, если пользователь изменил текст в управлении редактированием, и False - если нет. Если возвращается False, то не
т необходимости вызывать GetText и GetLine. ClearModify вызывает смену флага на False.
Два метода, LineIndex и GetLineFromPos, можно использовать только для выяснения местоположения текста в многострочном управлении редактированием. LineIndex возвращает число символов (включая два на окончание строки) во всех строках, которые предшествуют 
строке, заданной целым аргументом. Если указанной строки нет, то возвращается число всех символов редактирования. GEtLineFromPos берет индекс позиции символа и возвращает номер строки, в которой появляется эта позиция. Оба эти метода очень удобны для зап
росов относительно структуры строк и их содержимого в многострочном управлении редактированием.
Изменение управления редактированием
Для традиционной программы ввода текста вам может не потребоваться непосредственно модифицировать управление редактированием. Пользователь модифицирует текст, а программа считывает этот текст методом запроса. Однако, во многих других случаях использовани
е управления редактированием требует, чтобы ваше приложение явно заменяло, вставляло, удаляло и выбирало текст. ObjectWindows обеспечивает подобное поведение и кроме того предоставляет возможность форсировать управление редактированием на прокрутку.
Удаление текста
Clear просто удаляет введенный в управление редактированием текст. Вы можете использовать его как часть операций сброса, которые очищают некоторые или все управления редактированием в окне. DeleteSelection удаляет текущий выбранный текст управления редак
тированием. Полный текстовый редактор может обеспечить доступ к Clear и DeleteSelection из меню (см. "Буфер вырезанного изображения и операции редактирования"). DeleteSelection это булевская функция, которая возвращает False, если не имеется текущего выб
ранного текста.
DeleteSubText аналогична DeleteSelection за исключением того, что она удаляет текст между двумя указанными позициями. Удаляется текст, включая символ в начальной позиции, но символ в конечной позиции остается.
DeleteLine удаляет весь текст в заданной строке. Однако, два символа заканчивающие строку не удаляются. Следовательно, все остальные строки остаются без изменений.
Вставка текста
Insert аналогично Paste за исключением того, что вставляемый текст берется из передаваемого аргумента, а не из буфера вырезанного изображения. Она удаляет любой существующий выбранный текст, но не подсвечивает вставленный текст. Используя Insert вы может
е реализовать под управлением программы ваш собственный буфер вырезанного изображения, предназначенный только для текста.
SetText выполняет комбинацию действий Clear и Insert. Он удаляет содержимое управления редактированием и вставляет текст из переданного аргумента. SetText кроме того может использоваться в операциях сброса. Например, чтобы переключить экран системы ввода
 заказов на преимущественный ввод заказов из Калифорнии, вы должны вызвать:
StateField^.SetText('CA');
для сброса поля ввода state (штат).
Форсированный выбор текста и прокрутка
SelectRange форсирует выбор или подсвечивание текста между переданными позициями, за исключением символа в завершающей позиции.
Scroll форсирует прокрутку в многострочном управлении редактированием. Scroll берет два целых аргумента: число символов горизонтальной прокрутки и число строк вертикальной прокрутки. Положительное целое задает прокрутку направо или вниз, а отрицательное 
- налево или вверх. Вертикальная прокрутка имеет место только для многострочных управлений редактированием.
Пример программы: EditTest
EditTest это программа, которая помещает на экран головное окно, которое будет родительским для двух управлений редактированием, двух статических управлений и кнопки. Данное окно показано на Рис.12.9.
Когда пользователь нажимает кнопку, текст из левого управления редактированием (EC1) копируется в правое управление редактированием (EC2). В EC2 текст преобразуется в прописные буквы, поскольку оно было сконструировано со стилем es_UpperCase. Если в EC1 
никакой текст не выбран, то в EC2 копируется весь текст. Если в EC1 выбран некоторый текст, то будет скопирован именно он.
Меню редактирования обеспечивает функции редактирования независимо от того, с каким управлением редактирования идет работа.
Полный файл EDITTEST.PAS и файл ресурса EDITTEST содержатся на ваших дистрибутивных дискетах.
Комбинированные блоки
Комбинированный блок управления является сочетанием двух других управлений: блока списка и управления редактированием. Он служит тем же целям, что и блок списка - он позволяет пользователю выбрать один элемент списка из прокручиваемого списка элементов т
екста, нажимая кнопку на мыши. Управление редактированием, вынесенное в верхнюю часть блока списка предоставляет иной механизм выбора, позволяя пользователю ввести текст нужного элемента. Если отображается область блока списка комбинированного блока, то 
автоматически выбирается нужный элемент. Тип TComboBox происходит от типа TListBox и наследует его методы модификации, запроса и выбора элементов списка. Кроме того, TComboBox предоставляет методы по манипулированию списком, находящемся в комбинированном
 блоке, который в некоторых случаях может раскрываться по запросу.
Три типа комбинированных блоков
Имеются три типа комбинированных блоков: простые, раскрывающиеся и раскрывающиеся списком. На Рис.12.11 показано появление трех типов комбинированных блоков с блоком списка.
Рис.12.11. Три типа комбинированных блоков и блок списка
Простые комбинированные блоки
Все комбинированные блоки постоянно отображают свои области редактирования. Однако, некоторые комбинированные блоки блоки могут показывать и прятать их область блока списка, как это делает черепаха, высовывая и пряча свою голову в панцире. Простой комбин
ированный блок не может прятать свою область блока списка. Она отображается всегда. Его область редактирования ведет себя точно так же, как управление редактированием. Пользователь может вводить и редактировать текст и этот текст может и не соответствова
ть элементам списка. Но если он соответствует, то выбирается этот элемент списка.
Опускающиеся комбинированные блоки
Опускающиеся комбинированные блоки ведут себя аналогично простым комбинированным блокам, но с одним исключением. В начальной стадии работы их область списка не отображается. Она появляется, когда пользователь нажимает стрелку вниз, расположенную справа о
т области редактирования. Опускающиеся комбинированные блоки и опускающиеся комбинированные блоки списков очень удобны, когда нужно поместить большое число управлений в маленькую область. Когда они не используются, они занимают значительно меньшую площад
ь, чем простой комбинированный блок или блок списка.
Опускающиеся комбинированные блоки списков
Область списка в опускающемся комбинированном блоке списка ведет себя подобно области списка в опускающемся комбинированном блоке - появляется при необходимости и исчезает, когда не нужна. Эти два типа комбинированных блоков отличаются поведением их обла
стей редактирования. Опускающиеся области редактирования ведут себя подобно обычным управлениям редактированием. Опускающиеся области редактирования списка ограничиваются только отображением одного элемента списка. Если редактируемый текст соответствует 
элементу списка, то никаких дополнительных символов ввести нельзя.
Выбор типа комбинированного блока
Опускающиеся комбинированные блоки списка удобно использовать тогда, когда не допускаются никакие другие варианты, кроме перечисленных в области списка. Например, при выборе принтера для печати можно выбрать только принтер, к которому есть доступ с вашей
 системы (см. Рис.12.12).
Рис.12.12. Опускающийся комбинированный блок списка
С другой стороны, опускающиеся комбинированные блоки могут воспринимать выбор, который отличается от приведенных в списке элементов. Опускающийся комбинированный блок можно использовать для выбора дисковых файлов при их открытии или записи. Пользователь 
может либо просматривать каталоги в поисках нужного файла, либо ввести полную траекторию и имя файла в области редактирования, независимо от того, присутствует ли это имя файла в области списка. См. Рис.12.13.
Рис.12.13. Простой комбинированный блок
Конструирование комбинированных блоков
Конструктор Init для TComboBox берет родительское окно, ID, X, Y, W и H, стиль и максимальную длину текста в качестве своих аргументов. Все конструируемые Init комбинированные блоки имеют стили ws_Child, ws_Visible, cbs_AutoHScroll, cbs_Sort (отсортирова
нный список), и VScroll (вертикальная линейка прокрутки). Параметр стиля это один из стандартных стилей комбинированных блоков Windows: cbs_Simple, cbs_DropDown или cbs_DropDownList. Параметр длины текста работает подобно соответствующему параметру управ
ления редактированием, ограничивая число символов, которые можно ввести в область редактирования комбинированного блока. Следующие строки приведут к созданию опускающегося комбинированного блока списка с неотсортированным списком:
CB3:=New(PComboBox, Init(@Self, id_CB3, 190, 160, 150, 100,
 cbs_DropDownList, 40));
CB3^.Attr.Style:=CB3^.Attr.Style and (not cbs_Sort);
Модификация комбинированных блоков
TComboBox определяет два метода для демонстрации и убирания области списка в опускающихся комбинированных блоках и опускающихся комбинированных блоках списка: ShowList и HideList. Обе эти процедуры не нуждаются в аргументах. Не нужно вызывать эти методы 
для демонстрации или убирания списка, когда пользователь нажимает стрелку вниз справа от области редактирования. В этом случае работает автоматический механизм комбинированных блоков. Эти методы полезны только для форсирования демонстрации или убирания с
писка.
Пример приложения: CBoxTest
Программа CBoxTest реализует приложение, показанное на Рис.12.11. В нем использованы все три типа комбинированных блоков. CB1 это простой комбинированный блок, CB2 это опускающийся комбинированный блок, а CB3 это опускающийся комбинированный блок списка.

Нажатие кнопок Show и Hide форсирует демонстрацию и удаление правого верхнего комбинированного блока, CB3, путем вызова методов ShowList и HideList.
Полный текст файла CBOXTEST.PAS содержится на ваших дистрибутивных дискетах.
Установка управляющих величин
Для управления сложными блоками диалога или окнами с множеством дочерних окон управления вы обычно можете создать производный тип объекта, для хранения и выяснения состояния его управлений. Состояние управление включает в себя текст управления редактиров
анием, положение линейки прокрутки и проверена ли кнопка выбора. В качестве альтернативы: вы можете не определять производный объект, а определить соответствующую запись, представляющую состояние управлений окна или диалога. Эта запись называется буфером
 передачи, поскольку легко передает информацию о состоянии между буфером и набором управлений.
Например, ваша программа может иметь модальный блок диалога и, после его закрытия, выделить информацию из буфера передачи относительно состояния каждого из его управлений. Следовательно, при повторном вызове пользователем блока диалога, его управления бу
дут выставлены в соответствии с их состоянием перед последним закрытием диалога. Кроме того, вы можете установить начальное состояние каждого из управлений на основании данных буфера передачи. Вы можете явно передавать данные в любом направлении в любой 
момент времени, например, установить значения управлений равными их предыдущим значениям. Окно или немодельный блок диалога с управлениями также могут использовать механизм передачи для установки или выяснения информации о состоянии в любой момент времен
и.
Механизм передачи требует использования объектов ObjectWindows для представления управлений, для которых вы будете передавать данные. Это означает, что вы должны использовать InitResource для связывания объектов с управлениями в блоках и окнах диалога.
Определение буфера передачи
Буфер передачи это запись с одним полем для каждого управления, участвующего в передаче. Окно или диалог могут также иметь управления, значения которых не устанавливаются механизмом передачи. Например, кнопки нажатия, у которых нет состояния, не участвую
т в передаче. Аналогично для блоков групп. 
Для определения буфера передачи нужно определить поле для каждого участвующего управления диалога или окна. Не нужно определять поля для каждого управления диалога или окна, а нужно лишь определить поля для тех из них, которые будут получать и принимать 
значения по вашему желанию. Этот буфер передачи хранит один из каждых типов управления, кроме кнопки нажатия и блока группы:
type
 SampleTransferRecord=record
  Stat1: array[0..TextLen-1] of Char; {статический текст}
  Edit1: array[0..TextLen-1] of Char; {текст управления редактированием}
  List1Strings: PStrCollection; {строки блока списка}
  List1Selection: Integer; {индекс выбранных строк}
  ComboStrings: PStrCollection; {строки комбинированного блока}
  ComboSelection: array[0..TextLen-1] of Char; {выбранные строки}
  Check1: Word; {проверка состояния блока}
  Radio1: Word; {состояние кнопки выбора}
  Scroll1: ScrollBarTransferRec; {диапазон линейки прокрутки и т.д.}
end;
Как вы можете видеть, тип управления определяет тип поля, определяемого для буфера передачи. Это происходит из-за того, что для каждого типа управления нужно хранить разную информацию:
- Статические управления хранят массив символов длиной равной   максимально допустимой длине текста плюс завершающий пустой символ.
- Управления редактированием хранят буфер текста управления   редактированием, длина определяется полем TextLen.
- Блоки списка и комбинированные блоки хранят набор строк списка   плюс индикатор выбранного элемента или элементов. Для блока списка с единственным выбором это просто целый индекс выбранной строки. Для блока списка с возможность нескольких выборов это з
апись, содержащая индексы всех выбранных элементов. А для комбинированных блоков это сама выбранная строка.
- Состояние блока проверки и кнопки выбора хранятся в виде значений Word, с индикаторами состояний bf_Unchecked, bf_Checked и bf_Grayed. 
- Линейки прокрутки используют другую запись,ScrollBarTransferRec, для хранения диапазона и позиции управления линейки прокрутки. Приведем определение ScrollBarTransferRec:
ScrollBarTransferRec:=record
 LowValue: Integer;
 HighValue: Integer;
 Position: Integer;
end;
Определение соответствующего диалога или окна
Окно или диалог, которые используют буфер передачи, должны конструировать объекты участвующего управления в той последовательности, в которой определяются их соответствующие поля буфера передачи. Для подключения механизма передачи к объекту окна или диал
ога нужно просто установить значение его поля TransferBuffer на указатель к определенному вами буферу передачи.
Для случая окон с управлениями объекты управления конструируются с использованием Init. Для диалогов и окон диалогов нужно использовать конструктор InitResource. Например:
type
 SampleTransferRecord=record
 ...
 PParentWindow=^TParentWindow;
 TParentWindow=object(TWindow)
  TheDialog: PDialog;
  TheBuffer: SampleTransferRecord;
  ...
constructor TParentWindow.Init(AParent: PWindowsObject; ATitle:
 PChar);
var
 Stat1: PStatic;
 Edit1: PEdit;
 List1: PListBox;
 Combo1: PComboBox;
 Check1: PCheckBox;
 Radio1: PRadioButton;
 Scroll1: PScrollBar;
begin
 TWindow.Init(AParent, ATitle);
 TheDialog^.Init(@Self, PChar(101));
 New(Stat1, InitResource(TheDialog, id_Stat1));
 New(Edit1, InitResource(TheDialog, id_Edit1));
 New(List1, InitResource(TheDialog, id_List1));
 New(Combo1, InitResource(TheDialog, id_Combo1));
 New(Check1, InitResource(TheDialog, id_Check1));
 New(Radio1, InitResource(TheDialog, id_Radio1));
 New(Scroll1, InitResource(TheDialog, id_Scroll1));
 TheDialog^.TranssferBuffer:=@TheBuffer;
end;
Для случая окна с управлениями используйте Init, а не InitResource, для конструирования объектов управления в надлежащей последовательности. Другое отличие между диалогами и окнами состоит в том, что механизм передачи по умолчанию запрещен для управлений
 окна. Для разрешения использования механизма вызывается EnableTransfer:
...
Edit1:=New(PEdit, Init(@Self, id_Edit1, '', 10, 10, 100, 30,
 40, False));
Edit1^.EnableTransfer;
...
Для явного исключения управления из механизма передачи после его конструирования вызывается метод DisalbleTransfer.
Передача данных
После создания окна или диалога (включая выполнение модальных диалогов) данные автоматически передаются из буфера передачи на набор участвующих управлений.
Только для модального диалога данные автоматически передаются из управлений в буфер передачи, когда диалог принимает командное сообщение с ID управления id_OK. Поскольку этот ID обычно возвращается, когда пользователь нажимает кнопку OK для окончания диа
лога, диалог автоматически изменяет свой буфер передачи. Затем, если диалог выполняется еще раз, данные из буфера снова передаются на управление. По этой схеме диалог и буфер работают синхронно.
Однако, вы можете явно передавать данные в любом направлении в любой момент времени. Например, вы можете передать данные из управлений окна или немодального диалога. Вы также можете сбросить состояния управлений, используя данные буфера передачи, в ответ
 на нажатие пользователем кнопки Reset (сброс). В обоих случаях используется метод TransferData. Константа tf_SetData обозначает передачу данных из буфера на управление, а константа tf_GetData - передачу в другом направлении. Например, вы можете вызвать 
TransferData в методе Destroy объекта окна:
procedure TSampleWindow.Destroy;
begin
 TransferData(tf_GetData);
 TWindow.Destroy;
end;
Обеспечение передачи соответствующего управления
Вы можете изменить способ передачи данных конкретного управления или включить новое управление, определенное вами в механизме передачи. В обоих случаях вам просто нужно написать метод Transfer для вашего объекта управления, который если установлен флаг t
f_GetData копирует данные из управления в место, задаваемое указателем. Если установлен флаг tf_SetData, то просто скопируйте данные по заданному указателю в управление. Рассмотрим в качестве примера TStatic.Transfer:
function TStatic.Transfer(DataPrt: Pointer; TransferFlag: Word):
 Word;
begin
 if TransferFlag=tf_GetData then
  GetText(DataPrt, TextLen)
 else if TransferFlag=tf_SetData then
  SetText(DataPtr);
 Transfer:=TextLen;
end;
Метод Transfer должен всегда возвращать число переданных байт информации.
Пример передачи
Головное окно программы TranTest воспроизводит модальный диалог с полями, в которые пользователь вводит данные об имени и адресе. Буфер передачи используется для хранения этой информации и отображения ее в управлениях диалога при повторном его выполнении
. Обратите внимание на то, что нам не нужно определять новый тип объекта диалога для установки и поиска данных диалога. Также обратите ваше внимание на то, что мы непосредственно манипулируем данными буфера передачи, поэтому статическое управление при пе
рвом появлении диалога гласит "First Mailing Label" (первый ярлык адреса), а при всех остальных появлениях "Subsequent Mailing Label" (следующий ярлык адреса). 
Полный текст программы содержится в файле TRANTEST.PAS на ваших дистрибутивных дискетах.



Яндекс цитирования