Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.078 c
15-1231745269
vajo
2009-01-12 10:27
2009.03.15
Vista HP. Как попасть в папку Local Settings?


2-1233059159
CodeMaster
2009-01-27 15:25
2009.03.15
Массив


15-1231918204
Рыбба
2009-01-14 10:30
2009.03.15
Как правильно наследоваться от TDataModule?


2-1232454943
аврам
2009-01-20 15:35
2009.03.15
http gzip


15-1231502113
разбирающийся
2009-01-09 14:55
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский