Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Jil
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 80
1

Из StringGrid в Массив (Arr[i,j])

07.05.2013, 23:06. Просмотров 804. Ответов 7
Метки нет (Все метки)

Привет Всем.

Снова прошу помощи, направления. Пишу лабораторную. Возникла очередная проблема. Дело в том что я использую оператор выбора CASE, а также повторяются переменные (путаница получилась), после всех возможных комбинаций выбора сделал ради теста два условия "поиск максимального и минимального значения в массиве".

В итоге:
- при выборе 1 варианта заполнения массива (рандомно) условия поиска макс и мин чисел выполняется;

- 2-й вариант заполнения массива из редактирования StringGrid пользователем - не совсем пока что понятно;

- 3-й вариант заполнения массива из файла XLS - получается, но теперь то что из XLS отобразилось в StringGrid надо переместить в массив с теми же переменными - вот в этом и путаница... следовательно условия не выполняются по поиску чисел мин и макс;

Кто может помогите, подскажите. Буду очень благодарен. Ниже привожу полный код:


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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
procedure TForm1.Button1Click(Sender: TObject);
var
  n,m,i,j: Integer;
  Arr:array of array of Integer;
  c,c1:Char;
  b:Boolean;
  ExApp, ExBook, ExSheet: Variant;
  S, R, Col, Col1, Col2, Row, Row1, Row2: Integer;
  FileName : String;
  Sg : TStringGrid;
  K: array[1..10, 1..10] of integer;
  min,max,minj,minI,maxI,maxj:Integer;
  x,v:Integer;
 
 
Begin
 
// Ввод количества строк и столбцов в новом массиве;
n:=SpinEdit1.Value; // Количество строк массива;
m:=SpinEdit2.Value; // Количество столбцов массива;
 
// Проверка на корректность ввода значений размерности массива;
if (n=0) and (m=0)then ShowMessage('Массив не может состоять из 0 строк и 0 столбцов')else
if (n<1) then ShowMessage('Массив не может состоять менее чем из 1 строки') else
if (m<1) then ShowMessage('Массив не может состоять менее чем из 1 столбца');
 
 
//Для проверки.
//RadioGroup1.ItemIndex:=0;
//showmessage(inttostr(RadioGroup1.ItemIndex));
 
Case RadioGroup1.ItemIndex of
 
0: Begin
 
// Заполнение массива отрицательными и положительными числами,активируя функцию Random;
// В случае Активирования RadioButton1 (Случайный ввод);
SetLength(Arr,n,m);//Определение размерности Arr=Array[0..n-1,0..m-1];
    for i:=0 to n-1 do
    for j:=0 to m-1 do
    Arr[i,j]:=Random(1000000)-300000;
 
// Создание "Таблицы значений" из данных массива;
StringGrid1.RowCount:=n+1; // +1 Пропуск фиксированных ячеек строк;
StringGrid1.ColCount:=m+1; // +1 Пропуск фиксированных ячеек столбцов;
 
//Заполнение фиксированной строки;
c:='A'; c1:='A'; b:=False;
  For i:=1 To StringGrid1.ColCount-1 Do
  Begin
    StringGrid1.cells[i,0]:=c;
    If b Then
    Begin
       StringGrid1.cells[i,0]:=c+c1;
       c1:=Succ(c1);
       If c1>'Z' Then
       Begin
          c1:='A';
          c:=Succ(c);
       End;
    End Else
    Begin
      c:=Succ(c);
      If c>'Z' Then
      Begin
         b:=True;
         c:='A';
      End;
    End;
  End;
 
//Заполнение фиксированного столбца;
For i:=1 To StringGrid1.RowCount-1 Do
StringGrid1.cells[0,i]:=IntToStr(i);
 
for i:=1 to n do   //Цикл по строкам;
for j:=1 to m do   //Цикл по столбцам;
StringGrid1.Cells[j,i]:=IntToStr(Arr[i-1,j-1]);
End;
 
//Ручной ввод данных в массив с помощью StringGrid;
{1: Begin
 
End; }
 
 
//Чтение данных массива из файла *.xls;
2: Begin
 if OpenTextFileDialog1.InitialDir='' then
    OpenTextFileDialog1.InitialDir:= ExtractFilePath(Application.ExeName);
  if not OpenTextFileDialog1.Execute then Exit;
  FileName:=OpenTextFileDialog1.FileName;
  if not FileExists(FileName) then begin
    ShowMessage('Внимание! Файл с указанным именем не существует. Действие отменено.');
    Exit;
  end;
 
  try
    //Запуск Excel и подключение к корневому объекту.
    ExApp:=CreateOleObject('Excel.Application');
    //Если требуется, делаем окно Excel видимым.
    //ExApp.Visible:= True;
    //Открываем рабочую книгу и получаем на неё ссылку.
    ExBook:=ExApp.WorkBooks.Open(FileName:=FileName);
    //Получаем ссылку на первый рабочий лист в рабочей книге.
    ExSheet:=ExBook.WorkSheets[1];
 
    //Определяем границы таблицы на листе Excel.
    Row1:= 1;
    Col1:= 1;
    Row2:= ExSheet.UsedRange.Row + ExSheet.UsedRange.Rows.Count - 1;
    Col2:= ExSheet.UsedRange.Column + ExSheet.UsedRange.Columns.Count - 1;
 
