DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: webb123
今日帖子: 1
在线用户: 7
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/23 15:14:28
标题:
请大家测测Berlin up1的FMX设计器,我的机器上有GDI泄露 浏览:5025
加入我的收藏
楼主: 我的操作系统win7 64,Berlin up1的fmx 的Form 设计界面有GDI的句柄泄露,可以按F12来回观察,操作系统GDI一直上升,VCL的Form设计器则没有问题
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/23 15:16:02
1楼: seattle up1也没有,泄露
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/23 15:39:22
2楼: berlin up1 fmx GDI泄露
此帖子包含附件:
PNG 图像
大小:26.7K
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/23 15:39:45
3楼: berlin up1 fmx GDI泄露
此帖子包含附件:
PNG 图像
大小:26.9K
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/23 15:57:53
4楼: 看来他们的测试人手太少了
----------------------------------------------
-
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2016/9/23 16:10:05
5楼: 重装系统试试
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 bjeco (eco) ▲▲▲▲△ -
普通会员
2016/9/23 16:45:30
6楼: 楼主,能提供一下berlin up1的代码吗?(架构师版本)
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/23 16:59:26
7楼: Berlin up1代码?
----------------------------------------------
-
作者:
男 bjeco (eco) ▲▲▲▲△ -
普通会员
2016/9/23 18:24:01
8楼: 也就是安装berlin update1时,source 目录下的源码,看看一些bug是否修订了
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/9/23 18:30:06
9楼: 求破解啊,没有破解怎么测试?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/23 20:19:48
10楼: 回@bjeco (eco),q群209321818上有Berlin up1的安装用的文件,可以装出源码,但不能进去
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/24 9:21:07
11楼: 估计是这里错了,盒子:http://bbs.2ccc.com/topic.asp?topicid=512036
procedure TTextLayoutGDIPlus.DoRenderLayout;
var
  I: Integer;
  LRegion: TRegion;
  LScale: Single;
  LHFont: HFONT;
begin
  if (FStringFormat = nil) or (FGraphics = nil) then
    Exit;

  FreeAndNil(FGPFont);
  if LayoutCanvas <> nil then
    LScale := TCanvasGdiPlus(LayoutCanvas).FFontScale
  else
    LScale := 1;
  LHFont := CreateFont(-Round(Font.Size * LScale), 0, 0, 0,
    FontWeightToWinapi(Font.StyleExt.Weight),
    DWORD(not Font.StyleExt.Slant.IsRegular),
    DWORD(TFontStyle.fsUnderline in Font.StyleExt.SimpleStyle),
    DWORD(TFontStyle.fsStrikeOut in Font.StyleExt.SimpleStyle), 0, 0, 0, 0, 0, PChar(Font.Family));
  try
    FGPFont := TGPFont.Create(GetDC(0), LHFont);
  finally
    DeleteObject(LHFont);
  end;
  if FGPFont = nil then
    FGPFont := TGPFont.Create(TCanvasGdiPlus(LayoutCanvas).FGPFamily,
      Font.Size * LScale, vgStyleToGPStyle(Font.StyleExt), UnitPoint);
  //Word wrap and trimming
  if WordWrap then
    FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags and not StringFormatFlagsNoWrap)
  else
    FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags or StringFormatFlagsNoWrap);
  case Trimming of
    TTextTrimming.None:
      FStringFormat.SetTrimming(StringTrimmingNone);
    TTextTrimming.Character:
      FStringFormat.SetTrimming(StringTrimmingEllipsisCharacter);
    TTextTrimming.Word:
      FStringFormat.SetTrimming(StringTrimmingEllipsisWord);
  end;
  if RightToLeft then
    FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags or
      StringFormatFlagsDirectionRightToLeft);
  case HorizontalAlign of
    TTextAlign.Center:
      FStringFormat.SetAlignment(StringAlignmentCenter);
    TTextAlign.Leading:
      FStringFormat.SetAlignment(StringAlignmentNear);
    TTextAlign.Trailing:
      FStringFormat.SetAlignment(StringAlignmentFar);
  end;
  case VerticalAlign of
    TTextAlign.Center:
      FStringFormat.SetLineAlignment(StringAlignmentCenter);
    TTextAlign.Leading:
      FStringFormat.SetLineAlignment(StringAlignmentNear);
    TTextAlign.Trailing:
      FStringFormat.SetLineAlignment(StringAlignmentFar);
  end;
  //Measuring text size
  LRegion := MeasureRange(0, Max(Text.Length, 1));
  if Length(LRegion) > 0 then
  begin
    for I := 1 to High(LRegion) do
      LRegion[0].Union(LRegion[I]);
    FLeft := LRegion[0].Left;
    FTop := LRegion[0].Top;
    FWidth := LRegion[0].Width;
    FHeight := LRegion[0].Height;
  end;
