Apr27
категория:
Код автор:
admin |
Для календаря, который я делаю, мне понадобилось узнать, сколько недель затрагивает месяц. Решение пришло моментально:
Результат := Неделя_последнего_дня - Неделя_первого_дня;
В коде я оформил это так:
function GetWeekInMonth(ADate: TDate): Integer;
begin
Result := WeekOf(EndOftheMonth(ADate)) - WeekOf(StartOfTheMonth(ADate));
end;
Через полчаса понял, что решение не верное
.
Читать далее »
Apr26
категория:
Код автор:
admin |
Тестовый код:
var
W: WideString;
begin
W := 'я';
if W[1] = 'я' then
ShowMessage('Ok')
else
ShowMessage('Fail');
end;
Появляется надпись "Fail".
Читать далее »
Apr22
категория:
Код автор:
admin |
Хоть и ругают MS за большой объем операционной системы, но как много всего в ней. Например, в XP появилась функция MessageBoxTimeOut - это обычный MessageBox, но исчезающий через определенный промежуток времени.
Так как эта функция недокументированна, ее нельзя найти в модуле Windows.pas, но можно самому экспортировать:
MB_TIMEDOUT = 32000;
function MessageBoxTimeOut; external user32 name 'MessageBoxTimeoutA';
function MessageBoxTimeOutA; external user32 name 'MessageBoxTimeoutA';
function MessageBoxTimeOutW; external user32 name 'MessageBoxTimeoutW';
Читать далее »
Apr21
категория:
Код автор:
admin |
Когда я начинал изучение PHP, мне, после Delphi, понравилась одна функция - explode. Ее работа очень проста - разбить строку на подстроки. В Delphi, до этого, я делал примерно следующее:
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.Text := 'str1, str2, str3, str4, str5';
sl.Delimiter := ',';
// тут обрабатываем sl.Items
finally
sl.Free;
end;
end;
Все бы хорошо, но... Что делать, если разделителей несколько? Например, как разбить такую строку:
language: russian; delphi, php, c++; Ivanov
и получить следующее:
language: russian
delphi
php
c++
Ivanov
Да, можно, конечно, разбить строку, а потом разбивать подстроки. Можно использовать регулярки. Но, как я уже писал - я противник использования, для таких случаев, регулярных выражений. Да и рекурсию/множество циклов использовать не люблю. И, как оказалось, не только я. В Delphi есть стандартная функция для разбиения строки на подстроки, совсем как в PHP
.
Читать далее »
Apr21
категория:
Код автор:
admin |
Иногда возникает необходимость сравнить строку с каким-то шаблоном, например соответствует ли домен (http://delphist.ru) маске доменов в зоне .ru? Подобную задачу можно решить многими способами, начиная от того, что в ручную проверять посимвольно, заканчивая преминением регулярных выражений.
Читать далее »
Apr20
категория:
Код автор:
admin |

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

Эту книгу я купил только из-за главы, посвященной сокетам (кстати, она самая большая в книге - 198 страниц). Но, как оказалось, в ней очень много другого полезного материала. Например, "подводные камни" - описание ошибок или неожиданных действий компилятора. Честно говоря, хочется привести выдержки из книги, но примеры там очень большие по объему (т.к. описываются досканально), а приводить их к урезанному варианту не вижу смысла - многое необходимое будет опущено. К сожалению, я не смог найти, где можно скачать книгу, т.ч. если кто знает - отпишите в комментариях.
Apr16
категория:
Код автор:
admin |
Если в функцию передаете строку и в самой функции эта строка не изменяется - объявляйте ее как 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
категория:
Код автор:
admin |
В 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
категория:
Код автор:
admin |
Я часто работаю с 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;
Т.е., все данные храню в самом дереве. Знаю, что это не самый лучший способ. Например, во многих случаях, особенно когда необходима не стандартная сортировка или нестандартная обработка данных, правильнее было бы хранить данные в отдельном массиве, а в дереве держать только указатели на нужные данные, но так уж я привык.
Читать далее »
Apr12
категория:
Книги автор:
admin |
Одна из лучших книг для программистов. Причем не только для Delphi-программистов, хотя и ориентированна на них, но вообще для всех программистов. Я купил ее, еще не зная толком о чем она, но после того, как прочел ее (от корки до корки), понял, что втречал очень мало книг, настолько полезных и простых в изучении. В ближайшее время планирую привести пару выдержек из этой книги, а пока можете скачать ее или купить. Тем кто скачал - советую все-же купить, чтобы она всегда была под рукой. Мне, например, бумажный вариант намного более удобен.
Apr11
категория:
Код автор:
admin |
Когда-то, очень давно, я не мог понять, почему код, подобный тому, что ниже, возвращал не правильный результат:
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
категория:
Код автор:
admin |
Иногда бывает необходимо объеденить два (и более) изображений в одно, но с учетом прозрачности. Конечно, для этого можно использовать маски, регионы и т.д., но зачем, если есть возможность использовать 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
категория:
Код автор:
admin |
В принципе, это не новая заметка, а дубль с форума, на котором я когда-то это уже опубликовал. Но, как говорится, "повторение - мать учения".
Суть в следующем - если вам необходимо передавать строковые данные между программой и dll, то используйте для этого тип WideString. В этом случае вам не придется подключать никакие менеджеры памяти, т.к. для WideString используется не стандартные менеджеры памяти, а системный.
Читать далее »
Apr10
категория:
Код автор:
admin |
Мало кто знает (и еще меньше, кто использует) о такой замечательной конструкции в 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;
Правда ведь, намного приятнее и понятнее.
Читать далее »