Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизТекст в Stringgride Найти похожие ветки
← →
Lovd_E (2006-12-05 11:16) [0]Уважаемые, мастера.
Скажите, как динамически делать так, что
если текст не вмещается в ячеку переносить его
на другую ячейку, как в Excele.
Заранее спасибо.
← →
ЮЮ © (2006-12-05 11:28) [1]Возьми Excel и не партся.
З.Ы. По моему, это скорее баг, чем фича. Если хочется, чтобы текст был на несколько ячеек, есть объединение ячеек
← →
clickmaker © (2006-12-05 11:32) [2]
> Lovd_E (05.12.06 11:16)
OnDrawCell, рисовать по кускам, разве что
В любом случае, функционал стандартного грида не дотягивает до екселя. Надо наследника писать или искать
← →
ЮЮ © (2006-12-05 11:47) [3]
> рисовать по кускам, разве что
Не обязательно. Просто рисовать не на предложенном ARect-е, а расширить его Left до правой границ грида. Следующая ячейка должна рисоваться только если не пустая.
← →
ЮЮ © (2006-12-05 11:48) [4]Тьфу, ты Right, конечно.
← →
clickmaker © (2006-12-05 12:04) [5]
> [3] ЮЮ © (05.12.06 11:47)
ну да, можно так. А в Objects хранить инфу об ячейке (смержена ли, сколько колонок занимает и пр.)
← →
ЮЮ © (2006-12-05 12:11) [6]Тут даже не о объединенных ячейках идет речь. В Excele, если следующая ячейка пустая, а в текущей текст длинный, то он продолжается и на следующую ячейку.
Для этого и Objects не нужен. А для более крутых вещей - цвет, фонт, объединение - само то
← →
Lovd_E (2006-12-05 12:16) [7]Если не трудно, можно на примере показать.
← →
Elen © (2006-12-05 12:19) [8]
> clickmaker
А еще можно закрыть ячейки скажем Лабелом. В нем такая фича есть
← →
ЮЮ © (2006-12-05 12:20) [9]Если не трудно, полазь по конференции - stringgrid на прошлой неделе столько раз обсуждали, что уже оскомина от него.
На королевстве Delphi есть статья "Полосатый грид". И хотя она и про DBGrid, но предок у них общий. И рисование происходит в похожем обработчике.
← →
ЮЮ © (2006-12-05 12:21) [10]
> А еще можно закрыть ячейки скажем Лабелом. В нем такая фича
> есть
В ком? Что ещё за недокументированные возможности?
← →
Elen © (2006-12-05 12:23) [11]
> Если не трудно, можно на примере показать.
Можно. Как вариант - Создай проект в нем создай Frame. На нем размести Лабел и поставь для Лабела WordWrap. Далее скинь на форму frame и пропиши следующее :
unit Unit1;
interface
uses unit2,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Frame21: TFrame2;
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure FormCreate(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (acol=1)and(arow<>0) then
if StringGrid1.Objects [acol,arow]=nil then begin
StringGrid1.Objects [acol,arow]:=Tframe2.Create(stringgrid1);
TFrame2(StringGrid1.Objects [acol,arow]).Parent :=StringGrid1;
TFrame2(StringGrid1.Objects [acol,arow]).Top:=rect.Top;
TFrame2(StringGrid1.Objects [acol,arow]).Left:=rect.Left;
TFrame2(StringGrid1.Objects [acol,arow]).Name:="frm"+inttostr(acol)+inttostr(arow);
TFrame2(StringGrid1.Objects [acol,arow]).Visible:=true;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.DefaultColWidth:=Frame21.Width;
StringGrid1.DefaultRowHeight:=Frame21.Height;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if StringGrid1.Objects [acol,arow]<>nil then canselect:=false;
end;
end.
Далее в Лабели ячеек через Stringrid.object в капшн вписываеш строки и они сами переносятся.
Намек понял?
← →
clickmaker © (2006-12-05 12:23) [12]
> А еще можно закрыть ячейки скажем Лабелом
это не спортивно. И лишний расход ресурсов. Зачем?
← →
Elen © (2006-12-05 12:24) [13]
> ЮЮ
Label.Caption:=...
← →
Elen © (2006-12-05 12:25) [14]
> это не спортивно. И лишний расход ресурсов. Зачем?
Ну да в общем, но КАК ВАРИАНТ рассмотреть можно... ;)
← →
ЮЮ © (2006-12-05 13:17) [15]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function NeedCells(Grid: TStringGrid; ACol, ARow: integer): integer;
var
i, w: integer;
begin
// вычисляет сколько захватит ячеее для вывода содержимого
w := Grid.Canvas.TextWidth(Grid.Cells[ACol, Arow]);
Result := 1;
for i := ACol + 1 to Grid.VisibleColCount - 1 do begin
if (w < Grid.ColWidths[i]) or (Grid.Cells[i, ARow] <> "") then
break;
Inc(Result);
dec(w, Grid.ColWidths[i] + Grid.GridLineWidth);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
const
str: string = "Это очень длинная строка, которой много надо";
begin
StringGrid1.DefaultDrawing := false;
StringGrid1.RowCount := 5;
StringGrid1.ColCount := 6;
StringGrid1.FixedCols := 0;
StringGrid1.FixedRows := 0;
StringGrid1.DefaultColWidth :=
StringGrid1.Canvas.TextWidth(str) div StringGrid1.ColCount;
;
for i := 0 to StringGrid1.RowCount - 1 do begin
StringGrid1.Cells[0, i] := str;
StringGrid1.Cells[i + 1, i] := "Фиг";
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
i: integer;
w: integer;
begin
if (StringGrid1.Cells[ACol, ARow] = "") and (ACol > 0) then begin
// проверим, не "пересекли" ли нас слева
for i := ACol - 1 downto 0 do begin
if StringGrid1.Cells[i, ARow] <> "" then begin
// это могля сделать только она
w := NeedCells(StringGrid1, i, ARow);
if i + w - 1 >= ACol then Exit; // нас накрыло
break;
end;
end;
end;
for i := ACol + 1 to NeedCells(StringGrid1, ACol, ARow) - 1 do
// захват прространства справа если надо
Rect.Right :=
Rect.Right + StringGrid1.GridLineWidth + StringGrid1.ColWidths[i];
StringGrid1.Canvas.FillRect(Rect);
DrawText(
StringGrid1.Canvas.Handle,
PChar(StringGrid1.Cells[ACol, ARow]),
Length(StringGrid1.Cells[ACol, ARow]),
Rect,
0
);
end;
← →
Loginov Dmitry © (2006-12-05 15:30) [16]> Скажите, как динамически делать так, что
> если текст не вмещается в ячеку переносить его
> на другую ячейку, как в Excele.
Альтернативное предложение:
А не проще-ли автоматический перенос строк сделать?
← →
Anatoly Podgoretsky © (2006-12-05 15:31) [17]> Loginov Dmitry (05.12.2006 15:30:16) [16]
А зачем альтернатива и чему, в Экселе текст не переносится в другую ячейку
← →
Loginov Dmitry © (2006-12-05 15:39) [18]> А зачем альтернатива
Всегда должен быть альтернативный вариант :)
← →
Anatoly Podgoretsky © (2006-12-05 16:02) [19]> Loginov Dmitry (05.12.2006 15:39:18) [18]
Альтернатива предполагает два варианта как минимум, поскольку Эксель не переносит данные в другую ячейку то альтернативые нет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.042 c