Текущий архив: 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.49 MB
Время: 0.029 c