Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.15;
Скачать: CL | DM;

Вниз

Не получается точно определить ширину текста на канве.   Найти похожие ветки 

 
Drowsy   (2009-01-26 06:53) [0]

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 ... буквы)
Почему?


 
KilkennyCat ©   (2009-01-26 07:27) [1]


> GRid

это хто?

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

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

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

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


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

type Grid : TStringGrid;

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


 
KilkennyCat ©   (2009-01-26 08:22) [3]


> type Grid : TStringGrid;

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


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

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


 
KilkennyCat ©   (2009-01-26 22:18) [5]

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

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


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

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

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.


 
{RASkov} ©   (2009-01-26 23:28) [7]

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-27 02:42) [8]

Да, спасибо, но:
если вызывать 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.


 
ЮЮ ©   (2009-01-27 07:06) [9]


> 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 08:25) [10]

Спасибо!!!



Страницы: 1 вся ветка

Текущий архив: 2009.03.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
2-1232454943
аврам
2009-01-20 15:35
2009.03.15
http gzip


8-1191576151
Blind Guardian
2007-10-05 13:22
2009.03.15
Поворот изображения вокруг вертикальной серединной оси


6-1199882403
DmitriyG.
2008-01-09 15:40
2009.03.15
Dump IP сообщения


15-1231622118
Б
2009-01-11 00:15
2009.03.15
Бикубическая интерполяция


15-1231317258
Фант
2009-01-07 11:34
2009.03.15
Как сохранить картинку в gif?