Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 7
1

Как передать значения grid.cells в описание кнопки?

09.04.2016, 17:24. Показов 1512. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как передать значение grid.cells (данные получил с екселя) и передать данные grid.cells в процедуру нажатия кнопки?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2016, 17:24
Ответы с готовыми решениями:

CBuilder 6. Как передать StringGrid->Cells в функцию?
Здравствуйте. Пусть у меня есть какая-то форма и в ней таблица StringGrind1 Мне нужно...

Как достать и передать в другой метод значения нескольких текстовых полей по нажатию кнопки?
Привет всем! Владеющие языком, прошу принять новичка в свои ряды, ну и... помочь чуток. Не могу...

Grid Click. Подключить данные, которые находятся в cells в выбраном ряду?
U menja est grid, sobitie click. gr_Click(ByVal sender As Object, ByVal e As System.EventArgs) ...

NoWrap для ASP.NET - e.Row.Cells[grid.SortColumn].Wrap = false;
В заголовке GridView стоит название таблицы и добавленная картинка, которая показывает направление...

7
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
09.04.2016, 18:59 2
В событие нажатия на кнопку, например procedure TForm1.Button1Click(Sender: TObject); уже переданы значения Grid.Cells[i,j], где i для редактируемых ячеек изменяется от числа фиксированных столбцов Grid.FixedCols до (Grid.ColCount-1), а j для редактируемых ячеек изменяется от числа фиксированных строк Grid.FixedRows до (Grid.RowCount-1). Первый столбец и строка имеют номер 0.
Я видел Вашу тему Работа в ексель с делфи. Допустим у Вас в пятом столбце Grid вещественные числа и количество фиксированных строк равно 0, тогда найти количество повторяющихся элементов массива, вывести элементы и количество в столбцы шестой и седьмой можно так:
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
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k,l,n,c:integer;
a:array of extended;
b:array of record
e:extended;
c:integer;
end;
begin
l:=grid.RowCount;
setlength(a,l);
for i:=0 to l-1 do
begin
try
a[i]:=strtofloat(grid.Cells[4,i]);
except
showmessage('Значение в строке '+inttostr(i+1)+' должно быть числом!');
exit;
end;
end;
setlength(b,0);
i:=0;
while i<length(a) do
begin
c:=1;
j:=i+1;
l:=0;
while j<length(a) do
begin
if a[j]=a[i] then
begin
c:=c+1;
if c=2 then
begin
l:=length(b);
setlength(b,l+1);
b[l].e:=a[i];
end;
n:=length(a)-1;
for k:=j+1 to n do
a[k-1]:=a[k];
setlength(a,n);
end
else
j:=j+1;
end;
if c>1 then
b[l].c:=c;
i:=i+1;
end;
with grid do
begin
if colcount<7 then
colcount:=7;
cols[5].Clear;
cols[6].Clear;
for i:=0 to length(b)-1 do
begin
cells[5,i]:=floattostr(b[i].e);
cells[6,i]:=floattostr(b[i].c);
end;
end;
end;
Можете заменить этим кодом свой в procedure TForm1.Button1Click(Sender: TObject);.
0
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 7
09.04.2016, 19:25  [ТС] 3
Спасибо большое за ответ, но у меня всеравно выдает ошибку при нажатии кнопки((
Миниатюры
Как передать значения grid.cells в описание кнопки?  
0
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
09.04.2016, 19:46 4
На картинке не виден мой код в procedure TForm1.Button1Click(Sender: TObject);. Замените моим кодом procedure TForm1.Button1Click(Sender: TObject);.
При такой ошибке закройте Delphi. Через несколько секунд запустите Delphi опять, откройте проект и запустите заново.
0
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 7
09.04.2016, 20:05  [ТС] 5
Все сделал как вы сказали, но всеравно ошибка
Миниатюры
Как передать значения grid.cells в описание кнопки?  
0
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 7
09.04.2016, 20:28  [ТС] 6
Вот весь код с поправкой на ваш, у меня мозг взрывается уже не понимаю в чем дело


unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.Menus,ComObj;

type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
MainMenu1: TMainMenu;
N1: TMenuItem;
N3: TMenuItem;
N2: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
SaveDialog1: TSaveDialog;
StringGrid1: TStringGrid;
Button1: TButton;
procedure N3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Grid:TStringGrid;
implementation

{$R *.dfm}

procedure Xls_Open(XLSFile:string; Grid:TStringGrid);
const
xlCellTypeLastCell = $0000000B;
var
ExlApp : OLEVariant;
Sheet : OLEVariant;
i, j,c,r: integer;

begin
//создаем объект Excel
ExlApp := CreateOleObject('Excel.Application');

//делаем окно Excel невидимым
ExlApp.Visible := false;

//открываем файл XLSFile
ExlApp.Workbooks.Open(XLSFile);

//создаем объект Sheet(страница) и указываем номер листа (1)
//в книге, с которого будем осуществлять чтение
Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

//активируем последнюю ячейку на листе
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

// Возвращает номер последней строки
r := ExlApp.ActiveCell.Row;

// Возвращает номер последнего столбца
c := ExlApp.ActiveCell.Column;

//устанавливаем кол-во столбцов и строк в StringGrid
Grid.RowCount:=r;
Grid.ColCount:=c;

//считываем значение из каждой ячейки и копируем в нашу таблицу
for j:= 1 to r do
for i:= 1 to c do

Grid.Cells[i-1,j-1]:= sheet.cells[j,i].text ;

//закрываем приложение Excel
ExlApp.Quit;
ExlApp := Unassigned;
Sheet := Unassigned;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k,l,n,c:integer;
a:array of extended;
b:array of record
e:extended;
c:integer;
end;
begin
l:=grid.RowCount;
setlength(a,l);
for i:=1 to l-1 do
begin
try
a[i]:=strtofloat(grid.Cells[3,i]);
except
showmessage('Значение в строке '+inttostr(i+1)+' должно быть числом!');
exit;
end;
end;
setlength(b,0);
i:=0;
while i<length(a) do
begin
c:=1;
j:=i+1;
l:=0;
while j<length(a) do
begin
if a[j]=a[i] then
begin
c:=c+1;
if c=2 then
begin
l:=length(b);
setlength(b,l+1);
b[l].e:=a[i];
end;
n:=length(a)-1;
for k:=j+1 to n do
a[k-1]:=a[k];
setlength(a,n);
end
else
j:=j+1;
end;
if c>1 then
b[l].c:=c;
i:=i+1;
end;
with grid do
begin
if colcount<7 then
colcount:=7;
cols[5].Clear;
cols[6].Clear;
for i:=0 to length(b)-1 do
begin
cells[5,i]:=floattostr(b[i].e);
cells[6,i]:=floattostr(b[i].c);
end;
end;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
If OpenDialog1.Execute then Xls_Open (OpenDialog1.FileName, StringGrid1);
end;



end.
0
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
09.04.2016, 21:00 7
В Вашей программе данные загружаются не в Grid, а в StringGrid1. Потом Вы не правильно заменили мой код "for i:=0 to l-1 do" на "for i:=1 to l-1 do". Также у меня "a[i]:=strtofloat(grid.Cells[4,i]);", а у Вас "a[i]:=strtofloat(grid.Cells[3,i]);". Но в этом месте пишите как хотите, столбцы нумеруются начиная с 0.
Замените Ваш procedure TForm1.Button1Click(Sender: TObject); на этот код:
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
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k,l,n,c:integer;
a:array of extended;
b:array of record
e:extended;
c:integer;
end;
begin
l:=StringGrid1.RowCount;
setlength(a,l);
for i:=0 to l-1 do
begin
try
a[i]:=strtofloat(StringGrid1.Cells[4,i]);
except
showmessage('Значение в строке '+inttostr(i+1)+' должно быть числом!');
exit;
end;
end;
setlength(b,0);
i:=0;
while i<length(a) do
begin
c:=1;
j:=i+1;
l:=0;
while j<length(a) do
begin
if a[j]=a[i] then
begin
c:=c+1;
if c=2 then
begin
l:=length(b);
setlength(b,l+1);
b[l].e:=a[i];
end;
n:=length(a)-1;
for k:=j+1 to n do
a[k-1]:=a[k];
setlength(a,n);
end
else
j:=j+1;
end;
if c>1 then
b[l].c:=c;
i:=i+1;
end;
with StringGrid1 do
begin
j:=colcount;
colcount:=j+2;
cols[j].Clear;
cols[j+1].Clear;
for i:=0 to length(b)-1 do
begin
cells[j,i]:=floattostr(b[i].e);
cells[j+1,i]:=floattostr(b[i].c);
end;
end;
end;
Тогда после загрузки из меню таблицы Excel и нажатия на кнопку, справа в таблице появятся два новых столбца, где будут повторяющиеся элементы и их количество.
Прикрепляю архив к этому сообщению с проектом с работой этой кнопки.
Если у Вас не получится заменить свой код моим, то прикрепите к Вашему сообщению архив с Вашим проектом и таблицей Excel, чтобы я его сам отредактировал.
Вложения
Тип файла: zip Grid3.zip (237.1 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 7
09.04.2016, 21:33  [ТС] 8
Спасибо большое, действительно все записывалось в StringGrid1, все заработало)))
0
09.04.2016, 21:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2016, 21:33
Помогаю со студенческими работами здесь

AngularJs и KendoUI Grid, Как передать параметр и обновить таблицу?
Привет, коллеги Начинаю изучать AngularJS , заодно осваиваю KendoUI, поэтому вопрос будет не...

With Worksheets('Лист1') TestVvod Obl:=.Range(.Cells(x,y),.Cells(x+5,y+10)) end with
Пожалуйста, ну откликнитесь умельцы!!! Обращаюсь к процедуре TestVvod Obl:='C5:K32' - срабатывает,...

Как случайно изменить расположение кнопки в зависимости от размеров Grid
Всем привет. Можете подсказать, как случайно изменить расположение кнопки в зависимости от...

ThisWorkbook.Worksheets('Table').Range(Cells(i, 9), Cells(i, 12)).Select Selection.Delete Shift:=xlUp Ошибка 1004
Помню я с этим уже сталкивался, но забыл как выкрутился....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru