Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 8 9 10 11 12 13 14 15 16 ... 123

  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

1 ... 8 9 10 11 12 13 14 15 16 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий