Архив за апреля, 2008

Apr20

Утечки памяти в Delphi

memoryleak

Сегодняшняя запись, в основном, для тех, кто недавно начал программировать в Delphi, т.к. "старики", в большинтве своем, знают о подобном инструменте.

Читать далее »

Apr18

О чем не пишут в книгах по Delphi

Эту книгу я купил только из-за главы, посвященной сокетам (кстати, она самая большая в книге - 198 страниц). Но, как оказалось, в ней очень много другого полезного материала. Например, "подводные камни" - описание ошибок или неожиданных действий компилятора. Честно говоря, хочется привести выдержки из книги, но примеры там очень большие по объему (т.к. описываются досканально), а приводить их к урезанному варианту не вижу смысла - многое необходимое будет опущено. К сожалению, я не смог найти, где можно скачать книгу, т.ч. если кто знает - отпишите в комментариях.

Apr16

Const в функциях

Если в функцию передаете строку и в самой функции эта строка не изменяется - объявляйте ее как const. В большинстве случаев это исключает скрытое добавление try..finally, а значит немного ускоряет работу функции.

Если не применять ключевое слово const, компилятор будет считать, что строка, возможно, будет меняться в функции, и добавляет скрытыю локальную переменную для хранения строки, т.е. получается примерно следующее:

function FuncName(AStr: string): Integer;

var

lOldStr: string;

begin

lOldStr := AStr;

try

// Тут код функции

finally

AStr := lOldStr;

end;

end;

Я для себя провел небольшой тест и получилось, что при использовании const функция работает на 3-5% быстрее.

Apr15

Градиентная заливка

В DRKB и DelphiWorld есть примеры заполнения канвы градиентом. От самой простой до довольно профессиональной. Но ведь эта функция уже есть в GraphUtil, "зачем изобретать велосипед"?

uses
GraphUtil;

procedure PaintGradient(ACanvas: TCanvas; AColor: TColor; ARect: TRect; ADirection: TGradientDirection);
var
lColor: TColor;
begin
lColor := GetHighLightColor(AColor, 50);
GradientFillCanvas(ACanvas, lColor, AColor, ARect, gdVertical);
end;

Данная функция нарисует квадрат, заполненный градиентом, несмотря на то, что ей передается только один цвет. Не верите? Проверьте ;).

Вообще, советую получше изучать стандартные модули - в них, как я уже говорил, много полезного.

 

Apr14

Finalize

Я часто работаю с VirtualTreeView. Очень удобный и мощный компонент, да еще бесплатный и с открытым кодом. Работу с данными я обычно веду следующим образом:

type

PData = ^TData;

TData = record

Caption: WideString;

Data: WideString;

Count: Integer;

end;

var

lData: PData;

begin

lData := VT.GetNodeData(Node);

if Assigned(lData) then

begin

// Тут код

end;

end;

Т.е., все данные храню в самом дереве. Знаю, что это не самый лучший способ. Например, во многих случаях, особенно когда необходима не стандартная сортировка или нестандартная обработка данных, правильнее было бы хранить данные в отдельном массиве, а в дереве держать только указатели на нужные данные, но так уж я привык.

Читать далее »

снол
-->