Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизУдаление строк в Стринггриде Найти похожие ветки
← →
Partos (2004-06-24 13:04) [0]Приветы
Народ, может кто-нить мне сможет объяснить или подсказать в следующей проблеме:
Есть Стринггрид. В него я записываю какие-то данные.Не только в Cells, но и в Objects этих Cells...А теперь мне нужно чтобы пользователь мог клацать между строками и если ему какая-то строка не понравилась он мог бы её удалить (именно удалить а не очистить!! И Objects этих Cells в том числе!Потом эти строки записываються в БД в цикле! И если встретится пустая строка то Oracle и пользователь меня обматерят самыми гнилыми словами...). Не важно-в середине или в начале или в конце Стринггрида распологаеться эта строка.
Действия user-а непредсказуемы..
Я порылся в хэлпе и нашёл следующий метод:
StringGrid1.Rows[Index].Delete(Index);
Вроде всё хорошо, указываешь номер строки и её благополучно удаляешь...но...Написал я на нажатие кнопочки "DEL" следующее:procedure TMainForm.StringGrid1KeyUp(Sender: TObject; var Key: Word;Shift: TShiftState);
begin
if Key=46 then
StringGrid1.Rows[StringGrid1.Row].Delete(StringGrid1.Row);
end;
И вот облом...Запускаешь приложение, клацаешь по стрниггриду, нажимаешь Del и выдаёться ошибка: cannot insert or delete rows from grid.
Editing на Стринггриде =true. Почему оно не может удалить строку никак не могу понять...
← →
MetalFan © (2004-06-24 13:30) [1]
> StringGrid1.Rows[StringGrid1.Row].Delete(StringGrid1.Row);
а низзя так!
надо освободить объекты удаляемой строки, сместить все остальное... а потом RowCount := RowCount - 1 )))
← →
Partos (2004-06-24 13:51) [2]хех....а надо!!!
← →
Тимохов © (2004-06-24 13:52) [3]если не ошибаюсь в stringgrid нет удаления строк, только перемещение строк идущих дальше на строку верх и уменьшение колва строк.
← →
Partos (2004-06-24 15:04) [4]А что такое тогда :
> StringGrid1.Rows[StringGrid1.Row].Delete(StringGrid1.Row);
и почему когда я пытаюсь это сделать то выпадает ошибка:
cannot insert or delete rows from grid
Значит что-то такое есть...Только есть какая-то причина (возможно какое-то свойство StringGrid), которая не даёт это сделать!
← →
Тимохов © (2004-06-24 15:06) [5]
> Значит что-то такое есть...
бог в помощь
← →
GuAV © (2004-06-24 15:19) [6]Короче вот кусок из исходников
procedure TStringGridStrings.Delete(Index: Integer);
begin
InvalidOp(sInvalidStringGridOp);
end;
А свойтво есть только потому, что оно есть абстракным в TStrings.
← →
Partos (2004-06-24 15:33) [7]а как посмотреть исходник какого-то метода?
← →
GuAV © (2004-06-24 15:38) [8]самый удобный способ - Ctrl+Click
Кстати то что метод не реализован - ничего удивитеоьного.
Например мне кат-то пришлось завернуть парамеры WM_DROPFILES в ТStrings (для удобства работы и освобождения хендла) - так такая же ситуация была со всеми свойствами/методами записи.
← →
wisekaa © (2004-06-24 16:04) [9]
> Partos
Алгоритм примерно такой:
1. Переместить данные в низ (соответственно поднимая другие на верх)
2. Уменьшить колл-во строк (при этом не забудь уменьшение кол-ва строк не ведет к освобождению памяти)
Второй вариант:
Все данные храняться в массиве структур, в Грид только выводяться. Делаешь удаление из массива и процедуру заполнения грида.
Третий вариант:
Использовать другой компонент наследник от TStringGrid в котором все это реализовано. Мы у себя на фирме такой написали, т.к. это самый лучьший вариант (ИХМО).
← →
MIGUR (2004-06-25 00:49) [10]Привет, нарыл данный код очень давно в нете и пользуюсь им в данный момент:
Type TFakeGrid=class(TCustomGrid);
...
procedure TForm1.Button1Click(Sender: TObject);
begin
TFakeGrid(StringGrid1).DeleteRow(StringGrid1.row);
end;
Удаляет полностью всю выбранную строчку.
← →
ЮЮ © (2004-06-25 09:10) [11]>MIGUR (25.06.04 00:49) [10]
>TFakeGrid(StringGrid1).DeleteRow(StringGrid1.row);
Вот только TCustomGrid ничего не знает о TStringGrid.Objects и, очевидно, к чему приведет хакерский подход
← →
Partos (2004-06-25 10:58) [12]Пасибки Вам за внимание, народ!
wisekaa, у меня к тебе кучу вопросов!!!
Ты б не мог мне выслать вот этот самый компонентик (праблатнённый StringGrid). Я очень часто пользуюсь этим стринггридом и мне бы он пригодился!Если же это чисто Вашей фирмы разработка и вы её не собираетесь распространять, то уж извини за такую хамскую просьбу :)
Перемещать строки мне не очень годиться...это нужно перемещать и те объекты, которые храняться в Objects а это очень много гемороя.
А вот насчёт массива ты что-то загнул такое умное...Я честно говоря никак не допру...можешь объяснить что такое массив структур? И как к нему обратиться...И как с этим массивом работать и как из него удалить нужную мне строчку? И удалится ли при этом Objects этой строчки?Или Objects строчки храниться как отдельный элемент массива?
← →
MetalFan © (2004-06-25 11:29) [13]
> Перемещать строки мне не очень годиться...это нужно перемещать
> и те объекты, которые храняться в Objects а это очень много
> гемороя.
ну и что тут гемморойного?
...
procedure DelRow(aStringGrid: TStringGrid; aRow: integer);
var
i: integer;
begin
ClearObjects(aStringGrid, aRow); //какая нибудь процедурка, кот. будет очищать объекты
for I := aRow to (aStringGrid.RowCount - 2) do
aStringGrid.Rows[I].assign(aStringGrid.Rows[I+1]);
aStingGrid.RowCount := aStingGrid.RowCount - 1;
end;
примерно так...
← →
wisekaa © (2004-06-25 11:58) [14]
> Partos
После выходных вышлю примерчик, компонет дать не смогу, но постараюсь подобрать тебе похожий - бесплатный.
← →
Леприкон © (2004-06-25 14:03) [15]
procedure SGDeleteRow(SG:TStringGrid; RowIndex:integer);
var i:integer;
begin
with SG do
begin
for i:=RowIndex to RowCount-1 do
Rows[i].Assign(Rows[i+1]);
RowCount:=RowCount-1;
end;
end;
← →
MetalFan © (2004-06-25 14:31) [16]
> Rows[i].Assign(Rows[i+1]);
и что же будет, когда I = RowCount-1 ? )))
← →
Serge © (2004-06-25 14:38) [17]Вставка и удаление строк в StringGrid
--------------------------------------------------------------------------------
Автор: Dennis Passmore
...я не нашел никаких методов для вставки и удаления строк...
Поскольку свойство Cols[x] компонента TStringGrid реально является компонентом TStrings, все методы TStrings применимы также и к Cols[x].
Недавно в интернете я нашел реализацию расширенных функций TStringGrid:
(*
Создано: Dennis Passmore
1929 Mango Tree Drive
Edgewater, Fl. 32141
CIS: 71640,2464
Март 1, 1996
Данный код свободен в использовании при одном условии:
в исходном коде должна присутствовать указанная выше кредитка
со ссылкой на автора.
Примечание по использованию кода:
Всякий раз при удалении Row (строки) или Column (колонки)
проверяйте наличие и удаляйте любые объекты, которые могли
быть назначены любой ячейке в строке или колонке, которые вы
собираетесь удалять, поскольку данный код не может знать ни
размера, ни типа ассигнованных ими объектов.
*)
unit GridFunc;
interface
uses
Sysutils, WinProcs, Grids;
procedure InsertRow(Sender: TStringGrid; ToIndex: Longint);
procedure DeleteRow(Sender: TStringGrid; FromIndex: Longint);
procedure InsertColumn(Sender: TStringGrid; ToIndex: Longint);
procedure DeleteColumn(Sender: TStringGrid; FromIndex: Longint);
implementation
type
TCSGrid = class(TStringGrid)
private
public
procedure MoveRow(FromIndex, ToIndex: Longint);
procedure MoveColumn(FromIndex, ToIndex: Longint);
end;
procedure TCSGrid.MoveRow(FromIndex, ToIndex: Longint);
begin
RowMoved(FromIndex, ToIndex); { Защищенный метод TStringGrid }
end;
procedure TCSGrid.MoveColumn(FromIndex, ToIndex: Longint);
begin
ColumnMoved(FromIndex, ToIndex); { Защищенный метод TStringGrid }
end;
procedure InsertRow(Sender: TStringGrid; ToIndex: Longint);
var
xx, yy: Integer;
begin
if ToIndex >= 0 then
with TCSGrid(Sender) do
if (ToIndex <= RowCount) then
begin
RowCount := RowCount + 1;
xx := RowCount - 1;
for yy := 0 to ColCount - 1 do
begin
Cells[yy, xx] := " ";
ObJects[yy, xx] := nil;
end;
if ToIndex < RowCount - 1 then
MoveRow(RowCount - 1, ToIndex);
end
else
MessageBeep(0)
else
MessageBeep(0);
end;
procedure DeleteRow(Sender: TStringGrid; FromIndex: Longint);
begin
if FromIndex > l;
= 0 then
with TCSGrid(Sender) do
if (RowCount > 0) and (FromIndex < RowCount) then
begin
if (FromIndex < RowCount - 1) then
MoveRow(FromIndex, RowCount - 1);
Rows[RowCount - 1].Clear;
RowCount := RowCount - 1;
end
else
MessageBeep(0)
else
MessageBeep(0);
end;
procedure InsertColumn(Sender: TStringGrid; ToIndex: Longint);
var
xx, yy: Integer;
begin
if ToIndex >= 0 then
with TCSGrid(Sender) do
if (ToIndex <= ColCount) then
begin
ColCount := ColCount + 1;
xx := ColCount - 1;
Cols[xx].BeginUpdate;
for yy := 0 to RowCount - 1 do
begin
Cells[xx, yy] := " ";
ObJects[xx, yy] := nil;
end;
Cols[xx].EndUpdate;
if ToIndex < ColCount - 1 then
MoveColumn(ColCount - 1, ToIndex);
end
else
MessageBeep(0)
else
MessageBeep(0);
end;
procedure DeleteColumn(Sender: TStringGrid; FromIndex: Longint);
begin
if FromIndex >= 0 then
with TCSGrid(Sender) do
if (ColCount > 0) and (FromIndex < ColCount) then
begin
if (FromIndex < ColCount - 1) then
MoveColumn(FromIndex, ColCount - 1);
Cols[ColCount - 1].Clear;
ColCount := ColCount - 1;
end
else
MessageBeep(0)
else
MessageBeep(0);
end;
end.
← →
Леприкон © (2004-06-25 14:39) [18]
> MetalFan © (25.06.04 14:31) [16]
т.е.
for i:=RowIndex to RowCount-2 do
:))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.036 c