Консультация № 29423
12.11.2005, 16:17
0.00 руб.
0 1 1
Здравствуйте! В приложении к вопросу написан код, который встраивает combobox в ячейку компонента TStringGrid.
В моём случае его имя StringGrid1, т.е этот код актуален только для одного StringGrid1. Подскажите пожалуйста,
как распространить этот код не на один StringGrid1, а на великое множество StringGrid-ов.

Приложение:
//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "Unit1.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){// {Âûñîòó combobox‘à íå èçìåíèøü, òàê ÷òî âìåñòî combobox‘à // áóäåì èçìåíÿòü âûñîòó ñòðîêè grid‘à !} //StringGrid1.DefaultRowHeight := ComboBox1.Height; StringGrid1->DefaultRowHeight=ComboBox1->Height; // {Ñïðÿòàòü combobox} //ComboBox1->Visible = false; ComboBox1->Items->Add("Delphi Kingdom"); ComboBox1->Items->Add("Êîðîëåâñòâî Äåëüôè"); StringGrid2=StringGrid1;}//---------------------------------------------------------------------------void __fastcall TForm1::ComboBox1Change(TObject *Sender){StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row]=ComboBox1->Items->Strings[ComboBox1->ItemIndex]; ComboBox1->Visible = False; StringGrid1->SetFocus();}//---------------------------------------------------------------------------void __fastcall TForm1::ComboBox1Exit(TObject *Sender){StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row]=ComboBox1->Items->Strings[ComboBox1->ItemIndex]; ComboBox1->Visible = false; StringGrid1->SetFocus();}//---------------------------------------------------------------------------void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect){if(ACol==3 && ARow!=0){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;ComboBox1->Visible = true;ComboBox1->SetFocus(); }CanSelect=true;//StringGrid2=StringGrid1;}//---------------------------------------------------------------------------

Обсуждение

Неизвестный
12.11.2005, 17:42
общий
это ответ
Здравствуйте, Rewer8!
Нам ведь передаётся Sender!
Его и используем, записывая в Tag ComboBox‘a.
Ниже исходничек. Думаю, Вы без труда подкоректируете под свою задачу. Кстати, обработчик события onClick для Ваших StringGrid‘oв - общий StringGrid1Click.
P. S. При написании примера столкнулся с проблемкой, что если на форму сначала положить ComboBox1, а потом StringGrid‘ы, то ComboBox1 не виден на них. Так что ComboBox нужно ложить на форму послк StringGrid‘oвКстати, зачем Вам выделять ячейку StringGrida, если всёравно поверх них находится ComboBox?

Приложение:
//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "Unit1.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1; int ecol, erow;//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}//---------------------------------------------------------------------------void __fastcall TForm1::StringGrid1Click(TObject *Sender){ TRect rect; TPoint pf; pf = ((TStringGrid*)Sender)->ScreenToClient(Mouse->CursorPos); ((TStringGrid*)Sender)->MouseToCell(pf.x, pf.y, ecol, erow); rect = ((TStringGrid*)Sender)->CellRect(ecol, erow); ComboBox1->Left = ((TStringGrid*)Sender)->Left + rect.Left; ComboBox1->Top = ((TStringGrid*)Sender)->Top + rect.Top; ComboBox1->Width = rect.Right - rect.Left + 1; ComboBox1->Height = rect.Bottom - rect.Top + 1; ComboBox1->Text = ((TStringGrid*)Sender)->Cells[ecol][erow]; ComboBox1->Visible = true; ComboBox1->Tag = (int)Sender; ComboBox1->SetFocus();}//---------------------------------------------------------------------------void __fastcall TForm1::ComboBox1Exit(TObject *Sender){ ((TStringGrid*)(ComboBox1->Tag))->Cells[ecol][erow] = ComboBox1->Text; ComboBox1->Visible = false;}//---------------------------------------------------------------------------
Форма ответа