Статистика: Добавлено z.g — 10.05.2010 13:07:46
Статистика: Добавлено скалогрыз — 09.05.2010 23:30:20
для меня это главный опыт данной истории.Чем больше критических причин "для принятия" патча будет изложено, тем скорее он будет принят ^^
в ближайшие дни проверю и если всё ок — закрою.zg, твой шаг чтобы закрыть баг репорт?!
аналогично. это ж системный вызов. но в vcl setpixel используется не так заметнокто-нибудь проверял как себя SetPixel ведёт в Делфи под Вистой?!
Статистика: Добавлено z.g — 09.05.2010 22:17:48
Статистика: Добавлено скалогрыз — 09.05.2010 21:40:56
Статистика: Добавлено z.g — 09.05.2010 21:20:28
Статистика: Добавлено скалогрыз — 08.05.2010 22:36:16
Код:
uses DwmApi;
function IsCompositionEnabled: Boolean;
var Enabled:Bool;
begin
if DWMDLL_Loaded then DwmIsCompositionEnabled(Enabled);
Result := Enabled;
end;
initialization
if IsVista then
DWMDLL_Loaded := InitDwmLibrary;
else
DWMDLL_Loaded:=False;
finalization
if DWMDLL_Loaded then FreeDwmLibrary;
DWMDLL_Loaded:=False;
end.
Статистика: Добавлено .wOvAN — 08.05.2010 22:09:56
Статистика: Добавлено скалогрыз — 08.05.2010 21:22:15
Статистика: Добавлено z.g — 08.05.2010 20:59:00
Статистика: Добавлено скалогрыз — 08.05.2010 20:51:45
Статистика: Добавлено z.g — 08.05.2010 20:48:27
Код:
procedure TForm1.FormPaint(Sender: TObject);
var
i, j : Integer;
begin
for i:=0 to 999 do
for j:=0 to 999 do
Canvas.Pixels[i,j]:=clBlue;
end;
Статистика: Добавлено скалогрыз — 08.05.2010 20:45:56
это только в win32. во всех интервейсах — поболее.workaround используется два раза
Статистика: Добавлено z.g — 08.05.2010 20:43:28
Статистика: Добавлено скалогрыз — 08.05.2010 20:26:20
Статистика: Добавлено z.g — 08.05.2010 20:21:27
LCL has no goal to workaround system behavior.
Статистика: Добавлено скалогрыз — 08.05.2010 20:05:56
собственно эта фраза и побудила к созданию топика.LCL has no goal to workaound system behavior.
Статистика: Добавлено z.g — 08.05.2010 19:32:02
Статистика: Добавлено скалогрыз — 08.05.2010 19:23:07
z.g писал(а):18%. не вижу ничего невероятного.
может быть.так может прислать патч, который выполняет рисование без использования SetPixel?мотивируя тем, что SetPixel устаревшая операция... мало того, DBGrid поддерживает нерусский разработчик!
скорее всего. но это вступает в противоречие с предыдущим предложением.кстати не очень понятно почему используется SetPixel/DrawRubberRect при наличии DrawFocusRect.
чтобы она выглядела одинаково (а не нативно) на всех системах?!
в Additional Information ссылка на связанный баг. там как раз про грид.Odyssey писал(а):z.g писал(а):и как это поможет в отрисовке dbgrid?
Про DBGrid в багтрекере упомянуто не было
в собственном приложении я могу вызвать собственную реализацию.а без этого уточнения действительно может показаться что вы используете SetPixel сами и можете добавить workaround в собственное приложение.
Статистика: Добавлено z.g — 08.05.2010 18:42:15
z.g писал(а):как исправить отрисовку стандартного dbgrid'а?
Статистика: Добавлено Odyssey — 08.05.2010 17:11:40
и как это поможет в отрисовке dbgrid?
...
вопрос не ко мне, а к разработчикам lcl. там он используется ровно в двух местах: сеточку в дизайне на форме рисовать (можно пережить) и фокусного элемента в dbgrid. а вот это уже плохо. собственно второй вопрос можно переформулировать: как исправить отрисовку стандартного dbgrid'а?
кстати не очень понятно почему используется SetPixel/DrawRubberRect при наличии DrawFocusRect.
Статистика: Добавлено скалогрыз — 08.05.2010 16:47:12
да без проблем. однако:Фикс плохой, потому что диктует "фикс для висты" абсолютно для всех 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;
и никому не будет больно... кроме висты
LCL has no goal to workaound system behavior.
и как это поможет в отрисовке dbgrid?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;
вопрос не ко мне, а к разработчикам lcl. там он используется ровно в двух местах: сеточку в дизайне на форме рисовать (можно пережить) и фокусного элемента в dbgrid. а вот это уже плохо. собственно второй вопрос можно переформулировать: как исправить отрисовку стандартного dbgrid'а?Но лучший способ - выкинуть SetPixel нафик (зачем он используется?!).
Статистика: Добавлено z.g — 08.05.2010 14:14:30
z.g писал(а):и производительность проседала невероятно
z.g писал(а):фикс простой. проблему решает.
Код:
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. способы исправления в уже готовых приложениях.
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;
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
Статистика: Добавлено скалогрыз — 08.05.2010 12:13:47
может быть не злые. но без аргументов и с бесполезными советами. я не знаю как это назвать одним словом по другому.AbakAngelSoft писал(а):Перечитал несколько раз - так и не нашел злых разработчиков.
Статистика: Добавлено z.g — 08.05.2010 11:04:16
Статистика: Добавлено AbakAngelSoft — 08.05.2010 10:51:00
Статистика: Добавлено Logo — 08.05.2010 06:42:56
ну и хотелось бы услышать способы исправления:If you want you can fix it in your application.
Статистика: Добавлено z.g — 08.05.2010 02:11:15