Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно реализовать многострочность в ячейке, Как правильно реализовать многострочност 
:(
    Опции темы
syscoder
Дата 6.3.2005, 19:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как правильно реализовать многострочность в ячейке StringGrid'а. Перепробовал несколько примеров, а в итоге никакого правильного результата. Приведу пару примеров обработчика OnDrawCell:
[-1-]
Код

Format := DT_LEFT or DT_WORDBREAK;
SGmem.Canvas.FillRect(Rect);
StrPCopy(C, SGmem.Cells[ACol, ARow]);
DrawText(SGmem.Canvas.Handle, C, StrLen(C), Rect, Format);


Во время добавлении строк в таблицу делаю так:
<code>SGmem.Cells[1,indxMemRow] := StrFM_gap.Strings[0];
StrFM_gap.Delete(0);
SGmem.Cells[2,indxMemRow] := SGmem.Cells[2,indxMemRow] + StrFM_gap.Text;
// если кол-во строк в ячейке больше её высоты
if (SGmem.canvas.TextHeight(SGmem.Cells[2,indxMemRow])*2) > SGmem.RowHeights[indxMemRow] then
// то делаем высоту ячейки во столько раз больше, сколько этих строк
SGmem.RowHeights[indxMemRow] := SGmem.canvas.TextHeight(SGmem.Cells[2,indxMemRow])*(StrFM_gap.Count-1)+20;[/code]

В этом случае возникает какой-то глюк в обработчике OnDrawCell при добавлении большого количества строк. Прога просто напросто закрывается без всяких ошибок, а в Дельфях пишет AV.
В чём тут дело?

[-2-]
Код

S := SGmem.Cells[ACol,ARow];
if gdSelected in State then
begin
 SGmem.Canvas.Brush.Color := clInactiveCaptionText;
 SGmem.Canvas.FillRect(Rect);
end;
Inc(Rect.Top, 2);
Dec(Rect.Bottom, 2);
Inc(Rect.Left, 2);
Dec(Rect.Right, 2);
DrawText(SGmem.Canvas.Handle, pChar(S), Length(S), Rect, DT_LEFT or DT_WORDBREAK);


Попробовал так, при таком же методе заполнения строк. Работает лучше! НО, никак не могу докумекать до одной фишки. Дело в том, что тект разбивается на строки, но в ячейке получается такая лажа: в первой строке ячейки добавляется вся остальная строка, разбитая ниже на строки, а когда выделяешь ячейку, то она отсекается и становиться всё пучком,... пока не сдвинешь на другую ячейку. Вот так.

Помогите кто шарит в этом деле, срочно нужно, я уже сегодня весь день у компа торчу, уже недумается...

  Вверх
fess
Дата 6.3.2005, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: 2
Всего: 3



Тебе именно в стандартном StringGrid'e надо?
Если не обязательно, то рекомендую воспользоваться AdvStringGrid'ом с сайта
www.tmssoftware.com. В этом компоненте это реализованно без глюков.
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Guest
Дата 6.3.2005, 21:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот что мне посоветовали:

Код

type
TForm1 = class(TForm)
  Edit1: TEdit;
  AddButton: TButton;
  StringGrid1: TStringGrid;
  procedure FormCreate(Sender: TObject);
  procedure Edit1Change(Sender: TObject);
  procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  procedure AddButtonClick(Sender: TObject);
  procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
    Rect: TRect; State: TGridDrawState);
private
  FRow: integer;
  FCol: integer;
  procedure AdjustRowHeight;
end;

procedure TForm1.AdjustRowHeight;
var
S: string;
R: TRect;
begin
with StringGrid1 do
begin
  S := Cells[FCol, FRow];
  if S = '' then
    S := '!';
  R := CellRect(FCol, FRow);
  InflateRect(R, -2, -2);
  DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK or DT_CALCRECT);
  RowHeights[FRow] := R.Bottom - R.Top + 2
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
AdjustRowHeight;
FCol := -1
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
AddButton.Enabled := Edit1.Text <> ''
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
  Key := #0;
  AddButtonClick(Sender)
end
end;

procedure TForm1.AddButtonClick(Sender: TObject);
begin
with StringGrid1 do
begin
  Inc(FCol);
  if FCol = ColCount then
  begin
    RowCount := RowCount + 1;
    FCol := 0;
    FRow := RowCount - 1
  end;
  Cells[FCol, FRow] := Edit1.Text;
  AdjustRowHeight;
  Edit1.SetFocus
end
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
S: string;
begin
with StringGrid1, Canvas do
begin
  if gdSelected in State then
  begin
    Brush.Color := clHighlight;
    Font.Color := clHighlightText;
  end
  else
    begin
      Brush.Color := clWindow;
      Font.Color := clWindowText
    end;
  FillRect(Rect);
  InflateRect(Rect, -2, -2);
  S := Cells[ACol, ARow];
  DrawText(Canvas.Handle, PChar(S), Length(S), Rect, DT_WORDBREAK)
end
end;


А это файл DFM:

object Form1: TForm1
Left = 229
Top = 137
Width = 699
Height = 552
BorderIcons = [biSystemMenu]
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
DesignSize = (
  691
  518)
PixelsPerInch = 120
TextHeight = 16
object Edit1: TEdit
  Left = 0
  Top = 0
  Width = 692
  Height = 24
  Anchors = [akLeft, akTop, akRight]
  TabOrder = 0
  OnChange = Edit1Change
  OnKeyPress = Edit1KeyPress
end
object AddButton: TButton
  Left = 8
  Top = 30
  Width = 75
  Height = 25
  Caption = 'Add'
  Enabled = False
  TabOrder = 1
  OnClick = AddButtonClick
end
object StringGrid1: TStringGrid
  Left = 0
  Top = 60
  Width = 691
  Height = 458
  Anchors = [akLeft, akTop, akRight, akBottom]
  DefaultDrawing = False
  FixedCols = 0
  RowCount = 1
  FixedRows = 0
  Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goColSizing]
  TabOrder = 2
  OnDrawCell = StringGrid1DrawCell
end
end

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.