end;

改为:
procedure TTextLayoutGDIPlus.DoRenderLayout;
var
  I: Integer;
  LRegion: TRegion;
  LScale: Single;
  LHFont: HFONT;

{+++> by BambooCaep}
  LDC: HDC;
begin
  if (FStringFormat = nil) or (FGraphics = nil) then
    Exit;

  FreeAndNil(FGPFont);
  if LayoutCanvas <> nil then
    LScale := TCanvasGdiPlus(LayoutCanvas).FFontScale
  else
    LScale := 1;
  LHFont := CreateFont(-Round(Font.Size * LScale), 0, 0, 0,
    FontWeightToWinapi(Font.StyleExt.Weight),
    DWORD(not Font.StyleExt.Slant.IsRegular),
    DWORD(TFontStyle.fsUnderline in Font.StyleExt.SimpleStyle),
    DWORD(TFontStyle.fsStrikeOut in Font.StyleExt.SimpleStyle), 0, 0, 0, 0, 0, PChar(Font.Family));

{---> by BambooCaep}
//  try
//    FGPFont := TGPFont.Create(aDC, LHFont);
//  finally
//    DeleteObject(LHFont);
//  end;

{+++> by BambooCaep}
  LDC := GetDC(0);
  try
    try
      FGPFont := TGPFont.Create(LDC, LHFont);
    finally
      DeleteObject(LHFont);
    end;
  finally
    ReleaseDC(0, LDC);
  end;

  if FGPFont = nil then
    FGPFont := TGPFont.Create(TCanvasGdiPlus(LayoutCanvas).FGPFamily,
      Font.Size * LScale, vgStyleToGPStyle(Font.StyleExt), UnitPoint);
  //Word wrap and trimming
  if WordWrap then
    FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags and not StringFormatFlagsNoWrap)
  else
    FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags or StringFormatFlagsNoWrap);
  case Trimming of
    TTextTrimming.None:
      FStringFormat.SetTrimming(StringTrimmingNone);
    TTextTrimming.Character:
      FStringFormat.SetTrimming(StringTrimmingEllipsisCharacter);
    TTextTrimming.Word:
      FStringFormat.SetTrimming(StringTrimmingEllipsisWord);
  end;
  if RightToLeft then
    FStringFormat.SetFormatFlags(FStringFormat.GetFormatFlags or
      StringFormatFlagsDirectionRightToLeft);
  case HorizontalAlign of
    TTextAlign.Center:
      FStringFormat.SetAlignment(StringAlignmentCenter);
    TTextAlign.Leading:
      FStringFormat.SetAlignment(StringAlignmentNear);
    TTextAlign.Trailing:
      FStringFormat.SetAlignment(StringAlignmentFar);
  end;
  case VerticalAlign of
    TTextAlign.Center:
      FStringFormat.SetLineAlignment(StringAlignmentCenter);
    TTextAlign.Leading:
      FStringFormat.SetLineAlignment(StringAlignmentNear);
    TTextAlign.Trailing:
      FStringFormat.SetLineAlignment(StringAlignmentFar);
  end;
  //Measuring text size
  LRegion := MeasureRange(0, Max(Text.Length, 1));
  if Length(LRegion) > 0 then
  begin
    for I := 1 to High(LRegion) do
      LRegion[0].Union(LRegion[I]);
    FLeft := LRegion[0].Left;
    FTop := LRegion[0].Top;
    FWidth := LRegion[0].Width;
    FHeight := LRegion[0].Height;
  end;
end;
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/24 9:28:23
12楼: 这是底层的东西,估计还要发布一次update
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/24 9:55:51
13楼: 错在GetDC(0)没有释放,这版没戏了
----------------------------------------------
-
作者:
男 onechen (onechen) ▲▲▲▲▲ -
普通会员
2016/9/24 11:02:30
14楼: Berlin 10.1 update 1 试过这个修正,有用!

感谢楼主分享,赞!
----------------------------------------------
-
作者:
男 chonghai (DBlue) ★☆☆☆☆ -
盒子活跃会员
2016/9/25 20:30:23
15楼: 10.1就有这个毛病了,一直没有修复。
emb真是药丸。
----------------------------------------------
喜欢Delphi,关注Delphi,愿和广大爱好者交朋友。
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/27 9:51:29
16楼: https://quality.embarcadero.com/browse/RSP-15195,wang已报了,希望大家去投个票,把它顶上去
----------------------------------------------
-
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2016/9/27 10:49:47
17楼: 已投票
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/28 21:02:19
18楼: 还有个单元,被Tom Yu找出,希望有权限的去投票
FMX.Canvas.D2D.pas

Line 4252
EnumFontFamiliesEx(GetDC(0), LogFont, @EnumFontFamExProc, NativeInt(@LogFont), 0);

GetDC(0) has same issue.
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/9/29 8:42:36
19楼: https://quality.embarcadero.com/browse/RSP-15195,这个只报了Berlin没有报其up1
https://quality.embarcadero.com/browse/RSP-15976,我重新报了,fmx有两个单元都有GDI对象泄露,希望大家去顶顶
----------------------------------------------
-
作者:
男 sdzlb (lb) ★☆☆☆☆ -
盒子活跃会员
2016/10/1 17:40:16
20楼: 好像win10下没有GDI泄露吧,用的很正常,如果有如何测试?
此帖子包含附件:
PNG 图像
大小:27.0K
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/10/1 20:39:56
21楼: 是fmx设计界面。上面有两张图,对着看做。是fmx基础单元有错
----------------------------------------------
-
作者:
男 sun2016 (sun) ▲▲▲△△ -
普通会员
2016/10/3 23:05:02
22楼:  sdzlb (lb)  好像win10下没有GDI泄露吧,用的很正常,如果有如何测试?



如何重现?  打开一个空白 fmx 窗体,不断按 F12  ?


我也 win10  ,d10.1.1  没发现gdi问题。。。。难道win10正常?
此帖子包含附件:
JPEG 图像
大小:23.5K
----------------------------------------------
学Delphi不久,会问些初级问题,希望有人指引,不胜感激...
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/10/4 9:25:42
23楼: @sun2016,现在图片是gdi是2062,不要退出IDE,继续编辑FMX界面,看GDI对象是否会增加?多玩几下,再观察该数值,fmx界面最好有edit,listbox,memo,button,speedbutton,combobox控件。我的测试是在master设计界面,含有以上控件
----------------------------------------------
-
作者:
男 sun2016 (sun) ▲▲▲△△ -
普通会员
2016/10/4 11:42:05
24楼: ls: 
2062是空工程+1只有buton窗体。。。FMX..
我打开旧fmx  dpr。。。不断F12.。。切换不同窗体。。。再 F12 .。。大约有10多个不同窗体。。。不断F12.。。。重复

GDI 提高到 最高 2112   不操作后,稳定在 2104

