Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Удаление строк в Стринггриде   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.047 c
3-1086763950
Петр
2004-06-09 10:52
2004.07.11
Создание файла базы данных InterBase с помощью TIBDataBase.


1-1088260398
RustamuS
2004-06-26 18:33
2004.07.11
как получить URL


14-1088082581
RealRascal
2004-06-24 17:09
2004.07.11
Fuzz


14-1087782316
Vasya.ru
2004-06-21 05:45
2004.07.11
создание сети из 2х компьютеров


14-1087494698
Подкрадуха
2004-06-17 21:51
2004.07.11
SDK для SkyStar1