5 / 5 / 2
Регистрация: 21.03.2010
Сообщений: 46
1

удаление и вставка строки в StringGid в нужном месте

02.05.2010, 17:17. Показов 3173. Ответов 3
Метки нет (Все метки)

доброго времени суток!!!

Помогите разобраться с удалением и вставкой в StringGid.
Необходимо чтобы можно было вставить и удалить строку в нужном месте.

вот мой вариант удаления строки:
Код
procedure TForm1.Button_delClick(Sender: TObject);
var
  i,j: Integer;
begin
  j:=StringGrid1.Row; // строка с выделением
  StringGrid1.Rows[j].Clear;
  for i:=j to StringGrid1.RowCount-2 do
    StringGrid1.Rows[i].Assign(StringGrid1.Rows[i+1]);
  StringGrid1.RowCount:=StringGrid1.RowCount-1;
end;

Удаление в нужном месте получилось, вот только если начинаешь удалять все записи по очереди и дело подходит к фиксированной строке с наименованием столбцов, фиксированную строку удаляет тоже.
подскажите ка сделать что бы не удалялась фиксированная строка.

А с вставкой строки в нужном месте вообще в голову нечего кроме стандартной вставки не приходит.
Господа профессиональные программисты помогите новичку в этом поприще.
прилагаю исходник
Вложения
Тип файла: rar Ins_Del_SringGrid.rar (13.0 Кб, 15 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2010, 17:17
Ответы с готовыми решениями:

Создание классов. Нужный метод в нужном месте
Вопрос по созданию своих классов. Создается класс TXPathFinder, который обрабатывает (например)...

Перенос картинок по форме, а затем закрепление их в нужном месте
Всем привет. В общем как понятно из названия необходимо перемещать картинки по форме в и...

Webbrowser найти текст в нужном месте и скопировать его
Здравствуйте товарищи! Суть моего вопроса состоит в том, что столкнулся с проблемой, а именно: не...

Вставка строки/столбца в таблицу в произвольном месте
Поискал в гугле, но не нашёл ответа на вопрос. Можно ли вставить новый ряд перед существующим. Я...

3
5 / 5 / 2
Регистрация: 21.03.2010
Сообщений: 46
02.05.2010, 20:12  [ТС] 2
с удалением проблему решил
Код
procedure TForm1.Button_delClick(Sender: TObject);
var
  i,j: Integer;
begin
  j:=StringGrid1.Row; 
  if (j = 1) and (StringGrid1.RowCount <= 2) then
   begin
    with StringGrid1 do
     for i:= 0 to ColCount - 1 do Cells[i, j]:= '';
    exit; // не удаляем последнюю строку чтобы не потерять фиксированной
   end;
  StringGrid1.Rows[j].Clear;
  for i:=j to StringGrid1.RowCount-2 do
    StringGrid1.Rows[i].Assign(StringGrid1.Rows[i+1]);
  StringGrid1.RowCount:=StringGrid1.RowCount-1;
end;
пойду по шаманю над вставкой строки в нужном месте
вот только вообще придумать пока ни чего не могу
может кто подкинет идею?

Добавлено через 1 час 10 минут
мне предложили такой вариант:
Код
procedure SGInsertRow(SG: TStringGrid; NewRow: Integer);   
var  
  i: Integer;   
begin  
  if NewRow < 0 then  
    NewRow := 0; // либо 1, задайте нужное вам поведение   
  with SG do  
  begin  
    RowCount := RowCount + 1;   
    if NewRow < RowCount - 1 then  
    begin  
      for i := RowCount - 1 downto NewRow + 1 do  
        Rows[i].Assign(Rows[i - 1]);   
    end;   
    Rows[NewRow].Clear;   
  end;   
end;


 procedure TForm1.Button_insClick(Sender: TObject);
begin
SGInsertRow(StringGrid1,2);
end;

только он вставляет во вторую строку, а мне надо над или под выделенной строкой
может у кого есть варианты
0
5 / 5 / 2
Регистрация: 21.03.2010
Сообщений: 46
02.05.2010, 21:07  [ТС] 3
вот переправленный вариант:
Код:

Код
procedure SGInsertRow(SG: TStringGrid; NewRow: Integer);   
var  
  i: Integer;   
begin  
  if NewRow < 0 then  
    NewRow := 0; // либо 1, задайте нужное вам поведение   
  with SG do  
  begin  
    RowCount := RowCount + 1;   
    if NewRow < RowCount - 1 then  
    begin  
      for i := RowCount - 1 downto NewRow + 1 do  
        Rows[i].Assign(Rows[i - 1]);   
    end;   
    Rows[NewRow].Clear;   
  end;   
end;


 procedure TForm1.Button_insClick(Sender: TObject);
begin
 SGInsertRow(StringGrid1,StringGrid1.Row); //Вставляет перед выделенной ячейкой
 // SGInsertRow(StringGrid1,StringGrid1.Row + 1); //Вставляет после выделенной ячейки
end;
получился монолог сам задал вопрос, сам на него ответил

вот до кучи исходник может кому нибудь поможет
тут загрузка/сохранение,вставка/удаление
Вложения
Тип файла: rar string_grid.rar (9.8 Кб, 34 просмотров)
1
13082 / 5867 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
03.05.2010, 14:06 4
Я в своё время изучал эту проблему. Написал модуль на основе идей, почерпнутых в инете. В TStringGrid нет публичных методов для удаления/вставки/переноса строк и столбцов. Но есть методы переноса в секции Protected. Вот на их основе и реализуется всё остальное. Т. е. задача - представить методы переноса в секции Public и реализовать в этом же разделе все необходимые действия.
Модуль кроме вставки/удаления/пермещения строк и столбцов, содержит процедуру вырванивания ширины столбцов по их содержимому.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
unit uStrGrUtils;
 
interface
 
uses
  Grids;
 
//**************************************************
//Процедуры для работы с объектом класса TStringGrid или потомка этого класса.
//Вставка, удаление, перемещение строк и столбцов, выравнивание ширины
//столбцов по их содержимому.
//**************************************************
 
//Вставляет новую строку.
procedure InsertRow(aStringGrid : TStringGrid; aToIndex : Longint);
 
//Вставляет новый столбец.
procedure InsertColumn(aStringGrid : TStringGrid; aToIndex : Longint);
 
//Удаляет строку.
procedure DeleteRow(aStringGrid : TStringGrid; aFromIndex : Longint);
 
//Удаляет столбец.
procedure DeleteColumn(aStringGrid : TStringGrid; aFromIndex : Longint);
 
//Переносит строку из одной позиции в другую.
procedure MoveRow(aStringGrid : TStringGrid; aFromIndex, aToIndex : Longint);
 
//Переносит столбец из одной позиции в другую.
procedure MoveColumn(aStringGrid : TStringGrid; aFromIndex, aToIndex : Longint);
 
//Процедура выравнивания ширины столбца по его содержимому.
//Если aDefaultColWidth = -1, то ширина столбца не станет меньшей, чем aStringGrid.DefaultColWidth.
procedure ColumnWidthAlign(aStringGrid: TStringGrid; aColNum : Longword; aDefaultColWidth : Integer = -1);
 
 
implementation
 
//**************************************************
// Описание и реализация класса потомка TStringGrid,
// в котором реализованы методы вставки, удаления, перемещения для
// строк и столбцов.
//**************************************************
 
type
  TMStringGrid = class(TStringGrid)
  public
    procedure _MoveRow(aFromIndex, aToIndex : Longint);
    procedure _MoveColumn(aFromIndex, aToIndex : Longint);
    procedure _InsertRow(aToIndex : Longint);
    procedure _InsertColumn(aToIndex : Longint);
    procedure _DeleteRow(aFromIndex : Longint);
    procedure _DeleteColumn(aFromIndex : Longint);
  end;
 
procedure TMStringGrid._MoveRow(aFromIndex, aToIndex : Longint);
begin
  RowMoved(aFromIndex, aToIndex);
end;
 
procedure TMStringGrid._MoveColumn(aFromIndex, aToIndex : Longint);
begin
  ColumnMoved(aFromIndex, aToIndex);
end;
 
procedure TMStringGrid._InsertRow(aToIndex : Longint);
begin
  RowCount := RowCount + 1;
  MoveRow(RowCount - 1, aToIndex);
end;
 
procedure TMStringGrid._InsertColumn(aToIndex : Longint);
begin
  ColCount := ColCount + 1;
  MoveColumn(ColCount - 1, aToIndex);
end;
 
procedure TMStringGrid._DeleteRow(aFromIndex : Longint);
begin
  MoveRow(aFromIndex, RowCount - 1);
  Rows[RowCount - 1].Clear;
  RowCount := RowCount - 1;
end;
 
procedure TMStringGrid._DeleteColumn(aFromIndex : Longint);
begin
  MoveColumn(aFromIndex, ColCount - 1);
  Cols[ColCount - 1].Clear;
  ColCount := ColCount - 1;
end;
 
//**************************************************
 
procedure InsertRow(aStringGrid : TStringGrid; aToIndex : Longint);
begin
  with TMStringGrid(aStringGrid) do begin
    if (aToIndex < FixedRows) or (aToIndex > RowCount) then
      Exit
    ;
    _InsertRow(aToIndex);
  end;
end;
 
procedure InsertColumn(aStringGrid : TStringGrid; aToIndex : Longint);
begin
  with TMStringGrid(aStringGrid) do begin
    if (aToIndex < FixedCols) or (aToIndex > ColCount) then
      Exit
    ;
    _InsertColumn(aToIndex);
  end;
end;
 
procedure DeleteRow(aStringGrid : TStringGrid; aFromIndex : Longint);
begin
  with TMStringGrid(aStringGrid) do begin
    if (aFromIndex < FixedRows) or  (aFromIndex > RowCount - 1) then
      Exit
    ;
    if (aFromIndex = FixedRows) and (aFromIndex = Pred(RowCount)) then
      Rows[aFromIndex].Clear
    else
      _DeleteRow(aFromIndex)
    ;
  end;
end;
 
procedure DeleteColumn(aStringGrid : TStringGrid; aFromIndex : Longint);
begin
  with TMStringGrid(aStringGrid) do begin
    if (aFromIndex < FixedCols) or  (aFromIndex > ColCount - 1) then
      Exit
    ;
    if (aFromIndex = FixedCols) and (aFromIndex = Pred(ColCount)) then
      Cols[aFromIndex].Clear
    else
      _DeleteColumn(aFromIndex)
    ;
  end;
end;
 
procedure MoveRow(aStringGrid : TStringGrid; aFromIndex, aToIndex : Longint);
begin
  with TMStringGrid(aStringGrid) do begin
    if (aFromIndex < FixedRows) or  (aFromIndex > RowCount - 1) then
      Exit
    ;
    if (aToIndex < FixedRows) or  (aToIndex > RowCount - 1) then
      Exit
    ;
    _MoveRow(aFromIndex, aToIndex);
  end;
end;
 
procedure MoveColumn(aStringGrid : TStringGrid; aFromIndex, aToIndex : Longint);
begin
  with TMStringGrid(aStringGrid) do begin
    if (aFromIndex < FixedCols) or  (aFromIndex > ColCount - 1) then
      Exit
    ;
    if (aToIndex < FixedCols) or  (aToIndex > ColCount - 1) then
      Exit
    ;
    _MoveColumn(aFromIndex, aToIndex);
  end;
end;
 
procedure ColumnWidthAlign(aStringGrid: TStringGrid; aColNum : Longword; aDefaultColWidth : Integer = -1);
var
  RowNum       : Integer;
  ColWidth     : Integer;
  MaxColWidth  : Integer;
begin
  if (aColNum < 0) or (aColNum > Pred(aStringGrid.ColCount)) then
    Exit
  ;
  if aDefaultColWidth < 0 then
    MaxColWidth := aStringGrid.DefaultColWidth
  else
    MaxColWidth := aDefaultColWidth
  ;
  for RowNum := 0 to Pred(aStringGrid.RowCount) do begin
    ColWidth := aStringGrid.Canvas.TextWidth(aStringGrid.Cells[aColNum, RowNum]);
    if MaxColWidth < ColWidth then
      MaxColWidth := ColWidth
    ;
  end;
  //+5 - потому что иногда текст всёже немного не умещается по ширине. :-)
  aStringGrid.ColWidths[aColNum] := MaxColWidth + 5;
end;
 
end.
В модуле при удалении строк и столбцов применяется очистка, например для столбцов:
Delphi
1
  Cols[ColCount - 1].Clear;
Казалось бы это лишнее действие. На самом деле такой код необходим для предотвращения бага TStringGrid - когда ранее удалённые строки или столбцы вдруг "возвращаются" в таблицу при расширении её размеров. Это плавающий баг - он проявлятется не всегда.
Представленный код очистки устраняет этот баг.
---
Демонстрационный проект с использованием этого модуля:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
uses
  uStrGrUtils;
 
//Добавить строку.
procedure TForm1.Button1Click(Sender: TObject);
var
  RowNum : Integer;
begin
  RowNum := StrToInt(Edit1.Text);
  if (RowNum < 0) or (RowNum > StringGrid1.RowCount) then begin
    ShowMessage('Неверный индекс. Действие отменено.');
    Exit;
  end;
 
  InsertRow(StringGrid1, RowNum);
end;
 
//Удалить строку.
procedure TForm1.Button2Click(Sender: TObject);
var
  RowNum : Integer;
begin
  RowNum := StrToInt(Edit1.Text);
  if (RowNum < 0) or (RowNum >= StringGrid1.RowCount) then begin
    ShowMessage('Неверный индекс. Действие отменено.');
    Exit;
  end;
 
  DeleteRow(StringGrid1, RowNum);
end;
 
//Добавить столбец.
procedure TForm1.Button3Click(Sender: TObject);
var
  ColNum : Integer;
begin
  ColNum := StrToInt(Edit2.Text);
  if (ColNum < 0) or (ColNum > StringGrid1.ColCount) then begin
    ShowMessage('Неверный индекс. Действие отменено.');
    Exit;
  end;
 
  InsertColumn(StringGrid1, ColNum);
end;
 
//Удалить столбец.
procedure TForm1.Button4Click(Sender: TObject);
var
  ColNum : Integer;
begin
  ColNum := StrToInt(Edit2.Text);
  if (ColNum < 0) or (ColNum >= StringGrid1.ColCount) then begin
    ShowMessage('Неверный индекс. Действие отменено.');
    Exit;
  end;
 
  DeleteColumn(StringGrid1, ColNum);
end;
 
//Переместить строку.
procedure TForm1.Button5Click(Sender: TObject);
var
  RowNum1, RowNum2 : Integer;
begin
  RowNum1 := StrToInt(Edit3.Text);
  RowNum2 := StrToInt(Edit4.Text);
 
  if (RowNum1 < 0) or (RowNum1 >= StringGrid1.RowCount) then begin
    ShowMessage('Неверный начальный индекс строки. Действие отменено.');
    Exit;
  end;
  if (RowNum2 < 0) or (RowNum2 > StringGrid1.RowCount) then begin
    ShowMessage('Неверный конечный индекс строки. Действие отменено.');
    Exit;
  end;
 
  MoveRow(StringGrid1, RowNum1, RowNum2);
end;
 
//Переместить столбец.
procedure TForm1.Button6Click(Sender: TObject);
var
  ColNum1, ColNum2 : Integer;
begin
  ColNum1 := StrToInt(Edit3.Text);
  ColNum2 := StrToInt(Edit4.Text);
 
  if (ColNum1 < 0) or (ColNum1 >= StringGrid1.ColCount) then begin
    ShowMessage('Неверный начальный индекс столбца. Действие отменено.');
    Exit;
  end;
  if (ColNum2 < 0) or (ColNum2 > StringGrid1.ColCount) then begin
    ShowMessage('Неверный конечный индекс столбца. Действие отменено.');
    Exit;
  end;
 
  MoveColumn(StringGrid1, ColNum1, ColNum2);
end;
 
//Заполнить таблицу данными.
procedure TForm1.Button7Click(Sender: TObject);
var
  i, j : Integer;
begin
  Randomize;
  for i := StringGrid1.FixedRows to StringGrid1.RowCount - 1 do begin
    for j := StringGrid1.FixedCols to StringGrid1.ColCount - 1 do begin
      StringGrid1.Cells[j, i] := IntToStr( Random(10) ); //0..9.
    end;
  end;
end;
Миниатюры
удаление и вставка строки в StringGid в нужном месте  
Вложения
Тип файла: rar uStrGrUtils.rar (3.6 Кб, 60 просмотров)
Тип файла: rar uStrGrUtilsDemo.rar (198.2 Кб, 62 просмотров)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2010, 14:06
Помогаю со студенческими работами здесь

Разместить контент в нужном месте
Доброго времени. Есть контейнер с основным контентом: #content{margin: 5% 30% 0% 10%; float:...

Прекращение программы в нужном месте
Здравствуйте.Как обеспечить прекращение работы программы после 'Ochen horosho' и(если не будет...

Вывод текста в нужном месте
Есть приложение, которые выводит динамическую заставку 8 прямоугольников по очереди из центра с...

Вывод контента в нужном месте
При попадание на главную страницу выполняю проверку залогинен ли юзер. Если да, то через printf...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru