Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Вниз

stringgrid строки   Найти похожие ветки 

 
Сорокин М   (2007-04-22 22:34) [0]

в гриде орбразуются пустые строки,можно ли как-нибудь исключить их?т.е. если пучтая,то найти ггде след не пустая и поставить на место пусто:)
сам запутолся


 
Loginov Dmitry ©   (2007-04-22 22:51) [1]

Проверка на пустую строку:
if Trim(Grid.Rows[I]) = "" then...

Присвоение строки:
Grid.Rows[I - 1] := Grid.Rows[I]


 
Сорокин М   (2007-04-22 23:02) [2]

Т.е. 4 строка должна замениться на 5,а 5 стать пустой...
var
i,j:integer;
begin
for i:=0 to stringgrid1.ColCount - 1 do begin
stringgrid1.Cells[i,2]:=inttostr(i);
stringgrid1.Cells[i,3]:=inttostr(i);
stringgrid1.Cells[i,5]:=inttostr(i);
end;
for j:=1 to stringgrid1.RowCount -1  do
if stringgrid1.Cells[0,j]="" then begin
for i:=0 to stringgrid1.ColCount - 1 do begin
stringgrid1.Cells[i,j]:=stringgrid1.Cells[i,j+1];
stringgrid1.Cells[i,j+1]:="";
end;

end;


 
{RASkov}   (2007-04-22 23:05) [3]

var R, C, N: Integer;
begin
 for C := StringGrid.FixedCols to StringGrid.ColCount-1 do begin
  R := StringGrid.FixedRows;
  while R < StringGrid.RowCount-1 do begin
   N := R+1;
    while (StringGrid.Cells[C, N] = "") and (N < StringGrid.RowCount-1) do INC(N);
    if StringGrid.Cells[C, N] <> "" then begin
     StringGrid.Cells[C, R] := StringGrid.Cells[C, N];
     StringGrid.Cells[C, N] := "";
    end;
   INC(R);
  end;
 end;
end;


 
Сорокин М   (2007-04-22 23:10) [4]

RASkov, что ты за человек такой? какой раз мне уже помогаешь...и всегда то что надо. Если бы смог, отблагодарил бы. Памятник тебе, и другим постоянным обитателям мастеров


 
{RASkov}   (2007-04-22 23:16) [5]

Там в [3] ошибка вот:
......
  while R<StringGrid.RowCount-1 do begin
   N:=R+1;
   if StringGrid.Cells[C, R]<>"" then begin INC(R); Continue; end;
.......

так исправить надо, иначе первую строку удаляет всегда.
> [4] Сорокин М   (22.04.07 23:10)

:)


 
Германн ©   (2007-04-22 23:48) [6]

Проще было бы пустые строки удалять методом DeleteRow и не забывать уменьшать RowCount при этом. Имхо.


 
{RASkov}   (2007-04-23 00:09) [7]

> [6] Германн ©   (22.04.07 23:48)
>Проще было бы пустые строки удалять методом DeleteRow и не забывать уменьшать RowCount при этом.

Германн, каким образом?, например
1 1 1
1 1
111
1 1 1
1 1
1 1 1

Если все уплывет я не виноват :). Хотел покозать, что совсем пустых Rows может и не быть....


 
{RASkov}   (2007-04-23 00:12) [8]

Уплыло :( но думаю мысль понята....

111 |     | 111
   | 111 |
   |     | 111
   |     |
111 | 111 |
   |     | 111

Навсяк еще раз.


 
Германн ©   (2007-04-23 00:18) [9]


> Хотел покозать, что совсем пустых Rows может и не быть..
> .

Тогда и удалять нечего! Я именно так сабж и понял.


 
{RASkov}   (2007-04-23 00:31) [10]

> [9] Германн ©   (23.04.07 00:18)

Хм.. Точно. А я чёт сразу про ячейки подумал.... Иначе уж больно просто все - ответ в [1] тогда.
Поправка:
if Trim(Grid.Rows[I].Text) = "" then...
и замечание в [6]


 
Германн ©   (2007-04-23 00:46) [11]


> ответ в [1] тогда.

В [1] ответ неверный, поскольку по сабжу нужно перемещение строки, а не дублирование оных. А метод DeleteRow как раз и выполняет такое перемещение.
Только вот он перемещает на место удаляемой строки не следущую, а последнюю. :( Но зато сам заботится о RowCount.


 
{RASkov}   (2007-04-23 01:09) [12]

Тогда...:

type
 TMyGr = class(TCustomGrid)
   procedure DeleteRow(ARow: Longint); override;
 end;

procedure TMyGr.DeleteRow(ARow: Integer);
begin
 if ARow<RowCount then MoveRow(ARow, ARow + 1)
  else if RowCount>0 then RowCount := RowCount - 1;
end;

procedure TForm.ButtonClick(Sender: TObject);
var R: Integer;
begin
 R:=StringGrid.FixedRows;
 while (R<>StringGrid.RowCount) and (StringGrid.RowCount>StringGrid.FixedRows+1) do begin
  if Trim(StringGrid.Rows[R].Text)="" then begin TMyGr(StringGrid).DeleteRow(R); Continue; end;
  INC(R);
 end;
end;

...так :)


 
Германн ©   (2007-04-23 01:23) [13]


> {RASkov}   (23.04.07 01:09) [12]

Интересное решение сабжа.
Только:
1. в некоторых местах не хватает -1.
2. "непонятки" с procedure RowMoved, которая для TCustomGrid является "отмазкой" (Д6)


 
{RASkov}   (2007-04-23 01:36) [14]

> 1. в некоторых местах не хватает -1.

Где? :)

