Главная страница
    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.49 MB
Время: 0.029 c
2-1230972021
Pavelkq
2009-01-03 11:40
2009.03.15
OnClick по картинке в RichEdit.


15-1231502113
разбирающийся
2009-01-09 14:55
2009.03.15
карта израиля и палестины


3-1216316587
Новенький
2008-07-17 21:43
2009.03.15
Надо ли закрывать курсоры?


15-1231244696
Dennis
2009-01-06 15:24
2009.03.15
Не запускается explorer.exe (Windows XP)


15-1231270757
KilkennyCat
2009-01-06 22:39
2009.03.15
Забавные часы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский