Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
Comments := 'Автор Советов по Delphi';
Salary := 999000.00;
end;
aList.Add(aRecPtr);
aList.Add(…);
…
for I := 1 to aList.Count do begin
aRecPtr := PMyRec(aList.Items[I-1]);
{что-то делаем с записью}
end;
{теперь избавляемся от всех записей и самого списка-объекта}
for I := 1 to aList.Count do Dispose(PMyRec(aList.Items[I-1]));
aList.Free;
end;
Динамические массивы VIII
Иногда разработчик, работая с массивами, не знает какого размера массив ему нужен. Тогда Вам пригодится использование динамических массивов.
var intArray : array of integer;
При таком объявлении размер массива не указывается. Что бы использовать его дальше необходимо определить его размер (обратите внимание, что размер динамического массива можно устанавливать в программе):
begin
intArray:=(New(IntArray,100); //Размер массива? 100
end;
Igor Nikolaev aKa The Sprite
Пример массива констант (Array of Const) III
Delphi 1
procedure foo(a : array of const);
implementation
var
var1: longint;
var2: pointer;
var3: integer;
begin
var1 := 12345678;
var2 := @var1;
var3 := 1234;
foo([var1, var2, var3]);
В действительности, массив array of const более корректным было бы назвать массивом array of tvariant. Tvariant — множественный выбор типов переменной, в которой можно задать номер типа. В Visual Basic у него имеется наследник. Delphi также позволяет использовать имена.
Определите тип, например, так:
TYPE NAME1 = Array[1..4,1..10] of Integer;
Затем, в вашей секции CONST:
NAME2: NAME1 = ((1,2,3,4,5,6,7,8,9,10),
(1,2,3,4,5,6,7,8,9,10),
(1,2,3,4,5,6,7,8,9,10),
(1,2,3,4,5,6,7,8,9,10));
Массив объектов-изображений
Delphi 1
Вы не сможете сделать это напрямую и "визуально", но если вы не возражаете против нескольких строк кода, то я покажу как это может быть просто:
type
TForm1 = class(TForm)
…
public
images: array [1..10] of TImage;
…
end;
procedure TForm1.FormCreate(…);
var i: integer;
begin
…
for i := 1 to 10 do begin
images[i] := TImage.Create(self);
with images[i] do begin
parent := self;
tag := i; { это облегчит идентификацию изображения }
… установите другие необходимые свойства, например:
OnClick := MyClickEventHndlr;
end;
end;
…
end;
Для того, чтобы убедиться, что все модули в секции «uses» установлены правильно, бросьте на форму один такой динамический компонент, и затем удалите его, или установите его видимость в False. Более сложный способ заключается в разработке собственного компонента, делающего описанное выше.
Массив TPOINT
Delphi 1
Const ptarr : Array[0..4] Of TPoint =((x:0; y:4), … (x:4; y:4));
Создание больших массивов
Delphi 1
В 16-битной версии Delphi нельзя сделать это непосредственно. В новой, 32-битной версии, это как-то можно сделать, но за два месяца колупания я так и не понял как. (Некоторые бета-тестеры знают как. Не могли бы они сообщить нам всю подноготную этого дела?)
В 16-битной версии Delphi вам необходимо работать с блоками по 32K или 64K и картой. Вы могли бы сделать приблизительно следующее:
type
chunk: array[0..32767] of byte;
pchunk: ^chunk;
var BigArray: array[0..31] of pChunk;
Для создания массива:
for i := 0 to high(bigarray) do new (bigArray[i]);
Для получения доступа к n-ному байту в пределах массива (n должен иметь тип longint):
bigArray[n shr 15]^[n and $7fff] := y;
x := bigArray[n shr 15]^[n and $7fff];
Это даже осуществляет проверку выхода за границы диапазона, если вы установили в ваших настройках опцию «range checking»!
n должен находиться в диапазоне [0..32*32*1024] = [0..1024*1024] = [0..1048576].
Для освобождения массива после его использования необходимо сделать следующее:
for i := 0 to high(bigarray) do dispose (bigArray[i]);
Свойства
Редактор свойств для точки
TPoint не имеет информацию о типе, следовательно, вы не можете зарегистрировать для него редактор свойства. Вы можете иметь редактор свойств только для строк, реальных, порядковых чисел или указателей на объекты. Дело в том, что редактор свойств имеет только следующие методы, чтобы иметь доступ к свойствам через RTTI:
GetValue/SetValue для строк (strings)
GetFloatValue/SetFloatValue для натуральных чисел (floats)
GetOrdValue/SetOrdValue для порядковых (и указателей)
Решением может быть создание класса TPersistentPoint, являющегося наследником TPersistent и имеющего те же свойства, что и TPoint. Вы можете просто «обернуть» TPoint для хранения значений, или создать явные поля. Непосредственное использование TPoint сделает использование метода Assign легким и быстрым для кодирования. Для процедур чтения и записи вы можете использовать поля записи, как показано ниже:
type TPersistentPoint = class(TPersistent)
private
FPoint: TPoint;
published
property X : integer read FPoint.X write FPoint.X;
property Y : integer read FPoint.Y write FPoint.Y;
end;
– Mike Scott
Хитрость вызова редактора свойств
Я пишу редактор для свойства TStrings. В зависимости от значений других свойств, я хотел бы показывать или свой редактор свойства, или редактор свойства TStringListProperty, заданный по умолчанию, но я не знаю как передавать управление TStringListProperty...
Сделайте ваш редактор свойства наследником TStringListProperty (добавьте STREDIT в список используемых модулей) и согласно вашим обстоятельствам вызывайте метод предка Edit:
Unit MyEditor;
interface
uses STREDIT;
type TMyStringListProperty = class(TStringListProperty)
procedure Edit; override;
end;
implementation
procedure TMyStringListProperty.Edit;
begin
if { какие-то условия } then { что-то делаем }
else inherited Edit;
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
function getattributes: TPropertyattributes; override;
procedure Edit; override;
end;
добавьте функцию регистрации…
RegisterPropertyEditor(Typeinfo(String), TMyComponent, 'Filename', TFileNameProperty);
и код…
function TFileNameProperty.GetAttributes;
begin
Result := [paDialog];
end;
Procedure TFilenameProperty.edit;
var
MFileOpen: TOpenDialog;
begin