////////////////////////////////////////////////////////////////////////////////
//Заполнение фиксированной строки;
c:='A'; c1:='A'; b:=False;
  For i:=1 To StringGrid1.ColCount-1 Do
  Begin
    StringGrid1.cells[i,0]:=c;
    If b Then
    Begin
       StringGrid1.cells[i,0]:=c+c1;
       c1:=Succ(c1);
       If c1>'Z' Then
       Begin
          c1:='A';
          c:=Succ(c);
       End;
    End Else
    Begin
      c:=Succ(c);
      If c>'Z' Then
      Begin
         b:=True;
         c:='A';
      End;
    End;
  End;
 
//Заполнение фиксированного столбца;
For i:=1 To StringGrid1.RowCount-1 Do
StringGrid1.cells[0,i]:=IntToStr(i);
////////////////////////////////////////////////////////////////////////////////
 
    //Задаём размер таблицы StringGrid1 в соответствие с размером таблицы на листе Excel.
    //Предусматриваем случай, если на листе нет данных.
    {if (Row2 - Row1 + 1) <= StringGrid1.FixedRows then
      StringGrid1.RowCount:= StringGrid1.FixedRows + 1
    else
      StringGrid1.RowCount:= Row2 - Row1 + 1;
    if (Col2 - Col1 + 1) <= 0 then
      StringGrid1.ColCount:= 1
    else
      StringGrid1.ColCount:= Col2 - Col1 + 1; }
    //Читаем данные с листа Excel.
      R:=0;
    for Row:=Row1 to Row2 do begin
      S:=0;
    for Col:= Col1 to Col2 do begin
//Читаем данные очередной ячейки на листе Excel и записываем их в ячейку в StringGrid1.
      StringGrid1.Cells[S+1, R+1]:=ExSheet.Cells[Row, Col];
        //Переход к следующему столбцу StringGrid1.
        Inc(S);
      end;
      //Переход к следующей строке StringGrid1.
      Inc(R);
    end;
    //Если требуется, закрываем рабочую книгу.
    //Book.Close;
    //Если требуется, выходим из Excel.
    //ExApp.Quit;
  finally
    //Отключаемся от объектов OLE-автоматизации.
    ExApp:= Unassigned;
    ExBook:= Unassigned;
    ExSheet:= Unassigned;
 
 End;
////////////////////////////////////////////////////////////////////////////////
{begin
  x:=StringGrid1.RowCount;
  v:=StringGrid1.ColCount;
  for i:= 0 to x-1 do
  for j:= 0 to v-1 do
  Arr[i,j]:=StrToFloat(StringGrid1.Cells[x,v]);    }
 
 
////////////////////////////////////////////////////////////////////////////////
 
End;
End;
End;
 
// Поиск минимального значения в массиве;
If CheckBox1.Checked Then
Begin
minI:=0; minJ:=0; min:=Arr[0,0];
for i:=1 to n-1 do
for j:=1 to m-1 do
If Arr[i,j]<Arr[minI,minJ] Then
Begin
min:=Arr[i,j];
minI:=i; minJ:=j;
end;
// Вывод сообщения "Минимальный элемент" в массиве 'Arr' с двигом индексов ячейки массива на +1;
Label4.Caption:='Минимальный элемент: '+IntToStr(min)+'.'+#10+'Index: '+IntToStr(minI+1)+'x'+IntToStr(minJ+1);
  end else Label4.Caption:='';
 
 
// Поиск максимального значения в массиве;
If CheckBox2.Checked Then
Begin
maxI:=0; maxJ:=0; max:=Arr[0,0];
for i:=1 to n-1 do
for j:=1 to m-1 do
If Arr[i,j]>Arr[maxI,maxJ] Then
Begin
max:=Arr[i,j];
maxI:=i; maxJ:=j;
End;
// Вывод сообщения "Максимальный элемент" в массиве 'Arr' с двигом индексов ячейки массива на +1;
Label5.Caption:='Максимальный элемент: '+IntToStr(max)+'.'+#10+'Index: '+IntToStr(maxI+1)+'x'+IntToStr(maxJ+1);
   End Else Label5.Caption:='';
    end;
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 23:06
Ответы с готовыми решениями:

Из StringGrid в Массив (Arr[i,j])
Имеется часть кода: //Ручной ввод данных в массив с помощью StringGrid; 1: Begin For i:=1...

Delphi 7 Stringgrid Нужно сделать цикл для заполнения Stringgrid данными из другого Stringgrid
Нужно чтобы из Stringgrid1 данные переносились в Stringgrid2 Но ТОЛЬКО ПО УСЛОВИЮ Таблицы...

Проблемы с методом массива (Array.prototype.p=1 var arr=new Array(); arr.watch('p',alertme) arr.p=2)
Опять я с подобной проблемой. &lt;script language='JavaScript1.2'&gt; function...

Синонимы операций взятия адреса массива (arr и &arr)
возможно коряво написал заголовок, да и сам вопрос банальный. после создании лок. массива его адрес...

Почему *arr И arr[] одинаковые, но в тоже время разные?
Например есть какая-то ф-я:void temp(int &amp;(*arr)) { // . . . } И 2 разных массива которые...

7
Санек25
421 / 351 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
08.05.2013, 12:28 2
По поводу 2 варианта. В свойствах StringGrid разрешаешь его редактирование с клавиатуры и заносишь данные на методе OnChange делаешь проверку во всей ли таблице введены данные? если да то сливаешь все в массив.

По 3 методу не совсем понятно что не получается...
0
Jil
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 80
08.05.2013, 14:49  [ТС] 3
Санек25, По второму методу сделал процедуру RadioGroup по клику с ItemIndex1... Т.е. теперь оно позваляет редактировать StringGrid. Но тут два варианта: 1-й StringGrid уже заполнен например кто-то уже воспользовался 1-м (рандомно) или 3-м (чтение из XLS) способом...считается что массив уже создан и находится в памяти...и в него надо просто внести изменения (если ячейки StringGrid подверглись изменению когда пользователь перешел на 2 способ ввода массива)....

Например, рандомно создался массив 6х9 а пользователь только изменил 5х3 - оставшиеся ячейки пусты их считать нельзя....

Путаница... лучшим способом считаю (но не знаю как реализовать) это через процедуру RadioGroup сделать через IF если выбран 2-ручной ввод массива, то для начала очистить StringGrid и настойчиво предложить пользователю ввести размерность нового массива. Тогда отпадают предыдущие варианты.

За ранее благодарен.
0
Санек25
421 / 351 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
08.05.2013, 15:09 4
1. можно при выборе 2 способа очистить гирд очистить массив и задать новую размерность массива.
2. можно сделать сравнение если n элемент массива равен значению в гирде то не записывать в массив если не равен то идет запись...
0
08.05.2013, 15:09
Jil
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 80
08.05.2013, 15:22  [ТС] 5
Санек25, В том то и проблема что логически понятна цепочка действий, а практически как ее реализовать не совсем. Особенно когда пишешь не с нуля а пытаешься вставить данный код в уже существующую структуру.... Проблема с повторениями переменных + возможны конфликты методов (не закрыты операторы или еще что-то)...Да к тому еще что многих приемов в Delphi я еще не знаю.....у нас что-то типа курсов...не сдашь программирование не получишь корочки...)
0
Санек25
421 / 351 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
08.05.2013, 15:26 6
там той программы кот наплакал. легче с нуля написать. Да я и сам самоучка
0
Jil
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 80
08.05.2013, 15:35  [ТС] 7
Я и пишу с нуля (что-то здесь спрошу, что-то в гугле найду)...я знаю что программный код написан не правильно (усложнен) но кое как он работает. Боюсь вообще сломать. Вчера нашел как очистить StringGrid по нажатию на кнопку....так я там и двух строчек не понял...Неужели нет функции которая проста меняет параметр в настройках объекта. (типа, StrinGrid1.Visible:=True)?

Добавлено через 5 минут
нашел что-то:

Delphi
1
2
3
4
5
begin
with StringGrid1 do
  for i:=0 to ColCount-1 do
    Cols[i].Clear;
end;
0
Санек25
421 / 351 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
08.05.2013, 15:42 8
StrinGrid1.Visible:=True -это отображать компанет или нет. в этом значении он будет виден.
смотри clear. как-то так StringGrid1.clear

Добавлено через 2 минуты
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
begin
with StringGrid1 do
  for i:=0 to ColCount-1 do
    Cols[i].Clear;
end;
 
 
begin
with StringGrid1 do
  for i:=0 to RowCount-1 do
    Rows[i].Clear;
end;
вот код

Добавлено через 1 минуту
1 чистит с по столбцам
2 чистит по строкам
1
08.05.2013, 15:42
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2013, 15:42

Массив: Подскажите, пожалуйста, как передать массив А в процедуру Arr?
Добрый день! Подскажите, пожалуйста, как передать массив А в процедуру Arr? using System;...

чем отличается *(arr+1) от *(arr++)?
подскажите пожалуйста в чем отличие между *(arr+1) и *(arr++), допустим char arr=&quot;qwertyuiop&quot;;...

Массив $arr, бот телеграм
Привет, ребята! понадобилась ваша помощь(( есть бот продажи одежды в телеграм, писался на заказ,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru