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

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

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

Автор: marwell 13.11.2012 23:50

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

Автор: IUnknown 14.11.2012 0:33

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

Автор: marwell 14.11.2012 0:34

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

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

спасибо!

Автор: marwell 14.11.2012 1: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 19:42

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

Автор: IUnknown 14.11.2012 20: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 21:07

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

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

Автор: marwell 14.11.2012 21: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 22:01

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

E.Workbooks[1].Close;

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

Автор: IUnknown 14.11.2012 23:12

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

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

Автор: marwell 15.11.2012 0:00

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

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

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

Автор: IUnknown 15.11.2012 0:21

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

Автор: marwell 15.11.2012 0:33

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

Автор: marwell 15.11.2012 1:02

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

Автор: IUnknown 15.11.2012 1:16

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

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

Автор: marwell 15.11.2012 1:35

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

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

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

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

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

Автор: IUnknown 15.11.2012 2:07

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

Автор: marwell 15.11.2012 15: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 17:55

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

Автор: marwell 15.11.2012 18:12

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

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

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

Автор: IUnknown 15.11.2012 19:02

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

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

Автор: marwell 15.11.2012 19:36

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

Автор: marwell 4.12.2012 19:47

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

Автор: marwell 5.12.2012 0: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 5:49

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

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

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

Автор: marwell 6.12.2012 15: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 16:40

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

Автор: IUnknown 6.12.2012 21: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 21: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 18:03

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

Автор: marwell 1.02.2013 16:45

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

Автор: Гость 14.03.2014 3:17

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

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

Че такое Calculate?

Автор: need to buy prednisone without a 12.11.2021 21:22

construction sp cialis s

Автор: nishaknapp 16.01.2023 6:41

Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. https://funatweb.com/what-are-mobile-casinos-everything-you-need-to-know/