Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Текст в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
15-1168261497
Iosif
2007-01-08 16:04
2007.01.28
Помогите упростить


15-1168422748
BiN
2007-01-10 12:52
2007.01.28
Прошу помочь обладателей Microsoft Visual Studio 6.0


2-1168508786
Shuttle
2007-01-11 12:46
2007.01.28
плиз


15-1168249479
Parus
2007-01-08 12:44
2007.01.28
ASP VBSCRIPT


2-1168362269
Cj
2007-01-09 20:04
2007.01.28
Получение пути фаила программы (процесса)