Недавно наткнулся на неправильную работу функции OptimizeColumnsWidthAll в TRxDbGrid. Для лукапных полей определенных через KeyList/PickList неправильно вычисляется ширина столбца. Тоже самое и для rdgDblClickOptimizeColWidth.
Проблема состоит в том, что вместо строк из PickList ширина определяется для "сырых" строк.
Патч на скорую руку ниже. Буду рад, если автор отревьюит его.
- Код: Выделить всё
diff --git a/rxdbgrid.pas b/rxdbgrid.pas
index 0cc53e8..e25ed8e 100644
--- a/rxdbgrid.pas
+++ b/rxdbgrid.pas
@@ -2202,8 +2202,9 @@ end;
procedure TRxDBGrid.InternalOptimizeColumnsWidth(AColList: TList);
var
P:TBookmark;
- i, W:integer;
+ i, W, n:integer;
WA:PIntegerArray;
+ S:String;
begin
GetMem(WA, SizeOf(Integer) * AColList.Count);
@@ -2220,7 +2221,15 @@ begin
begin
for I := 0 to AColList.Count-1 do
begin
- W:=Canvas.TextWidth(TRxColumn(AColList[i]).Field.DisplayText) + 6;
+ S:=TRxColumn(AColList[i]).Field.DisplayText;
+ with TRxColumn(AColList[i]) do
+ if (KeyList.Count > 0) and (PickList.Count > 0) then
+ begin
+ n:=KeyList.IndexOf(S);
+ if (n<>-1) and (n < PickList.Count) then
+ S:=PickList.Strings[n];
+ end;
+ W:=Canvas.TextWidth(S) + 6;
if WA^[i]<W then
WA^[i]:=W;
end;