每个界面上 有 edit,listview,memo,button, 。。还有几个你无的。。
----------------------------------------------
学Delphi不久,会问些初级问题,希望有人指引,不胜感激...
作者:
男 bmsr (白忙剩人) ★☆☆☆☆ -
普通会员
2016/10/4 20:15:18
25楼: 我win10下和楼上的一样,没发现GDI增多。
----------------------------------------------
http://blog.sina.com.cn/bmsrnote
作者:
男 bdl1 (bdl1) ▲▲▲▲▲ -
普通会员
2016/10/5 9:39:25
26楼: 我也在win10下没测试出GDI泄漏问题,估计是win7上才会有的问题了.
----------------------------------------------
-我的博客
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/10/5 15:45:51
27楼: 我没有win10测试环境,麻烦上面几位测试一下,弄个简易程序,反复执行getdc(0),然后在观察这程序的gdi有没有增加
----------------------------------------------
-
作者:
男 bdl1 (bdl1) ▲▲▲▲▲ -
普通会员
2016/10/5 18:08:34
28楼: procedure TForm20.Button1Click(Sender: TObject);
var
  DC: HDC;
  i: integer;
begin
  for i := 0 to 10000 do
  begin
    DC := GetDC(0);
    ReleaseDC(0, DC);
  end;
end;
我测试了,如果执行ReleaseDC,则任务管理器中gdi对象正常,不执行ReleaseDC,就会建立9998个对象,结果:Win10不自动释放gdi对象.
----------------------------------------------
-我的博客
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/10/5 20:06:34
29楼: 好的谢谢,update1两个fmx单元肯定有泄漏,可能我刚好碰上
----------------------------------------------
-
作者:
男 sdzlb (lb) ★☆☆☆☆ -
盒子活跃会员
2016/10/5 21:47:20
30楼: @sun2016:你win10中任务管理器的GDI对象是如何调出来的,win10缺省是没有的,我没找到,谢谢
----------------------------------------------
-
作者:
男 sdzlb (lb) ★☆☆☆☆ -
盒子活跃会员
2016/10/5 21:51:16
31楼: @sun2016:找到了,在列标题上>右键>选择列,与win7不一样
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/10/5 22:17:26
32楼: 可以做个简易测试程序,
1、新建FMX “Blank Application”工程
2、在form上放一“toolBar”
3、放"Edit"在“toolbar”,
4、反复按F12,
5、在操作系统上观察bds.ex的GDI对象
----------------------------------------------
-
作者:
男 bmsr (白忙剩人) ★☆☆☆☆ -
普通会员
2016/10/6 2:24:10
33楼: 按上面要求测试过了 稳定在1827-1836之间。没发现泄露
此帖子包含附件:
JPEG 图像
大小:499.5K
----------------------------------------------
http://blog.sina.com.cn/bmsrnote
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2016/10/6 10:38:29
34楼: IDE的FMX问题我找出来了,把操作系统的主题设置成“windows 经典”IDE就会产生GDI泄露,FMX基础单元肯定的有GDI泄露,只是上面几位没有触发到罢了
----------------------------------------------
-
作者:
男 testtset (testtset) ▲▲▲▲▲ -
普通会员
2016/11/13 20:31:39
35楼: UP2 好像解决了。

...

  LDC: HDC;
begin
  if (FStringFormat = nil) or (FGraphics = nil) then
    Exit;

  FreeAndNil(FGPFont);
  if LayoutCanvas <> nil then
    LScale := TCanvasGdiPlus(LayoutCanvas).FFontScale
  else
    LScale := 1;
  LDC := GetDC(0);
  try
    LHFont := CreateFont(-Round(Font.Size * LScale), 0, 0, 0,
      FontWeightToWinapi(Font.StyleExt.Weight),
      DWORD(not Font.StyleExt.Slant.IsRegular),
      DWORD(TFontStyle.fsUnderline in Font.StyleExt.SimpleStyle),
      DWORD(TFontStyle.fsStrikeOut in Font.StyleExt.SimpleStyle), 0, 0, 0, 0, 0, PChar(Font.Family));
    try
      FGPFont := TGPFont.Create(LDC, LHFont);
    finally
      DeleteObject(LHFont);
    end;
  finally
    ReleaseDC(0, LDC);
  end;

...
----------------------------------------------
在乌鸦掌控的世界里,洁白的羽毛是有罪的。
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行203.125毫秒 RSS