Русский developing - бессмысленный и беспощадный!
z.g писал(а):и производительность проседала невероятно
а она кстати, будет проседать невероятно. например при выводе 10000 точек, таким вот способом.
предлагаю даже написать тест и сравнить скорость работы, например в WinXP, отрисовки точек до патчевым и послепатчевым способом!
Опыт работы с DC функциями подсказывает, что скорость упадёт значительно... хотя бы просто за счёт дополнительных call-ов. Не забываем, что на старых компах (где, как-раз висты нет), скорость упадёт ещё сильнее!
z.g писал(а):фикс простой. проблему решает.
Фикс плохой, потому что диктует "фикс для висты" абсолютно для всех Windows систем.
правильнее было бы так:
- Код: Выделить всё
procedure VistaSetPixel(CanvasHandle: HDC; X, Y: integer; AColor: COLORREF);
var
pen, oldpen: HPEN;
begin
if x and 8=0 then
Windows.SetPixel(CanvasHandle, X, Y, Windows.ColorRef(ColorToRGB(AColor)))
else begin
pen := Windows.CreatePen(PS_SOLID, 1, Windows.ColorRef(ColorToRGB(AColor)));
oldpen := Windows.SelectObject(CanvasHandle, pen);
Windows.MoveToEx(CanvasHandle, X, Y, nil);
Windows.LineTo(CanvasHandle, X, Y + 1);
Windows.SelectObject(CanvasHandle, oldpen);
Windows.DeleteObject(pen);
end;
end;
procedure WinSetPixel(CanvasHandle: HDC; X, Y: integer; AColor: TGraphicsColor);
begin
Windows.SetPixel(CanvasHandle, X, Y, Windows.ColorRef(ColorToRGB(AColor)));
end;
var
IntSetPixel : procedure (anvasHandle: HDC; X, Y: integer; AColor: TGraphicsColor) = @WinSetPixel;
procedure TWin32WidgetSet.DCSetPixel(CanvasHandle: HDC; X, Y: integer; AColor: TGraphicsColor);
begin
IntSetPixel(CanvasHandle, X,Y, AColor);
end;
constructor TWin32WidgetSet.Create;
begin
...
if isWindowsVista then IntSetPixel:=@VistaSetPixel;
...
end;
и никому не будет больно... кроме висты
z.g писал(а):1. способы исправления в уже готовых приложениях.
если имеется в виду, уже скомпилированных, то ответ - никак! баг Висты
любое приложение использовавшее в Висте SetPixel API, без пересборки не заработает.
z.g писал(а):2. способы исправления в своём приложении без правки lcl.
- Код: Выделить всё
procedure MySetPixel(c: TCanvas; x,y: integer; color: TColor);
var
b : TColor;
begin
if not isVista then
c.SetPixel(x,y, color);
else begin
b:=c.Pen.Color; // penwidth+pen+style
c.Pen.Color:=color;
c.FillRect(x, y,x+1, y+1)
c.Pen.Color:=b;
end ;
end;
Но лучший способ - выкинуть SetPixel нафик (зачем он используется?!). Вместо него использовать, например, TBitmap.
Добавлено спустя 4 минуты 51 секунду:вот ещё можно так написать:
to: Lazarus mailing list <lazarus@lists.lazarus.freepascal.org>
subject: Russian Lazarus developers.
Hello Lazarus team
Why Russian Lazarus developers are so cruel?! Aren't you feeding them?
Could you please reassign the issue (
http://bugs.freepascal.org/view.php?id=15822) to some other maintainer not Russian, please. I find my patch to be working, but for some reason, your Russian developer refuses to accept it. I think it's because he's Russian.
Regards,
z.g
Такое письмо порадует немецких разработчиков на 8-9 мая
сорри за троллинг! весна чо!