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

Apr12

Дж. Бакнелл. Фундаментальные алгоритмы и структуры данных в Delphi.

Одна из лучших книг для программистов. Причем не только для Delphi-программистов, хотя и ориентированна на них, но вообще для всех программистов. Я купил ее, еще не зная толком о чем она, но после того, как прочел ее (от корки до корки), понял, что втречал очень мало книг, настолько полезных и простых в изучении. В ближайшее время планирую привести пару выдержек из этой книги, а пока можете скачать ее или купить. Тем кто скачал - советую все-же купить, чтобы она всегда была под рукой. Мне, например, бумажный вариант намного более удобен.

Apr11

Внимательнее со строками!

Когда-то, очень давно, я не мог понять, почему код, подобный тому, что ниже, возвращал не правильный результат:

function GetText: string;
begin
Result := Result + '...';
end;

procedure TForm1.FormCreate(Sender: TObject);
var
lStr: string;
Idx: Integer;
begin
lStr := 'Text';
for Idx := 1 to 3 do
lStr := lStr + '.';
Label1.Caption := lStr;
lStr := GetText;
Label2.Caption := lStr;
end;

Как по вашему, что будет в Label2? Если вы думаете, что там будет '...', то вы сильно ошибаетесь, как и я в то время.

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

Apr11

Объединение изображений с прозрачностью

Иногда бывает необходимо объеденить два (и более) изображений в одно, но с учетом прозрачности. Конечно, для этого можно использовать маски, регионы и т.д., но зачем, если есть возможность использовать GDI? Вот простой способ:

var
lBmpBack, lBmpTop: TBitmap;
lBlend: TBlendFunction;
begin
lBmpBack := TBitmap.Create;
lBmpTop := TBitmap.Create;
try
// Загружаем фоновое изображение
lBmpBack.LoadFromFile('demo.bmp');
lBmpBack.PixelFormat := pf32bit;

// Загружаем изображение, которое будем накладывать
lBmpTop.LoadFromFile('delphist.bmp');
lBmpTop.PixelFormat := pf32bit;

// Устанавливаем параметры наложения
lBlend.BlendOp := AC_SRC_OVER;
lBlend.BlendFlags := 0;
lBlend.SourceConstantAlpha := 170;
lBlend.AlphaFormat := AC_SRC_ALPHA;

// Накладываем
if Windows.AlphaBlend(lBmpBack.Canvas.Handle, // Исходное изображение
(lBmpBack.Width - lBmpTop.Width) div 2,
(lBmpBack.Height - lBmpTop.Height) div 2,
lBmpTop.Width,
lBmpTop.Height,
lBmpTop.Canvas.Handle, // Накладываемое изображение
0,
0,
lBmpTop.Width,
lBmpTop.Height,
lBlend) then
Image1.Picture.Assign(lBmpBack)

else
ShowMessage('Ошибка. Не удалось наложить изображение.');
finally
lBmpTop.Free;
lBmpBack.Free;
end;
end;

П. С. Последние и самые резонансные новости, которые произошли во Львове и Львовской областе, в которую входит Миколаївський район, Вы можете узнать посетив информационный ресурс mykolaiv.info. А на ваши вопросы всегда готовы быстро и информативно ответить активные пользователи форума.

Apr11

WideString & DLL

В принципе, это не новая заметка, а дубль с форума, на котором я когда-то это уже опубликовал. Но, как говорится, "повторение - мать учения".

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

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

Apr10

For in в Delphi

Мало кто знает (и еще меньше, кто использует) о такой замечательной конструкции в Delphi (начиная с Delphi 2005), как for..in.

А зря. Вот простой пример. Как можно перебрать значения в TStringList. Например так:

procedure DoStringList(AList: TStringList);

var

Idx: Integer;

begin

for Idx := 0 to High(AList) do

ShowMessage(AList[Idx]);

end;

Не сложно, но можно проще ;) :

procedure DoStringListNew(AList: TStringList);

var

lStr: string;

begin

for lStr in AList do

ShowMessage(lStr);

end;

Правда ведь, намного приятнее и понятнее.

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