доброго дня имеются две колонки в Excel. Необходимо вывести куда нибудь на форму две таблицы. Нажмите для просмотра прикрепленного файла Значение ячейки "111" в первой таблице нужно оформить в виде выпадающего списка, значения для которого берутся из первой колонки в Excel. Аналогично для "222", только значения берутся из второй колонки. Все остальные ячейки вычисляются по формулам, в зависимости от значений ячеек "111" и "222". Вопрос: какой тут компонент использовать, чтобы можно было так выводить на форму?
IUnknown
14.11.2012 0:33
Да хоть StringGrid. Что, нельзя в его ячейку затолкать ComboBox? Можно
marwell
14.11.2012 0:34
Цитата(IUnknown @ 13.11.2012 20:33)
Да хоть StringGrid. Что, нельзя в его ячейку затолкать ComboBox? Можно
спасибо!
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;
beginif ((ACol = 1) AND
(ARow <> 0)) thenbegin{Размер и расположение 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:=1to 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
хм, строки появляются, но каким то странным образом. после клика на ячейке и прокручивания мышки а нужен раскрывающийся список
IUnknown
14.11.2012 20:14
Не понял, что у тебя не так работает?
Тебе что, надо чтоб сразу после клика на ячейку вылетал этот самый выпадающий список? Добавь вот эту строку:
спасибо, сработало а можно еще вопрос: событие 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
чтож за беда такая с этой таблицей хочу вставить в соседнюю ячейку число, соответствующее выбранному в 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;
событие 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
Ну, если про этот же - то чего размазывать по разным темам? Пиши сюда
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;
beginif (ACol = 1) and (ARow <> 0) thenbegin
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:=1to iRow do
ComboBox1.Items.Add(Sheet.Cells[i,1].Text);
ComboBox2.DropDownCount:=iRow2;
for i:=1to iRow2 do
ComboBox2.Items.Add(Sheet2.Cells[i,1].Text);
end;
procedure TForm1.ComboBox1Exit(Sender: TObject);
begin{Получаем выбранный элемент из ComboBox и помещаем его в грид}if ComboBox1.ItemIndex<>-1thenbegin
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;
beginif Key=vk_delete thenbegin
StringGrid1.Rows[StringGrid1.Row].Clear;
for i:=StringGrid1.Row to StringGrid1.RowCount-1dobeginfor j:=0to StringGrid1.ColCount dobegin
StringGrid1.Cells[j,i]:=StringGrid1.Cells[j,i+1]
end;
end;
if StringGrid1.RowCount>2then StringGrid1.RowCount:=StringGrid1.RowCount-1;
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin{Получаем выбранный элемент из ComboBox и помещаем его в грид}if ComboBox1.ItemIndex<>-1thenbegin
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<>-1thenbegin
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<>-1thenbegin
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;
beginif (ACol = 1) and (ARow <> 0) thenbegin
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;
beginif Key=vk_delete thenbegin
StringGrid2.Rows[StringGrid2.Row].Clear;
for i:=StringGrid2.Row to StringGrid2.RowCount-1dobeginfor j:=0to StringGrid2.ColCount dobegin
StringGrid2.Cells[j,i]:=StringGrid2.Cells[j,i+1];
end;
end;
if StringGrid2.RowCount>2then 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 у гридов, чтобы всё заработало как нужно. Но твой код прямо образец того, как не надо делать. Я не удержался и чуть-чуть его сократил (на самом деле, от него может остаться половина того, что есть сейчас). Смотри:
Сокращённый вариант(Показать/Скрыть)
type
TForm1 = class(TForm)
// ...
private{ Private declarations }procedure MySelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
public{ Public declarations }end;
var
Form1: TForm1;
E,Sheet, E2,Sheet2:variant;
iRow, iClm, iRow2, iClm2: integer;
implementationuses ComObj;
{$R *.dfm}procedure TForm1.ComboBox1Change(Sender: TObject);
begin{Получаем выбранный элемент из ComboBox и помещаем его в грид}if ComboBox1.ItemIndex<>-1thenbegin
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.ComboBox1Exit(Sender: TObject);
begin{Получаем выбранный элемент из ComboBox и помещаем его в грид}if ComboBox1.ItemIndex<>-1thenbegin
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.ComboBox2Change(Sender: TObject);
begin{Получаем выбранный элемент из ComboBox и помещаем его в грид}if ComboBox2.ItemIndex<>-1thenbegin
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<>-1thenbegin
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.FormClose(Sender: TObject; var Action: TCloseAction);
begin
E.Workbooks[1].Close;
E:=Unassigned;
E2.Workbooks[1].Close;
E2:=Unassigned;
end;
// Вот к этому я приложил руку...
procedure TForm1.FormCreate(Sender: TObject);
procedure InitGrid(grid : TStringGrid; cbx : TComboBox;
Cols : arrayof integer; Rows : Integer; Sheet : Variant);
var i : Integer;
begin
grid.DefaultRowHeight := cbx.Height;
cbx.Visible := False;
cbx.Style := csDropDownList;
for i := 0to High(Cols) do
grid.ColWidths[i] := Cols[i];
cbx.DropDownCount := Rows;
for i := 1to Rows do
cbx.Items.Add(Sheet.Cells[i, 1].Text);
grid.Options := grid.Options + [goEditing];
grid.OnSelectCell := MySelectCell;
grid.Tag := Integer(cbx);
end;
begin
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('F:\123.xls'); // Пути заменишь на свои. Двойной бэкслеш не нужен...
E.WorkBooks.item [1].Activate;
Sheet:=E.WorkBooks.item [1].Sheets.item[1];
E2:=CreateOleObject('Excel.Application');
E2.WorkBooks.Open('F:\234.xls');
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; //последний заполненный столбец
InitGrid(StringGrid1, ComboBox1, [40, 300, 110, 110, 110],
iRow, Sheet);
InitGrid(StringGrid2, ComboBox2, [40, 300, 60, 120, 140, 140, 140],
iRow2, Sheet2);
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i,j: integer;
beginif Key=vk_delete thenbegin
StringGrid1.Rows[StringGrid1.Row].Clear;
for i:=StringGrid1.Row to StringGrid1.RowCount-1dobeginfor j:=0to StringGrid1.ColCount dobegin
StringGrid1.Cells[j,i]:=StringGrid1.Cells[j,i+1]
end;
end;
if StringGrid1.RowCount>2then StringGrid1.RowCount:=StringGrid1.RowCount-1;
end;
end;
procedure TForm1.MySelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
var
R : TRect;
Grid : TStringGrid;
beginif (ACol = 1) and (ARow <> 0) thenbegin
Grid := Sender as TStringGrid;
R := Grid.CellRect(ACol, ARow);
OffsetRect(R, Grid.Left, Grid.Top);
with TComboBox(Grid.Tag) dobegin
Left := R.Left + 1;
Top := R.Top + 1;
Width := (R.Right + 1) - R.Left;
Height := (R.Bottom + 1) - R.Top;
{ Показываем combobox }
Visible := True;
SetFocus;
DroppedDown := True; // <---
end;
end;
CanSelect := True;
end;
procedure TForm1.StringGrid2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i,j: integer;
beginif Key=vk_delete thenbegin
StringGrid2.Rows[StringGrid2.Row].Clear;
for i:=StringGrid2.Row to StringGrid2.RowCount-1dobeginfor j:=0to StringGrid2.ColCount dobegin
StringGrid2.Cells[j,i]:=StringGrid2.Cells[j,i+1];
end;
end;
if StringGrid2.RowCount>2then StringGrid2.RowCount:=StringGrid2.RowCount-1;
end;
end;
marwell
15.11.2012 19:36
спасибо! насчет кода, ты прав, там очень много чего можно упростить, укоротить, да и улучшить. К сожалению, мне такое пока не дается, код выходит громоздкий, не оптимизированный. Пытаюсь работать над этим
marwell
4.12.2012 19:47
пришлось опять поднять эту тему) у комбобоксов не работает колесо прокрутки, если количество строк довольно большое и, что интересно, DropDownCount ставлю например 20, а комбобокс все равно раскрывает список на максимум (на сколько позволяет экран вообще), и без колеса прокрутки никак не доступны элементы, "не влезшие" туда
marwell
5.12.2012 0:26
и вопрос номер 2: необходимо, чтобы при ручном изменении значения одной из двух, или же обеих ячеек, пересчиталось значение другой ячейки делаю так: при начале редактирования ячейки запоминаю координаты и старое значение, потом при получении фокуса ввода другой ячейкой пересчитываю новое значение
и, что интересно, 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 вообще не будет вызываться, поскольку обработка выбора переназначена другому событию... В общем, ты лучше тестовый проект выложи, а то ты там постоянно что-то меняешь, а потом вопросы задаешь, ничего не объясняя. Тут каждый символ важен, не то что куски кода в сотни строк...
прекрасно пересчитывает данные. Только убери этот дурацкий ShowMessage('Calculate'), он всё портит...
спасибо
Цитата
Только убери этот дурацкий ShowMessage('Calculate'), он всё портит...
я это приписал так, только чтоб увидеть заходит ли туда вообще ...
marwell
30.01.2013 18:03
доброго времени суток, форумчане вот уж никак не думал что придется продолжить эту тему... но у самого реализовать "это" не получается в общем, есть две таблицы stringgrid, для вывода данных из excel в ячейки этих grid'ов помещены combobox'ы. При щелчке по строке grid'a раскрывается список и после выбора вставляется содержимое. Мне необходимо несколько изменить этот процесс - надо чтобы на строчке grida при наведении мышки появлялась кнопка, при нажатии на которую раскрывался бы список, а если щелкать просто по строчке, то можно вручную вписывать значения. Пытаюсь использовать StringGridMouseMove, при наведении мышки кнопка действительно перемещается, но ее почему то не видно, как будто она оказывается за таблицей. Прилагаю Нажмите для просмотра прикрепленного файлаархив с исходниками, буду признателен за совет
marwell
1.02.2013 16:45
ответили на другом форуме надо было в качестве parent у speedbutton указывать не форму, а grid
Гость
14.03.2014 3:17
Цитата(marwell @ 6.12.2012 17:09)
спасибо я это приписал так, только чтоб увидеть заходит ли туда вообще ...
Че такое 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. What are Mobile Casinos? Everything You Need to Know
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.