Форум: "Начинающим";
Текущий архив: 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