2015-09-17 3 views
0

У меня возникают проблемы с фрагментом кода, который автоматически генерирует номер и ширину столбца.Автоматическое получение числа и ширины столбцов

Я делаю все с этой частью кода, единственное, что меня беспокоит, это то, что моя сетка не используется на 100%; есть небольшая часть сетки, которая не используется, и это делает отчет безумным.

Это часть кода, который выполняет эту работу.

procedure TForm1.NoScrollDBGrid1DrawColumnCell(Sender: TObject; 
    const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 
var 
    i: Integer; 
    brkol: integer; 
    sirina : Integer; 
    width1: Integer; 
begin 
    width1 := 1; 
    brkol:=-4; 
    for i := 0 to NoScrollDBGrid1.Columns.Count - 1 do 
    begin 
    width1 := width1 + NoScrollDBGrid1.Columns[i].Width + 1; 
    if NoScrollDBGrid1.Columns[i].Visible then 
     brkol:=brkol +1; 
    end; 
    sirina:=(80 div brkol); 
    if width1 < NoScrollDBGrid1.ClientWidth - 8 then 
    begin 
NoScrollDBGrid1.Columns[0].Width:=(NoScrollDBGrid1.ClientWidth-11)*2 div 100; 
NoScrollDBGrid1.Columns[1].Width:=(NoScrollDBGrid1.ClientWidth-11)*5 div 100; 
NoScrollDBGrid1.Columns[2].Width:=(NoScrollDBGrid1.ClientWidth-11)*10 div 100; 
NoScrollDBGrid1.Columns[3].Width:=(NoScrollDBGrid1.ClientWidth-11)*3 div 100; 
NoScrollDBGrid1.Columns[4].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[5].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[6].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[7].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[8].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[9].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[10].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[11].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[12].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[13].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[14].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[15].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[16].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
NoScrollDBGrid1.Columns[17].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100; 
+0

Какой тип вашего NoScrollDBGrid1 объявлен как, а в какой библиотеке есть сетка? – MartynA

+0

Мне кажется, что если вы вычисляете ширину каждого столбца, то последний столбец не должен вычисляться, а просто берем все, что осталось. Я не вижу этого в коде или я что-то упускаю? – GuidoG

+1

* '..... что делает отчет безумным' * - это совершенно бесполезное описание проблемы. Каково ожидаемое поведение и каково наблюдаемое поведение? –

ответ

0

Следующая не вполне ответить на ваш вопрос, но должно быть достаточно, чтобы ты.

Событие CreateForm создаст TNoScrollDBGrid, чей самый правый столбец останавливается на короткой правой границы зоны обслуживания сетки.

Button1 обработчик щелчка вызывает GetDrawInfo, который показывает, как получить DrawInfo для сетки (см TGridDrawInfo в Grids.Pas) и использует его, чтобы изменить размер правый столбец, чтобы достичь RHS клиентской области GRID в.

GetDrawInfo также показывает, как найти количество столбцов видимых данных - см. VisibleDataColumns, что позволяет наличие столбца индикатора слева. Корректировка ширины самого правого столбца также учитывает наличие столбца индикатора.

Btw, событие DrawCell в сетке, вероятно, не является хорошим местом для изменения макета сетки, как указано в комментарии.

type 
    TNoScrollDBGrid = Class(TDBGrid) // Per Peter Below of TeamB 
    private 
    Procedure WMNCCalcSize(Var msg: TMessage); 
    message WM_NCCALCSIZE; 
    end; 

TForm1 = class(TForm) 
    CDS1: TClientDataSet; 
    DataSource1: TDataSource; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
private 
    procedure GetDrawInfo; 
protected 
public 
    NoScrollDBGrid1 : TNoScrollDBGrid; 
end; 

[...]

procedure TNoScrollDBGrid.WMNCCalcSize(var msg: TMessage); 
const 
scrollstyles = WS_VSCROLL or WS_HSCROLL; 
var 
style: Integer; 
begin 
style := getWindowLong(handle, GWL_STYLE); 
If (style and scrollstyles) <> 0 Then 
    SetWindowLong(handle, GWL_STYLE, style and not scrollstyles); 
inherited; 
end; 

type 
    TMyGrid = class(TDBGrid); 

procedure TForm1.GetDrawInfo; 
var 
    DrawInfo : TGridDrawInfo; 
    i : Integer; 
    Min, 
    Max, 
    R, 
    NewLastCellWidth, 
    VisibleDataColumns : Integer; 
begin 
    TMyGrid(NoScrollDBGrid1).CalcDrawInfo(DrawInfo); 

    Min := 0; 
    // calculate the number of visible data columns, allowing for the 
    // indicator column, if there is one. 
    VisibleDataColumns := DrawInfo.Horz.GridCellCount - DrawInfo.Horz.FixedCellCount; 

    Max := VisibleDataColumns -1; 
    if DrawInfo.Horz.FixedCellCount = 0 then 
    Dec(Max); 
    R := DrawInfo.Horz.FixedBoundary; 

    // Next, sum the widths of the data columns, *except*the right-most one 
    for i := Min to Max - 1 do begin 
    Inc(R, NoScrollDBGrid1.Columns[i].Width); 
    end; 

    if R < DrawInfo.Horz.FullVisBoundary then begin 
    // Work out what the width of the rightmost column needs to be 
    // to fill the grid 
    NewLastCellWidth := DrawInfo.Horz.GridExtent - R; 
    // adjust this to allow for the width of the vertical lines between 
    // the columns, etc 
    NewLastCellWidth := NewLastCellWidth - 1 * (Max +1); 
    NoScrollDBGrid1.Columns[Max].Width := NewLastCellWidth; 
    end; 
    Caption := IntToStr(R); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    GetDrawInfo; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    i, j: Integer; 
    Field : TStringField; 
const 
    Fields = 4; 
begin 
    for i := 1 to Fields do begin 
    Field := TStringField.Create(Self); 
    Field.Size := 20; 
    Field.FieldName := 'Field' + IntToStr(i); 
    Field.Name := Field.FieldName; 
    Field.FieldKind := fkData; 
    Field.DataSet := CDS1; 
    end; 
    CDS1.CreateDataSet; 
    CDS1.Insert; 
    for i := 1 to Fields do begin 
    CDS1.Fields[i-1].AsString := 'Value: ' + IntToStr(i); 
    end; 
    CDS1.Post; 
    NoScrollDBGrid1 := TNoScrollDBGrid.Create(Self); 
    NoScrollDBGrid1.Parent := Self; 
    NoScrollDBGrid1.Width := 648; 
    NoScrollDBGrid1.DataSource := DataSource1; 
end; 
0

Как предложил @GuidoG ив пытался дать оставшуюся ширину одной из колонок, и она работала. Кажется, что столбцы в noscrolldbgrid должны быть целыми, и именно поэтому сетка не была заполнена на 100%. Во всяком случае, tnx много за помощь.