> 2. "непонятки" с procedure RowMoved, которая для TCustomGrid
> является "отмазкой" (Д6)

не совсем понял.... Я и не использую RowMoved. В D7 RowMoved - dynamic метод

или....
procedure TCustomGrid.MoveRow(FromIndex, ToIndex: Longint);
begin
 if Assigned(FRowHeights) then
   MoveExtent(FRowHeights, FromIndex + 1, ToIndex + 1);
 MoveAdjust(FCurrent.Y, FromIndex, ToIndex);
 MoveAdjust(FAnchor.Y, FromIndex, ToIndex);
 MoveAdjust(FInplaceRow, FromIndex, ToIndex);
 RowMoved(FromIndex, ToIndex);
 if Assigned(FRowHeights) then
   RowHeightsChanged;
 UpdateEdit;
end;

procedure TCustomGrid.RowMoved(FromIndex, ToIndex: Longint);
begin
end;

...выделенное не понятно...? Вобщем - 2. я не понял про что :(


 
Германн ©   (2007-04-23 01:47) [15]


> > 1. в некоторых местах не хватает -1.
>
> Где? :)
>

Ну например тут:

>  if ARow<RowCount then MoveRow(ARow, ARow + 1)
>

Ага. Значит и в Д7 RowMoved тоже "отмазка".


 
Loginov Dmitry ©   (2007-04-23 07:56) [16]

[1] - опечатался :(

Вот такой код может может пригодится (юзается мною уже в нескольких приложениях):


procedure TMainForm.sgDepListKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
var
 I: Integer;  
begin
 case Key of
   VK_DOWN:
     begin
       // Если стоим на последней строке, то добавляем новую строку
       if (sgDepList.Row = sgDepList.RowCount - 1) and
         (Trim(sgDepList.Rows[sgDepList.RowCount - 1].Text) <> "") then
         sgDepList.RowCount := sgDepList.RowCount + 1;
     end;
   VK_UP:
     begin
       // Если курсор стоял на последней строке, она пустая, и > 1,
       // то удаляем ее
       if (sgDepList.Row > 1) and
         (sgDepList.Row = sgDepList.RowCount - 1) and
         (Trim(sgDepList.Rows[sgDepList.Row].Text) = "") then
       begin
         sgDepList.Rows[sgDepList.Row].Clear;
         sgDepList.RowCount := sgDepList.RowCount - 1;

         // Устанавливаем курсор на последнюю строку
         sgDepList.Row := sgDepList.RowCount - 1;
         Key := 0;
       end;
     end;
 end;

 if (Shift = [ssCtrl]) and (Key = VK_DELETE) then
 begin
   if Application.MessageBox(PChar(
     "Вы действительно хотите удалить данную запись?"),
     "Подтверждение",
     MB_OKCANCEL or MB_ICONQUESTION) = ID_OK then
   begin
     sgDepList.Rows[sgDepList.Row].Clear;
     // Перемещаем нижележащие записи на верх
     for I := sgDepList.Row to sgDepList.RowCount - 1 do
       sgDepList.Rows[I].Assign(sgDepList.Rows[I + 1]);

     if sgDepList.RowCount > 2 then
       sgDepList.RowCount := sgDepList.RowCount - 1;
   end;
 end;

end;


Правда автору вроде бы как уже давно помогли...


 
Сорокин М   (2007-04-23 13:42) [17]

!!!
Спасибо всем за ответы.
[12] то что надо!


 
{RASkov}   (2007-04-23 22:04) [18]

> [17] Сорокин М   (23.04.07 13:42)
> [12] то что надо!

Сбило меня с толку

> Только вот он перемещает на место удаляемой строки не следущую, а последнюю.

Всё немного проще, нежели в [12], вот:

type TMyGr = class(TCustomGrid);
procedure TForm1.ButtonClick(Sender: TObject);
var N: Integer;
begin
   for N := StringGrid.RowCount-1 downto StringGrid.FixedRows do
    if Trim(StringGrid.Rows[N].Text)="" then TMyGr(StringGrid).DeleteRow(N);
end;

:)


 
{RASkov} ©   (2007-04-27 19:51) [19]

Вот очередная поправка :)
type TMyGr = class(TCustomGrid);
procedure TForm1.ButtonClick(Sender: TObject);
var N: Integer;
begin
  for N := StringGrid.RowCount-1 downto StringGrid.FixedRows do
   if Trim(StringGrid.Rows[N].Text)="" then if StringGrid.RowCount-1>StringGrid.FixedRows then TMyGr(StringGrid).DeleteRow(N);
end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.045 c
2-1177511768
Stas12
2007-04-25 18:36
2007.05.20
Поиск в бинарном файле.


15-1176785713
Задача
2007-04-17 08:55
2007.05.20
Задача


15-1176816514
CCili
2007-04-17 17:28
2007.05.20
Как в голове может остаться хоть что-нить после такого удара?


2-1177786996
Sonic90
2007-04-28 23:03
2007.05.20
Forms Position


1-1174589370
Кто ответит на вопрос?:)
2007-03-22 21:49
2007.05.20
Управление Excel-ем





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