Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.031 c
14-1088064553
Andryk
2004-06-24 12:09
2004.07.11
А никто ни где не натыкался на запись


14-1087545812
Nick-From
2004-06-18 12:03
2004.07.11
Ерунда в ворде


1-1087807137
MetalFan
2004-06-21 12:38
2004.07.11
GetPropInfo...


9-1079005124
AxxxE
2004-03-11 14:38
2004.07.11
Определение текущего положения... так сказать начала координат


6-1084427884
AnP
2004-05-13 09:58
2004.07.11
Как избавиться от асинхрониус сокет ерор





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