Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
2-1168193651
blackgrin
2007-01-07 21:14
2007.01.28
латинская буква Е с acute


3-1162375002
Владимир71
2006-11-01 12:56
2007.01.28
dbf в fdb


15-1167892676
Прогер
2007-01-04 09:37
2007.01.28
idMessage Subject/From ISO-8859-1


15-1168463921
PHPdeveloper
2007-01-11 00:18
2007.01.28
бизнес модель ShareWare продукта


15-1168069576
gggg
2007-01-06 10:46
2007.01.28
AutoCAD да да и ще раз AutoCAD..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский