Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ширина правого поля в StringGrid


Автор: Lunatikus 14.9.2009, 10:08
Здравствуйте. Как сделать в ячейке/строке/всей таблице правое поле определенной ширины?

В данный момент, если текст не влезает в ячейку, он обрезается прямо у правой границы ячейки. Хотелось бы, чтобы обрезание было с некоторым отступом.

спасибо за помощь

Автор: Keeper89 14.9.2009, 11:31
Lunatikus, вот http://www.festra.com/eng/mtut09.htm есть парочка советов.

Автор: Lunatikus 14.9.2009, 11:43
спасибо,но не совсем то. Ширина самой колонки не должна меняться.

А ширину текста можно лишь получить из функции TextWidth(), но не поменять ее.

Если в ячейку влезает 5 символов, а в слове их 6,то будет срезан последний.
Мне надо, чтобы срезалось 2, к примеру.
Если нет соответствующего свойства типа "поля", как в странице Word, например, то придется изощряться и рассчитывать длину содержания ячейки в точках и принудительно обрезать через textout.

Автор: Данкинг 14.9.2009, 11:45
Обрезай вручную строку до вывода её в ячейку. smile 

Автор: Keeper89 14.9.2009, 19:53
Вы противоречите названию своей же темы.
Если это подгон слова к ячейке, а не наоборот, можно сделать так:
Код

procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const
  TEXT_PERCENT = 0.8;
var
  myTextWidth: Integer;
  curCellString: String;
begin

  // Обрезаем в соотношении MY_CELL_PERCENT от размера ячейки

  with TStringGrid(Sender).Canvas do
  begin
    FillRect(Rect);
    
    curCellString := TStringGrid(Sender).Cells[ACol, ARow];
    // При пустой строке выходим
    if curCellString = EmptyStr then
      Exit;       
    
    // Обрезаем строку по символу (может есть вариант и лучше)
    // пока не обеспечим необходимую ширину
    myTextWidth := TextWidth(curCellString);
    while (myTextWidth / (Rect.Right - Rect.Left)) >= TEXT_PERCENT do
    begin
      curCellString :=
        Copy(curCellString, 1, Length(curCellString) - 1);
      myTextWidth := TextWidth(curCellString);
    end;
    
    TextOut(Rect.Left + 2, Rect.Top, curCellString);
  end;
end;


Автор: Lunatikus 18.9.2009, 12:05
благодарю за подсказку, помогло. Еще добавил в конце "..." - стало более приглядным.

Автор: Keeper89 18.9.2009, 12:30
Пожалуйста, а с "..." надо быть осторожным - там есть несколько заковырок.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)