Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Delphi _ компонент для вывода таблицы

Автор: marwell 13.11.2012 19:50

доброго дня
имеются две колонки в Excel. Необходимо вывести куда нибудь на форму две таблицы. Прикрепленное изображение Значение ячейки "111" в первой таблице нужно оформить в виде выпадающего списка, значения для которого берутся из первой колонки в Excel. Аналогично для "222", только значения берутся из второй колонки. Все остальные ячейки вычисляются по формулам, в зависимости от значений ячеек "111" и "222". Вопрос: какой тут компонент использовать, чтобы можно было так выводить на форму?

Автор: IUnknown 13.11.2012 20:33

Да хоть StringGrid. Что, нельзя в его ячейку затолкать ComboBox? http://www.sources.ru/delphi/gui/combobox_in_stringgrid_cell.shtml

Автор: marwell 13.11.2012 20:34

Цитата(IUnknown @ 13.11.2012 20:33) *

Да хоть StringGrid. Что, нельзя в его ячейку затолкать ComboBox? http://www.sources.ru/delphi/gui/combobox_in_stringgrid_cell.shtml

спасибо!

Автор: marwell 13.11.2012 21:26

хм, видимо что то делаю не так. Не добавляются строки в ComboBox



var
Form1: TForm1;
E,Sheet:variant;
iRow, iClm: integer;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var R : TRect;
begin
if ((ACol = 1) AND
(ARow <> 0)) then begin
{Размер и расположение combobox подгоняем под ячейку} {combobox должен быть в первой строке во втором столбце}
R := StringGrid1.CellRect(ACol, ARow);
R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left;
R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top;
ComboBox1.Left := R.Left + 1;
ComboBox1.Top := R.Top + 1;
ComboBox1.Width := (R.Right + 1) - R.Left;
ComboBox1.Height := (R.Bottom + 1) - R.Top;
{Показываем combobox}
ComboBox1.Visible := True;
ComboBox1.SetFocus;
end;
CanSelect := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
{Высоту у combobox не получится установить, поэтому мы будем}
{подгонять размер у грида под размер combobox!}
StringGrid1.DefaultRowHeight := ComboBox1.Height;
{Скрываем combobox}
ComboBox1.Visible := False;
StringGrid1.ColWidths[0]:=40;
StringGrid1.ColWidths[1]:=300;
StringGrid1.ColWidths[2]:=110;
StringGrid1.ColWidths[3]:=110;
StringGrid1.ColWidths[4]:=110;
E:=CreateOleObject('Excel.Application');
E.WorkBooks.Open('C:\\123.xlsx');
E.WorkBooks.item [1].Activate;
Sheet:=E.WorkBooks.item [1].Sheets.item[1];
iRow := Sheet.UsedRange.Row + Sheet.UsedRange.Rows.Count - 1; //последняя заполненая строка
iClm := Sheet.UsedRange.Column + Sheet.UsedRange.Columns.Count - 1; //последний заполненый столбец
for i:=1 to iRow do ComboBox1.Items.Add(Sheet.Cells[i,1].Text);
...
end;


procedure TForm1.ComboBox1Change(Sender: TObject);
begin
{Получаем выбранный элемент из ComboBox и помещаем его в грид}
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=
ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
{Получаем выбранный элемент из ComboBox и помещаем его в грид}
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=
ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;

end.


Автор: marwell 14.11.2012 15:42

хм, строки появляются, но каким то странным образом. после клика на ячейке и прокручивания мышки blink.gif
а нужен раскрывающийся список

Автор: IUnknown 14.11.2012 16:14

Не понял, что у тебя не так работает?

Тебе что, надо чтоб сразу после клика на ячейку вылетал этот самый выпадающий список? Добавь вот эту строку:

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
var R : trect;
begin
if (ACol = 1) and (ARow <> 0) then
begin
R := StringGrid1.CellRect(ACol, ARow);
OffsetRect(R, StringGrid1.Left, StringGrid1.Top); // Это заменяет следующие 4 строчки
(*
R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left;
R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top;
*)
ComboBox1.Left := R.Left + 1;
ComboBox1.Top := R.Top + 1;
ComboBox1.Width := (R.Right + 1) - R.Left;
ComboBox1.Height := (R.Bottom + 1) - R.Top;
{Показываем combobox}
ComboBox1.Visible := True;
ComboBox1.SetFocus;
ComboBox1.DroppedDown := true; // <---
end;
CanSelect := True;
end;

Автор: marwell 14.11.2012 17:07

спасибо, сработало
а можно еще вопрос: событие OnClick срабатывает при выборе одного из значений из списка, OnExit - при выходе из ComboBox. Зачем в обеих случаях нужен одинаковый кусок кода? Одного не достаточно?

 {Получаем выбранный элемент из ComboBox и помещаем его в грид}
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=
ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False;
StringGrid1.SetFocus;

Автор: marwell 14.11.2012 17:34

чтож за беда такая с этой таблицей sad.gif
хочу вставить в соседнюю ячейку число, соответствующее выбранному в ComboBox. Пишу так:

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
{Получаем выбранный элемент из ComboBox и помещаем его в грид}
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=
ComboBox1.Items[ComboBox1.ItemIndex];
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row+1]:=Sheet.Cells[StringGrid1.Col,2].Text;
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
{Получаем выбранный элемент из ComboBox и помещаем его в грид}
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=
ComboBox1.Items[ComboBox1.ItemIndex];
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row+1]:=Sheet.Cells[StringGrid1.Col,2].Text;
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;

вылетает с ошибкой на строчке
  StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row+1]:=Sheet.Cells[StringGrid1.Col,2].Text;

вроде все правильно же делаю...

Автор: marwell 14.11.2012 18:01

эхэх, чет совсем засиделся

E.Workbooks[1].Close;

забыл убрать оказывается

Автор: IUnknown 14.11.2012 19:12

Цитата
событие OnClick срабатывает при выборе одного из значений из списка, OnExit - при выходе из ComboBox. Зачем в обеих случаях нужен одинаковый кусок кода?
И у меня тоже вопрос: а кто вообще изначально говорил про OnClick? Там был OnChange вообще-то. OnClick - это уже твоя придумка.

Не нравится дублирование кода - вынеси этот код в отдельную процедуру и вызывай по обоим событиям.

Автор: marwell 14.11.2012 20:00

Цитата(IUnknown @ 14.11.2012 19:12) *

И у меня тоже вопрос: а кто вообще изначально говорил про OnClick? Там был OnChange вообще-то. OnClick - это уже твоя придумка.

прошу прощения, действительно мое.
P.S если еще будут вопросы про этот же StringGrid или ComboBox, можно писать в эту же тему, или надо создавать новую?

Автор: IUnknown 14.11.2012 20:21

Ну, если про этот же - то чего размазывать по разным темам? Пиши сюда smile.gif

Автор: marwell 14.11.2012 20:33

после выбора строки в ComboBox, выбранная строка вставляется в ячейку, и курсор переход на след ячейку вниз, и соответственно опять раскрывается ComboBox. Можно ли запретить такой автоматический переход? В свойствах StringGrida не нашел

Автор: marwell 14.11.2012 21:02

думал может в конце события OnExit у ComboBox запомнить stringgrid1.col и stringgrid1.row и "не дать им измениться", но это что то совсем не то

Автор: IUnknown 14.11.2012 21:16

Цитата
после выбора строки в ComboBox, выбранная строка вставляется в ячейку, и курсор переход на след ячейку вниз
Не воспроизводится. Может, ты еще что-нибудь добавлял в свойства ComboBox-а? Очень похоже, что у тебя происходит не одинарный, а двойной клик для выбора элемента.

Вообще не должно быть такого перехода, попробуй на чистом гриде, или даже на этом же, введи данные в обычную ячейку (без комбобокса), и нажми Enter - фокус останется на этой же ячейке.

Автор: marwell 14.11.2012 21:35

Цитата(IUnknown @ 14.11.2012 21:16) *

Не воспроизводится. Может, ты еще что-нибудь добавлял в свойства ComboBox-а? Очень похоже, что у тебя происходит не одинарный, а двойной клик для выбора элемента.

Вообще не должно быть такого перехода, попробуй на чистом гриде, или даже на этом же, введи данные в обычную ячейку (без комбобокса), и нажми Enter - фокус останется на этой же ячейке.

да, действительно, на чистом гриде все именно так работает. А на том гриде почему то по другому. Непонятно почему.
В комбобоксе только два события описаны: OnChange и OnExit. Срабатывает на одинарное нажатие. Других свойств вроде не добавлял

Добавлено через 6 мин.
гм, попытаюсь объяснить. После клика на ячейке раскрывается список, выбираем строку, строка вставляется в ячейку. Но, почему то как будто кнопка мыши остается нажатой и удерживаемой, как при выделении. Поэтому, при наведении курсора на другую ячейку, срабатывает событие одинарного клика и раскрывается комбобокс. Это происходит из-за комбобкса, вставленного в ячейку?

Автор: IUnknown 14.11.2012 22:07

У меня не происходит выделения другой ячейки, вот в чем проблема. Закрывается комбобокс и фокус остается на ячейке, в которую было внесено значение. А я ведь скопировал в точности твой код. Может, от версии Дельфи зависит (в более новой чего-нибудь поправили, например)? У меня XE2, могу чуть позже на 2009-ой проверить.

Автор: marwell 15.11.2012 11:50

Цитата(IUnknown @ 14.11.2012 22:07) *

У меня не происходит выделения другой ячейки, вот в чем проблема. Закрывается комбобокс и фокус остается на ячейке, в которую было внесено значение. А я ведь скопировал в точности твой код. Может, от версии Дельфи зависит (в более новой чего-нибудь поправили, например)? У меня XE2, могу чуть позже на 2009-ой проверить.

странное поведение. У меня Delphi 7. Может скинуть папку с файлами проекта?

Добавлено через 4 мин.
хотя, может и кода хватит

var
Form1: TForm1;
E,Sheet, E2,Sheet2:variant;
iRow, iClm, iRow2, iClm2: integer;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var R : TRect;
begin
if (ACol = 1) and (ARow <> 0) then
begin
R := StringGrid1.CellRect(ACol, ARow);
OffsetRect(R, StringGrid1.Left, StringGrid1.Top);
ComboBox1.Left := R.Left + 1;
ComboBox1.Top := R.Top + 1;
ComboBox1.Width := (R.Right + 1) - R.Left;
ComboBox1.Height := (R.Bottom + 1) - R.Top;
{Показываем combobox}
ComboBox1.Visible := True;
ComboBox1.SetFocus;
ComboBox1.DroppedDown := true; // <---
end;
CanSelect := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
{Высоту у combobox не получится установить, поэтому мы будем}
{подгонять размер у грида под размер combobox!}
StringGrid1.DefaultRowHeight := ComboBox1.Height;
StringGrid2.DefaultRowHeight := ComboBox2.Height;
{Скрываем combobox}
ComboBox1.Visible := False;
ComboBox1.Style := csDropDownList;
ComboBox2.Visible := False;
ComboBox2.Style := csDropDownList;
StringGrid1.ColWidths[0]:=40;
StringGrid1.ColWidths[1]:=300;
StringGrid1.ColWidths[2]:=110;
StringGrid1.ColWidths[3]:=110;
StringGrid1.ColWidths[4]:=110;
StringGrid2.ColWidths[0]:=40;
StringGrid2.ColWidths[1]:=300;
StringGrid2.ColWidths[2]:=60;
StringGrid2.ColWidths[3]:=120;
StringGrid2.ColWidths[4]:=140;
StringGrid2.ColWidths[5]:=140;
StringGrid2.ColWidths[6]:=140;
StringGrid3.ColWidths[0]:=40;
StringGrid3.ColWidths[1]:=300;
StringGrid3.ColWidths[2]:=110;
StringGrid3.ColWidths[3]:=110;
StringGrid3.ColWidths[4]:=110;
E:=CreateOleObject('Excel.Application');
E.WorkBooks.Open('C:\\1.xlsx');
E.WorkBooks.item [1].Activate;
Sheet:=E.WorkBooks.item [1].Sheets.item[1];
E2:=CreateOleObject('Excel.Application');
E2.WorkBooks.Open('C:\\2.xlsx');
E2.WorkBooks.item [1].Activate;
Sheet2:=E2.WorkBooks.item [1].Sheets.item[1];
iRow := Sheet.UsedRange.Row + Sheet.UsedRange.Rows.Count - 1; //последняя заполненая строка
iClm := Sheet.UsedRange.Column + Sheet.UsedRange.Columns.Count - 1; //последний заполненый столбец
iRow2 := Sheet2.UsedRange.Row + Sheet2.UsedRange.Rows.Count - 1; //последняя заполненая строка
iClm2 := Sheet2.UsedRange.Column + Sheet2.UsedRange.Columns.Count - 1; //последний заполненый столбец
ComboBox1.DropDownCount:=iRow;
for i:=1 to iRow do
ComboBox1.Items.Add(Sheet.Cells[i,1].Text);
ComboBox2.DropDownCount:=iRow2;
for i:=1 to iRow2 do
ComboBox2.Items.Add(Sheet2.Cells[i,1].Text);
end;


procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
{Получаем выбранный элемент из ComboBox и помещаем его в грид}
if ComboBox1.ItemIndex<>-1 then begin
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=
ComboBox1.Items[ComboBox1.ItemIndex];
StringGrid1.Cells[StringGrid1.Col+1, StringGrid1.Row]:=Sheet.Cells[ComboBox1.ItemIndex+1,2].Text;
StringGrid1.RowCount:=StringGrid1.RowCount+1;
end;
ComboBox1.Visible := False;
StringGrid1.SetFocus;
ComboBox1.ItemIndex:=-1;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
E.Workbooks[1].Close;
E:=Unassigned;
E2.Workbooks[1].Close;
E2:=Unassigned;
end;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i,j: integer;
begin
if Key=vk_delete then begin
StringGrid1.Rows[StringGrid1.Row].Clear;
for i:=StringGrid1.Row to StringGrid1.RowCount-1 do begin
for j:=0 to StringGrid1.ColCount do begin
StringGrid1.Cells[j,i]:=StringGrid1.Cells[j,i+1]
end;
end;
if StringGrid1.RowCount>2 then StringGrid1.RowCount:=StringGrid1.RowCount-1;
end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
{Получаем выбранный элемент из ComboBox и помещаем его в грид}
if ComboBox1.ItemIndex<>-1 then begin
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=
ComboBox1.Items[ComboBox1.ItemIndex];
StringGrid1.Cells[StringGrid1.Col+1, StringGrid1.Row]:=Sheet.Cells[ComboBox1.ItemIndex+1,2].Text;
end;
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;

procedure TForm1.ComboBox2Change(Sender: TObject);
begin
{Получаем выбранный элемент из ComboBox и помещаем его в грид}
if ComboBox2.ItemIndex<>-1 then begin
StringGrid2.Cells[StringGrid2.Col,
StringGrid2.Row] :=
ComboBox2.Items[ComboBox2.ItemIndex];
StringGrid2.Cells[StringGrid2.Col+2, StringGrid2.Row]:=Sheet2.Cells[ComboBox2.ItemIndex+1,2].Text;
end;
ComboBox1.Visible := False;
StringGrid1.SetFocus;
end;

procedure TForm1.ComboBox2Exit(Sender: TObject);
begin
{Получаем выбранный элемент из ComboBox и помещаем его в грид}
if ComboBox2.ItemIndex<>-1 then begin
StringGrid2.Cells[StringGrid2.Col,
StringGrid2.Row] :=
ComboBox2.Items[ComboBox2.ItemIndex];
StringGrid2.Cells[StringGrid2.Col+2, StringGrid2.Row]:=Sheet2.Cells[ComboBox2.ItemIndex+1,2].Text;
StringGrid2.RowCount:=StringGrid2.RowCount+1;
end;
ComboBox2.Visible := False;
StringGrid2.SetFocus;
ComboBox2.ItemIndex:=-1;
end;

procedure TForm1.StringGrid2SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var R : TRect;
begin
if (ACol = 1) and (ARow <> 0) then
begin
R := StringGrid2.CellRect(ACol, ARow);
OffsetRect(R, StringGrid2.Left, StringGrid2.Top);
ComboBox2.Left := R.Left + 1;
ComboBox2.Top := R.Top + 1;
ComboBox2.Width := (R.Right + 1) - R.Left;
ComboBox2.Height := (R.Bottom + 1) - R.Top;
{Показываем combobox}
ComboBox2.Visible := True;
ComboBox2.SetFocus;
ComboBox2.DroppedDown := true; // <---
end;
CanSelect := True;

end;

procedure TForm1.StringGrid2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i,j: integer;
begin
if Key=vk_delete then begin
StringGrid2.Rows[StringGrid2.Row].Clear;
for i:=StringGrid2.Row to StringGrid2.RowCount-1 do begin
for j:=0 to StringGrid2.ColCount do begin
StringGrid2.Cells[j,i]:=StringGrid2.Cells[j,i+1];
end;
end;
if StringGrid2.RowCount>2 then StringGrid2.RowCount:=StringGrid2.RowCount-1;
end;
end;

end.

Автор: IUnknown 15.11.2012 13:55

Да, с этим кодом глючит. Попробую посмотреть, что не так...

Автор: marwell 15.11.2012 14:12

Цитата(IUnknown @ 15.11.2012 13:55) *

Да, с этим кодом глючит. Попробую посмотреть, что не так...

мне кажется с событиями что то не то, только не пойму что именно

Автор: IUnknown 15.11.2012 15:02

С событиями все нормально. Просто достаточно было включить опцию goEditing у гридов, чтобы всё заработало как нужно. Но твой код прямо образец того, как не надо делать. Я не удержался и чуть-чуть его сократил (на самом деле, от него может остаться половина того, что есть сейчас). Смотри:

Сокращённый вариант (Показать/Скрыть)

Автор: marwell 15.11.2012 15:36

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

Автор: marwell 4.12.2012 15:47

пришлось опять поднять эту тему)
у комбобоксов не работает колесо прокрутки, если количество строк довольно большое
и, что интересно, DropDownCount ставлю например 20, а комбобокс все равно раскрывает список на максимум (на сколько позволяет экран вообще), и без колеса прокрутки никак не доступны элементы, "не влезшие" туда blink.gif

Автор: marwell 4.12.2012 20:26

и вопрос номер 2:
необходимо, чтобы при ручном изменении значения одной из двух, или же обеих ячеек, пересчиталось значение другой ячейки
делаю так: при начале редактирования ячейки запоминаю координаты и старое значение, потом при получении фокуса ввода другой ячейкой пересчитываю новое значение

procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol,
ARow: Integer; var Value: String);
begin
EditCol:=ACol;
EditRow:=ARow;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var price, procent: real;
begin
if StringGrid1.Cells[EditCol, EditRow]<>'' then begin
price:=StrToFloat(StringGrid1.Cells[1, EditRow]);
procent:=StrToFloat(StringGrid1.Cells[2, EditRow]);
StringGrid1.Cells[3,EditRow]:=FloatToStr(price+price*procent/100);
end;
end;


procedure TForm1.StringGrid1Exit(Sender: TObject);
var price, procent: real;
begin
if StringGrid1.Cells[EditCol, EditRow]<>'' then begin
price:=StrToFloat(StringGrid1.Cells[1, EditRow]);
procent:=StrToFloat(StringGrid1.Cells[2, EditRow]);
StringGrid1.Cells[3,EditRow]:=FloatToStr(price+price*procent/100);
end;
end;

но что то делаю неправильно...

Автор: IUnknown 6.12.2012 1:49

Цитата
и, что интересно, DropDownCount ставлю например 20, а комбобокс все равно раскрывает список на максимум
А где ты, интересно, ставишь DropDownCount? Неужели через свойства Object Inspector-а? Оно ж у тебя выставляется в коде, 74 и 77 строкой (в коде из поста №18), а у меня в 21-ом посте - строкой №101. Если заменяю у себя 101 строку на

cbx.DropDownCount := 10; // Rows;
, то показывает ровно 10 строк с прокруткой...

Цитата
но что то делаю неправильно...
Угу. А ничего, что у тебя на OnSelectCell навешено другое событие, которое показывает комбобокс в ячейке? Ты его куда дел? А в моем коде StringGrid1SelectCell вообще не будет вызываться, поскольку обработка выбора переназначена другому событию... В общем, ты лучше тестовый проект выложи, а то ты там постоянно что-то меняешь, а потом вопросы задаешь, ничего не объясняя. Тут каждый символ важен, не то что куски кода в сотни строк...

Автор: marwell 6.12.2012 11:28

Цитата(IUnknown @ 6.12.2012 1:49) *

А где ты, интересно, ставишь DropDownCount? Неужели через свойства Object Inspector-а? Оно ж у тебя выставляется в коде, 74 и 77 строкой (в коде из поста №18), а у меня в 21-ом посте - строкой №101. Если заменяю у себя 101 строку на

cbx.DropDownCount := 10; // Rows;
, то показывает ровно 10 строк с прокруткой...

Угу. А ничего, что у тебя на OnSelectCell навешено другое событие, которое показывает комбобокс в ячейке? Ты его куда дел? А в моем коде StringGrid1SelectCell вообще не будет вызываться, поскольку обработка выбора переназначена другому событию... В общем, ты лучше тестовый проект выложи, а то ты там постоянно что-то меняешь, а потом вопросы задаешь, ничего не объясняя. Тут каждый символ важен, не то что куски кода в сотни строк...

даже не знаю, как я мог упустить этот момент sad.gif

Автор: marwell 6.12.2012 12:40

попробовал сделать так, как предложил Serge_Bliznykov вот http://programmersforum.ru/showthread.php?p=1144476#post1144476 , но ничего не вышло
архив прикрепляюПрикрепленный файл  test.rar ( 222.47 килобайт ) Кол-во скачиваний: 819

Автор: IUnknown 6.12.2012 17:01

К сожалению, тот форум сбоит, но он тебе советовал не OnGetEditText, а OnSetEditText, насколько я успел увидеть...

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
begin
Calculate(ACol, ARow);
end;
прекрасно пересчитывает данные. Только убери этот дурацкий ShowMessage('Calculate'), он всё портит...

Автор: marwell 6.12.2012 17:09

Цитата(IUnknown @ 6.12.2012 17:01) *

К сожалению, тот форум сбоит, но он тебе советовал не OnGetEditText, а OnSetEditText, насколько я успел увидеть...

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
begin
Calculate(ACol, ARow);
end;
прекрасно пересчитывает данные. Только убери этот дурацкий ShowMessage('Calculate'), он всё портит...

спасибо smile.gif
Цитата
Только убери этот дурацкий ShowMessage('Calculate'), он всё портит...
я это приписал так, только чтоб увидеть заходит ли туда вообще ...

Автор: marwell 30.01.2013 14:03

доброго времени суток, форумчане
вот уж никак не думал что придется продолжить эту тему...
но у самого реализовать "это" не получается sad.gif
в общем, есть две таблицы stringgrid, для вывода данных из excel в ячейки этих grid'ов помещены combobox'ы. При щелчке по строке grid'a раскрывается список и после выбора вставляется содержимое. Мне необходимо несколько изменить этот процесс - надо чтобы на строчке grida при наведении мышки появлялась кнопка, при нажатии на которую раскрывался бы список, а если щелкать просто по строчке, то можно вручную вписывать значения. Пытаюсь использовать StringGridMouseMove, при наведении мышки кнопка действительно перемещается, но ее почему то не видно, как будто она оказывается за таблицей. Прилагаю Прикрепленный файл  123.rar ( 248.3 килобайт ) Кол-во скачиваний: 805
архив с исходниками, буду признателен за совет

Автор: marwell 1.02.2013 12:45

ответили на другом форуме
надо было в качестве parent у speedbutton указывать не форму, а grid

Автор: Гость 13.03.2014 23:17

Цитата(marwell @ 6.12.2012 17:09) *

спасибо smile.gif
я это приписал так, только чтоб увидеть заходит ли туда вообще ...

Че такое Calculate?