Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.18;
Скачать: [xml.tar.bz2];




Вниз

StringGrid + ComboBox 


Елена   (2002-02-02 09:45) [0]

Как объединить StringGrid и ComboBox?
Заранее благодарна.



MBo   (2002-02-02 10:37) [1]

на основе из какого-то Faq
procedure TForm1.FormCreate(Sender: TObject);
begin
Combo.Visible := False;
Combo.Items.add("Вася");
Combo.Items.add("Петя");
Combo.Items.add("Саша");
StringGrid1.DefaultRowHeight := Combo.Height;
StringGrid1.Col:=0;
end;
procedure TForm1.ComboChange(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:=Combo.Items[Combo.ItemIndex];
Combo.Visible := False;
StringGrid1.SetFocus;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ACol = 1 then begin
Combo.Width := StringGrid1.ColWidths[1] ;
Combo.Left := StringGrid1.Left + StringGrid1.CellRect(1,ARow).Left + 1;
Combo.Top := StringGrid1.Top + StringGrid1.CellRect(1,ARow).Top + 1;
Combo.Tag := ARow;
Combo.Visible := true;
Combo.SetFocus;
end;
CanSelect := True;
end;



Елена   (2002-02-03 12:30) [2]

Спасибо, но это немного не то.
Мне хотелось бы, чтобы в раскрывающемся списке были видна строки ячеек.
Заранее благодарна.



Елена   (2002-02-03 12:34) [3]

Были виднЫ, конечно.



Набережных С.   (2002-02-03 13:19) [4]

А это как? Нельзя-ли "на пальцах" объяснить?



Елена   (2002-02-03 13:50) [5]

То есть внешне он был бы похож на ComboBox, а когда мы раскрываем его, то видим StringGrid из которого выбираем одну строчку.



Елена   (2002-02-03 13:53) [6]

Получается, что не ComboBox в StringGrid"е, а StringGrid в ComboBox"е.



MBo   (2002-02-03 15:36) [7]

>из которого выбираем одну строчку.
строчку, не ячейку?
многоколоночный Combo?
так готовь Items в виде
String1 QQQQ wwwww
String2 WWWW eeeee



Набережных С.   (2002-02-03 16:23) [8]

Или вручную подвешивать к Combo еще один StringGrid.



Елена   (2002-02-04 11:11) [9]

А как это???



Елена   (2002-02-04 13:22) [10]

MBo, Вы не можете не знать как это сделать!



reonid   (2002-02-04 13:34) [11]

Я когда-то делал нечто подобное.
Правда, результат выглядел чуть иначе, чем комбо-бокс.
(кнопка была вне эдита).
Если очень надо, могу найти.



MBo   (2002-02-04 13:44) [12]

>не можете не знать
Весьма польщен :)

вариант с шириной комбо устроил?

Если все же необходимо, чтобы появлялся StringGrid (что не очевидно - как я понял, нет нужды выбирать одну из ячеек на строке), то проще всего вместо комбо кнопкой делать Stringgrid1.visible:=true;



Елена   (2002-02-04 13:46) [13]

Надо, очень надо!



MBo   (2002-02-04 14:03) [14]

например, так
procedure TForm1.Button1Click(Sender: TObject);
begin
stringgrid1.visible:=true;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
edit1.text:=stringgrid1.cells[acol,arow];
stringgrid1.visible:=false;
end;



reonid   (2002-02-04 14:32) [15]

нашёл, могу кинуть на мэйл исходник.
(он не такой ужиаленький)



BlankAlex   (2002-02-04 14:47) [16]

Я сделал так:
На основную форму бросил компонент, который выгляди как Combobox (у меня TDBEditEh из библиотеки DBgidEh),
по нажатию кнопки вызываю окно, в которое запихнул DBGrid, т.к. мне надо вытаскивать значения из БД. У тебя окно может содержать ListBox


Function SelectValueFromList(HostControl: TControl):Boolean ;
Begin
fm:=Tfm.Create(Application) ;
With fm Do
Try
AdjustDropDownForm(fm,HostControl);

Visible := True;
ModalResult := mrCancel;
While (Visible) Do Application.ProcessMessages;
If ModalResult = mrOk Then Result:=True ;
Finally
Release ;
End;
End ;

{Расчет координат выпадения окна
AdjustDropDownForm( <форма, которая имитирует открывающийся список> ,< компонент >);}
procedure AdjustDropDownForm(AControl : TControl; HostControl: TControl);
var
WorkArea: TRect;
HostP, PDelpta: TPoint;
begin
SystemParametersInfo(SPI_GETWORKAREA,0,@WorkArea,0);
HostP := HostControl.ClientToScreen(Point(0,0));
PDelpta := AControl.ClientToScreen(Point(0,0));

AControl.Left := HostP.x -2;
AControl.Top := HostP.y + HostControl.Height -2;

if (AControl.Width > WorkArea.Right - WorkArea.Left) then
AControl.Width := WorkArea.Right - WorkArea.Left;

if (AControl.Left + AControl.Width > WorkArea.Right) then
AControl.Left := WorkArea.Right - AControl.Width;
if (AControl.Left < WorkArea.Left) then
AControl.Left := WorkArea.Left;


if (AControl.Top + AControl.Height > WorkArea.Bottom) then
begin
if (HostP.y - WorkArea.Top > WorkArea.Bottom - HostP.y - HostControl.Height) then
AControl.Top := HostP.y - AControl.Height - 2;
end;

if (AControl.Top < WorkArea.Top) then
begin
AControl.Height := AControl.Height - (WorkArea.Top - AControl.Top);
AControl.Top := WorkArea.Top;
end;

if (AControl.Top + AControl.Height > WorkArea.Bottom) then
begin
AControl.Height := WorkArea.Bottom - AControl.Top;
end;
end;



Елена   (2002-02-04 15:04) [17]

На elena28@inbox.ru. Спасибо.



reonid   (2002-02-04 15:43) [18]

послал примерчик



Елена   (2002-02-04 15:46) [19]

Спасибо, получила, буду разбираться.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.06 c
3-56979           Максим С.             2002-01-23 13:32  2002.02.18  
Нужен пример работы с Interbase на Delphi5


14-57204          Иван Шихалев          2001-12-27 20:20  2002.02.18  
Насколько быстрее borlndmm.dll выделяет и освобождает память, чем функции WinAPI?


14-57208          ReNoiZer              2001-12-24 17:49  2002.02.18  
по поводу


1-57112           MAN-IN-RED            2002-02-02 21:32  2002.02.18  
Какие форматы знает MediaPlayer?


3-57035           dm                    2002-01-25 13:50  2002.02.18  
RecordSet