![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
stringgrid строки
Сорокин М © (2007-04-22 22:34:00)в гриде орбразуются пустые строки,можно ли как-нибудь исключить их?т.е. если пучтая,то найти ггде след не пустая и поставить на место пусто:)
сам запутолся
{RASkov} (2007-04-27 19:51:00) [1]Вот очередная поправка :)
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;
{RASkov} (2007-04-23 22:04:00) [2]> [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;
:)
Сорокин М (2007-04-23 13:42:00) [3]!!!
Спасибо всем за ответы.
[12] то что надо!
Loginov Dmitry (2007-04-23 07:56:00) [4][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 01:47:00) [5]
> > 1. в некоторых местах не хватает -1.
>
> Где? :)
>
Ну например тут:
> if ARow<RowCount then MoveRow(ARow, ARow + 1)
>
Ага. Значит и в Д7 RowMoved тоже "отмазка".
{RASkov} (2007-04-23 01:36:00) [6]> 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:23:00) [7]
> {RASkov} (23.04.07 01:09) [12]
Интересное решение сабжа.
Только:
1. в некоторых местах не хватает -1.
2. "непонятки" с procedure RowMoved, которая для TCustomGrid является "отмазкой" (Д6)
{RASkov} (2007-04-23 01:09:00) [8]Тогда...:
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 00:46:00) [9]
> ответ в [1] тогда.
В [1] ответ неверный, поскольку по сабжу нужно перемещение строки, а не дублирование оных. А метод DeleteRow как раз и выполняет такое перемещение.
Только вот он перемещает на место удаляемой строки не следущую, а последнюю. :( Но зато сам заботится о RowCount.
{RASkov} (2007-04-23 00:31:00) [10]> [9] Германн © (23.04.07 00:18)
Хм.. Точно. А я чёт сразу про ячейки подумал.... Иначе уж больно просто все - ответ в [1] тогда.
Поправка:
if Trim(Grid.Rows[I] .Text) = '' then...
и замечание в [6]
Германн (2007-04-23 00:18:00) [11]
> Хотел покозать, что совсем пустых Rows может и не быть..
> .
Тогда и удалять нечего! Я именно так сабж и понял.
{RASkov} (2007-04-23 00:12:00) [12]Уплыло :( но думаю мысль понята....
111 | | 111
| 111 |
| | 111
| |
111 | 111 |
| | 111
Навсяк еще раз.
{RASkov} (2007-04-23 00:09:00) [13]> [6] Германн © (22.04.07 23:48)
>Проще было бы пустые строки удалять методом DeleteRow и не забывать уменьшать RowCount при этом.
Германн, каким образом?, например
1 1 1
1 1
111
1 1 1
1 1
1 1 1
Если все уплывет я не виноват :). Хотел покозать, что совсем пустых Rows может и не быть....
Германн (2007-04-22 23:48:00) [14]Проще было бы пустые строки удалять методом DeleteRow и не забывать уменьшать RowCount при этом. Имхо.
{RASkov} (2007-04-22 23:16:00) [15]Там в [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:10:00) [16]RASkov, что ты за человек такой? какой раз мне уже помогаешь...и всегда то что надо. Если бы смог, отблагодарил бы. Памятник тебе, и другим постоянным обитателям мастеров
{RASkov} (2007-04-22 23:05:00) [17]
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:02:00) [18]Т.е. 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;
Loginov Dmitry (2007-04-22 22:51:00) [19]Проверка на пустую строку:
if Trim(Grid.Rows[I]) = '' then...
Присвоение строки:
Grid.Rows[I - 1] := Grid.Rows[I]