KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по 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

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*