В 16-битной версии Delphi вам необходимо работать с блоками по 32K или 64K и картой. Вы могли бы сделать приблизительно следующее:
type
chunk: array[0..32767] ofbyte;
pchunk: ^chunk;
varBigArray: array[0..31] ofpChunk;
Для создания массива:
fori := 0 tohigh(bigarray) donew (bigArray[i]);
Для получения доступа к n-ному байту в пределах массива (n должен иметь тип longint):
bigArray[n shr15]^[n and$7fff] := y;
x := bigArray[n shr15]^[n and$7fff];
Это даже осуществляет проверку выхода за границы диапазона, если вы установили в ваших настройках опцию «range checking»!
n должен находиться в диапазоне [0..32*32*1024] = [0..1024*1024] = [0..1048576].
Для освобождения массива после его использования необходимо сделать следующее:
fori := 0 tohigh(bigarray) dodispose (bigArray[i]);
Редактор свойств для точки
TPoint не имеет информацию о типе, следовательно, вы не можете зарегистрировать для него редактор свойства. Вы можете иметь редактор свойств только для строк, реальных, порядковых чисел или указателей на объекты. Дело в том, что редактор свойств имеет только следующие методы, чтобы иметь доступ к свойствам через RTTI:
GetValue/SetValue для строк (strings)
GetFloatValue/SetFloatValue для натуральных чисел (floats)
GetOrdValue/SetOrdValue для порядковых (и указателей)
Решением может быть создание класса TPersistentPoint, являющегося наследником TPersistent и имеющего те же свойства, что и TPoint. Вы можете просто «обернуть» TPoint для хранения значений, или создать явные поля. Непосредственное использование TPoint сделает использование метода Assign легким и быстрым для кодирования. Для процедур чтения и записи вы можете использовать поля записи, как показано ниже:
typeTPersistentPoint = class(TPersistent)
private
FPoint: TPoint;
published
propertyX : integer readFPoint.X writeFPoint.X;
propertyY : integer readFPoint.Y writeFPoint.Y;
end;
– Mike Scott
Хитрость вызова редактора свойств
Я пишу редактор для свойства TStrings. В зависимости от значений других свойств, я хотел бы показывать или свой редактор свойства, или редактор свойства TStringListProperty, заданный по умолчанию, но я не знаю как передавать управление TStringListProperty...
Сделайте ваш редактор свойства наследником TStringListProperty (добавьте STREDIT в список используемых модулей) и согласно вашим обстоятельствам вызывайте метод предка Edit:
UnitMyEditor;
interface
usesSTREDIT;
typeTMyStringListProperty = class(TStringListProperty)
procedureEdit; override;
end;
implementation
procedureTMyStringListProperty.Edit;
begin
if{ какие-то условия } then{ что-то делаем }
else inheritedEdit;
end;
end.
- Pat Ritchey
Как убрать публичное свойство компонента/формы из списка видимых/редактируемых свойств в Инспекторе Обьектов?
Nomadicсоветует:
Из TForm property не убиpал, но из TWinControl было дело. А дело было так:
interface
type TMyComp = class(TWinControl)
…
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyPage', [TMyComp]);
RegisterPropertyEditor(TypeInfo(String),TMyComp,'Hint', nil);
end;
[ и т.д.]
Тепеpь property 'Hint' в Object Inspector не видно. Рад, если чем-то помог. Если будут глюки, умоляю сообщить. Такой подход у меня сплошь и pядом.
Свойство FileName в невизуальном компоненте
Следующий код взят из dsgnintf.pas (иногда стоит покопаться в файлах!) для свойства TMPLayer.filename, с помощью C.Calvert…
В заголовке модуля компонента…
TFileNameProperty = class(TStringProperty)
public
functiongetattributes: TPropertyattributes; override;
procedureEdit; override;
end;
добавьте функцию регистрации…
RegisterPropertyEditor(Typeinfo( String), TMyComponent, 'Filename', TFileNameProperty);
и код…
functionTFileNameProperty.GetAttributes;
begin
Result := [paDialog];
end;
ProcedureTFilenameProperty.edit;
var
MFileOpen: TOpenDialog;
begin
MFileOpen := TOpenDialog.Create(Application);
Читать дальше