Падтрымка буфера

Материал из GedeminWiki
Версия от 20:26, 5 октября 2007; SYSDBA (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

У базавы клас TgdcBase закладзена падтрымка аперацыяў з буферам абмена (капіраваньне, альбо выразаньне аб'екта, ці аб'ектаў і змяшчэньне іх у буфер, а таксама ўстаўка аб'ектаў з буфера).

За капіраваньне аб'ектаў у буфер адказвае метад CopyToClipboard. Ен мае два параметры. Першы, сьпіс закладак запісаў, якія трэба скапіраваць з бягучага датасету ў буфер. Можа быць НІЛ, у гэтым выпадку толькі бягучы запіс з датасэта трапіць ў буфер. Другі параметр -- булеўская велічыня, якая паказвае: трэба "выразаць" запісы ці капіраваць. Па ўмаўчаньню другі параметр мае значэньне Ілжа. Метад чакае, што датасет адкрыты і ў ім ёсць прынамсі адзін запіс.

Для ўстаўкі запісаў з буферу неабходна вызваць метад PasteFromClipboard. Гэты метад не мае параметраў і вяртае Посьпех, альбо Няўдачу ў залежнасці ад таго сапраўды адбылася ўстаўка запісаў, ці не (былі памылкі, буфер ня меў адпаведных дадзеных і г.д.).

Каб праверыць, ці ёсць у буферы дадзеныя, прыдатныя для ўстаўкі, трэба выклікаць функцыю CanPasteFromClipboard, якая вяртае адпаведнае булеўскае значэньне.

Як гэта працуе

Структура TgdcClipboardData

Для перадачы дадзеных праз буфер Гедымін мае свой адмысловы фармат, які рэгіструецца пры запуску сістэмы і ягоны ідэнтыфікатар захоўваецца ў глабальнай зьменнай gdcClipboardFormat, аб'яўленнай у модулі gdcBase.pas.

Праз буфер перадаецца структура тыпу TgdcClipboardData, аб'яўленная наступным чынам:

 TObjectData = record
   ID: TID;
   ObjectName: array[0..63] of Char;
   ClassName: array[0..63] of Char;
   SubType: array[0..63] of Char;
 end;

 TObjectArr = array[0..0] of TObjectData;

 PgdcClipboardData = ^TgdcClipboardData;

 TgdcClipboardData = record
   Signature: Longint;
   Version: Longint;
   ClassName: array[0..63] of Char;
   SubType: array[0..63] of Char;
   Obj: TgdcBase;
   Cut: Boolean;
   ObjectCount: Integer;
   ObjectArr: TObjectArr;
 end;

Палі Signature і Version выкарыстоўваюцца для спраўджваньня дадзеных, што знаходзяцца ў буферы. Бягучыя значэньні задаюцца канстантамі gdcCurrentClipboardSignature і gdcCurrentClipboardVersion.

Калі дадзеныя ў буферы сфармаваныя праз метад CopyToClipboard пэўнага бізнэс аб'екта, палі ClassName і SubType будуць утрымліваць імя ягонага класа і падтып. Поле Obj будзе утрымліваць спасылку на гэты аб'ект. Магчыма, што дадзеныя ў буфер трапяць не праз бізнэс аб'ект, у гэтым разе вышэй азначаныя палі будуць утрымліваць пустыя строкі, а поле Obj будзе раўняцца nil.

Cut паказвае якая аперацыя была выклікана: Капіраваньне, ці Выразаньне.

ObjectCount паказвае колькасць аб'ектаў, што перадаюцца праз буфер. Інфармацыя пра самі аб'екты передаецца ў масіве ObjectArr. Кожны элемент масіву -- гэта запіс тыпу TObjectData. Запіс утрымлівае інфармацыю пра ідэнтыфікатар, клас, падтып і імя перадаваемага аб'екта.

Запіс дадзеных у буфер

Функцыя CopyToClipboard выконвае ўсю неабходную працу па выдзяленьню блока памяці пад структуру TgdcClipboardData і запаўненьню яго дадзенымі. Паралельна з дадзенымі ва ўласным фармаце ў буфер запісваецца і тэкставы сьпіс ідэнтыфікатараў і імен аб'ектаў.

Калі датасэт закрыты, альбо пусты выклік функцыі прывядзе да выключнай сітуацыі EgdcException.

Перакрываць дадзены метад мае сэнс толькі, еслі будзе неабходна падтрымліваць нейкі іншы фармат дадзеных. Устаўка запісаў з буфера

Метад PasteFromClipboard правярае дадзеныя, што знаходзяцца ў буферы на карэктнасць і вызывае метад AcceptClipboard перадаваючы туды ўказальнік на структуру TgdcClipboardData. AcceptClipboard мусіць вярнуць Посьпех, калі аб'екты былі ўстаўленыя і Няўдачу, калі паўсталі нейкія перашкоды. У базавым класе AcceptClipboard ня робіць нічога. Гэты метад мусіць быць перакрыты ў нашчадках.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты