Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не получается точно определить ширину текста на канве. [D6, WinXP]


Drowsy ©   (2009-01-26 06:53:00) 

procedure TMyForm.FormCreate(Sender: TObject);
begin
 with GRid do begin
    Font.Size := 10;
    Canvas.Font.Size := 10;
    Font.CharSet := RUSSIAN_CHARSET;
    Font.Name := Courier New;
 end;
end;

В ячейки таблицы нужно загнать русский текст.
Определяю для каждого столбца максимальную ширину текста MaxWidth[i-столбец]
( построчно, с помощью Grid.Canvas.TextWidth( ' текст в ячейке  ').
Устанавливаю GRID.ColWidth[i] := MaxWidth[i] + 4 (на рамку);
И почему-то текст у которого максимальная ширина ( т.е.MaxWidth[i] ) не вписывается в ячейку ( обрезаются последние 1 -2 -3 ... буквы)
Почему?


Drowsy   (2009-01-27 08:25:00) [1]

Спасибо!!!


ЮЮ   (2009-01-27 07:06:00) [2]


> procedure SetMaxColWidthInGrid(LB : TListBox;  AGrid: TStringGrid;
>  const S : String = '');
> var C, R, MaxW, W: Integer;
> begin
> LB.Items.Add(S);
> LB.Items.Add('Font.Size := ' +IntToStr(AGrid.Font.Size));
>
> LB.Items.Add('Canvas.Font.Size := ' +IntToStr(AGrid.Canvas.
> Font.Size));
> for C:=0 to AGrid.ColCount-1 do begin
>  MaxW:=15;
>  for R:=0 to AGrid.RowCount-1 do begin
    AGrid.Canvas.Font.Assign(AGrid.Font);
>   W:=AGrid.Canvas.TextWidth(AGrid.Cells[C,R])+4;
>   if W>MaxW then MaxW:=W;
>  end;
>  AGrid.ColWidths[C]:=MaxW;
>  LB.Items.Add(' COL = ' + IntToStr(C) + '  ***  ' + IntToStr(MaxW)
> );
> end;
> end;


пока грид не рисовался, параметры его канваса не определены. А в ходе рисования и подавно могут быть изменены, например, в обработчике OnDraw...


Drowsy   (2009-01-27 02:42:00) [3]

Да, спасибо, но:
если вызывать SetMaxColWidthInGrid(AGrid: TStringGrid) кликом по баттону (или в FormResie),
то Canvas.TextWidth определяется точно и текст в ячейки вписывается,
но я пытался вызвать SetMaxColWidthInGrid из FormCreate из FormActivate из
FormShow (чтобы таблица сразу "правильно отрисовывалась) и при всём этом Canvas.TextWidth выдаёт неверные размеры и таблица "режет" тексты в ячейках...

unit fmuDryBarSpecLoad;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, StdCtrls;

type
 TfmDryBarSpecLoad = class(TForm)
   sg_DryBarSpecLoad: TStringGrid;
   Button1: TButton;
   ListBox1: TListBox;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure FormActivate(Sender: TObject);
   procedure FormResize(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure FormPaint(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 fmDryBarSpecLoad: TfmDryBarSpecLoad;

implementation
uses Math;
{$R *.dfm}
const RowCnt = 11;
     ColCnt = 5;
DBSLWIDTH : array [0..ColCnt-1] of integer = (0, 0, 0, 0, 0);
DBSL : array[0..RowCnt - 1] of array[0..ColCnt-1] of String  =
(
('Концентрат','Влажность на входе,%', 'Влажность на выходе,%', 'Напряжение объема по испаренной влаге,кг/(м.ч)',
'Удельный расход условного топлива, кг/кг влаги'),
('Цинковый',' 11—17',' 6—7',' 15—25',' 0,6-0,085'),
('Свинцовый',' 15—16',' 7—8',' 15—20',' 0,6-0,085'),
('Медный',' 10—18',' 0—7',' 20—65',' 0,6-0,09'),
('Медно-никелевый',' 18—20',' 8—10',' 30—40',' 0,6-0,085'),
('Пиритный',' 10—14',' 3—8',' 15—40',' 0,6-0,085'),
('Баритовый',' 14',' 4—5',' 10—11',' 0,0875'),
('Флюоритовый',' 10—20',' 0—1',' 40—50',' 0,075—0,095'),
('Магнетитовый',' 8—11',' 0,7—2,5',' 30—60',' 0,07—0,12'),
('Апатитовый','11',' 1',' 69',' 0,09'),
('Нефелиновый','11',' 1',' 72',' 0,08')
);

procedure SetMaxColWidthInGrid(LB : TListBox;  AGrid: TStringGrid; const S : String = '');
var C, R, MaxW, W: Integer;
begin
LB.Items.Add(S);
LB.Items.Add('Font.Size := ' +IntToStr(AGrid.Font.Size));
LB.Items.Add('Canvas.Font.Size := ' +IntToStr(AGrid.Canvas.Font.Size));
for C:=0 to AGrid.ColCount-1 do begin
 MaxW:=15;
 for R:=0 to AGrid.RowCount-1 do begin
  W:=AGrid.Canvas.TextWidth(AGrid.Cells[C,R])+4;
  if W>MaxW then MaxW:=W;
 end;
 AGrid.ColWidths[C]:=MaxW;
 LB.Items.Add(' COL = ' + IntToStr(C) + '  ***  ' + IntToStr(MaxW) );
end;
end;

procedure TfmDryBarSpecLoad.FormCreate(Sender: TObject);
var i,j : byte;
begin
with sg_DryBarSpecLoad do begin
   ColCount := ColCnt;
   RowCount := RowCnt;

   Font.Size := 14;
   Canvas.Font.Size := 14;
   Font.CharSet := RUSSIAN_CHARSET;
   Font.Name := 'Courier New';
end;
 for i := 0 to ColCnt - 1 do begin
   for j := 0 to RowCnt - 1 do begin
     sg_DryBarSpecLoad.Cells[i, j] := DBSL[j, i];
   end;
 end;
 SetMaxColWidthInGrid(ListBox1,sg_DryBarSpecLoad, 'FormCreate');  // плохо
end;

procedure TfmDryBarSpecLoad.FormActivate(Sender: TObject);
begin
 SetMaxColWidthInGrid(ListBox1,sg_DryBarSpecLoad, 'FormActivate');   // плохо

end;

procedure TfmDryBarSpecLoad.FormShow(Sender: TObject);
begin
 SetMaxColWidthInGrid(ListBox1,sg_DryBarSpecLoad, 'FormShow');        // плохо

end;

procedure TfmDryBarSpecLoad.FormPaint(Sender: TObject);
begin
 SetMaxColWidthInGrid(ListBox1,sg_DryBarSpecLoad, 'FormPaint');        // плохо

end;

procedure TfmDryBarSpecLoad.FormResize(Sender: TObject);
begin
 SetMaxColWidthInGrid(ListBox1,sg_DryBarSpecLoad, 'FormResize');    // нормально

end;

procedure TfmDryBarSpecLoad.Button1Click(Sender: TObject);
var C, R: Integer;
begin
 SetMaxColWidthInGrid(ListBox1,sg_DryBarSpecLoad, 'Button1Click');     // нормально
end;

end.


{RASkov}   (2009-01-26 23:28:00) [4]

function GetWord: String;
var N, K: Integer;
begin
 K:=3+Random(22);
 SetLength(Result, K);
 for N:=1 to K do Result[N]:=CHR(48+Random(10));
end;

procedure SetMaxColWidthInGrid(AGrid: TStringGrid);
var C, R, MaxW, W: Integer;
begin
 for C:=1 to AGrid.ColCount-1 do begin
  MaxW:=15;
  for R:=1 to AGrid.RowCount-1 do begin
   W:=AGrid.Canvas.TextWidth(AGrid.Cells[C,R])+4;
   if W>MaxW then MaxW:=W;
  end;
  AGrid.ColWidths[C]:=MaxW;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var C, R: Integer;
begin
 for C:=1 to StringGrid1.ColCount-1 do
  for R:=1 to StringGrid1.RowCount-1 do
   StringGrid1.Cells[C,R]:=GetWord;
 SetMaxColWidthInGrid(StringGrid1);
end;


Drowsy   (2009-01-26 22:58:00) [5]

В действительности, вот это:

unit fmuDryBarSpecLoad;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, StdCtrls;

type
 TfmDryBarSpecLoad = class(TForm)
   sg_DryBarSpecLoad: TStringGrid;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 fmDryBarSpecLoad: TfmDryBarSpecLoad;

implementation
uses Math;
{$R *.dfm}
const RowCnt = 11;
     ColCnt = 5;
DBSLWIDTH : array [0..ColCnt-1] of integer = (0, 0, 0, 0, 0);
DBSL : array[0..RowCnt - 1] of array[0..ColCnt-1] of String  =
(
('Концентрат','Влажность на входе,%', 'Влажность на выходе,%', 'Напряжение объема по испаренной влаге,кг/(м.ч)',
'Удельный расход условного топлива, кг/кг влаги'),
('Цинковый',' 11—17',' 6—7',' 15—25',' 0,6-0,085'),
('Свинцовый',' 15—16',' 7—8',' 15—20',' 0,6-0,085'),
('Медный',' 10—18',' 0—7',' 20—65',' 0,6-0,09'),
('Медно-никелевый',' 18—20',' 8—10',' 30—40',' 0,6-0,085'),
('Пиритный',' 10—14',' 3—8',' 15—40',' 0,6-0,085'),
('Баритовый',' 14',' 4—5',' 10—11',' 0,0875'),
('Флюоритовый',' 10—20',' 0—1',' 40—50',' 0,075—0,095'),
('Магнетитовый',' 8—11',' 0,7—2,5',' 30—60',' 0,07—0,12'),
('Апатитовый','11',' 1',' 69',' 0,09'),
('Нефелиновый','11',' 1',' 72',' 0,08')
);

procedure TfmDryBarSpecLoad.FormCreate(Sender: TObject);
var i,j : byte;
begin
with sg_DryBarSpecLoad do begin
   ColCount := ColCnt;
   RowCount := RowCnt;

   Font.Size := 10;
   Canvas.Font.Size := 10;
   Font.CharSet := RUSSIAN_CHARSET;
   Font.Name := 'Courier New';
end;
 for i := 0 to ColCnt - 1 do begin
   for j := 0 to RowCnt - 1 do begin
     sg_DryBarSpecLoad.Cells[i, j] := DBSL[j, i];
     DBSLWIDTH[i] := Max(DBSLWIDTH[i], sg_DryBarSpecLoad.Canvas.TextWidth(sg_DryBarSpecLoad.Cells[i, j]));
   end;
 end;

 for i := 0 to 4 do begin
   sg_DryBarSpecLoad.ColWidths[i] := DBSLWIDTH[i]+40;
 end;
end;

end.


KilkennyCat   (2009-01-26 22:18:00) [6]

Если учесть, что
> type Grid : TStringGrid

то да.
а раз не дает, то значит Вы написали не то, что у Вас в действительности.
А раз Вы не написали, что у Вас в действительности, то и ответ на Вашу проблему дать затруднительно.


Drowsy   (2009-01-26 20:59:00) [7]

Не даёт. А что, должен?


KilkennyCat   (2009-01-26 08:22:00) [8]


> type Grid : TStringGrid;

Точно? и что, GRID.ColWidth[i] ошибки не дает?


Drowsy   (2009-01-26 07:42:00) [9]

type Grid : TStringGrid;

var MaxWidth : array[0.. количество столбцов-1] of integer;


KilkennyCat   (2009-01-26 07:27:00) [10]


> GRid

это хто?

> Font.Size := 10;
>     Canvas.Font.Size := 10;

ну тогда и остальное надо также, раз неизвестному гриду такое требуется

> Определяю для каждого столбца максимальную ширину текста
> MaxWidth[i-столбец]

ну всем сразу понятно стало, каким макаром...


Наверх

Титульная страница Поиск, карта сайта Написать письмо