Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.18;
Скачать: CL | DM;

Вниз

TComboBox   Найти похожие ветки 

 
OnixLab   (2007-01-23 13:15) [0]

Доброго времени суток уважаемые мастера.

Помогите разобраться с проблемой.
На форме есть TStringGrid. Мне нужно чтоб при выборе колонки в ее размерах появлялся ComboBox. Я его создаю динамически:
  CB_Theme                := TComboBox1.Create(SG_Answer);
  CB_Theme.Visible       := false;
  CB_Theme.Parent      := SG_Answer;
  CB_Theme.Truncate   := true;
  CB_Theme.Width       := 186;
  CB_Theme.OnChange := ThemeChange;

Все вроде бы нормально, но.
1) Список не раскрывается. Внизу Box"а виднеется черная полоска (вроде как раскрылось, но списка не видать).
2) Событие OnChange не отрабатывается. Куда оно девается не понятно совершенно.


 
MBo ©   (2007-01-23 13:19) [1]

Parent  := Форма (наверное, Self)


 
Elen ©   (2007-01-23 13:30) [2]


> OnixLab

Не создавай динамически.
попробуй так :

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, StdCtrls;

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   ComboBox1: TComboBox;
   procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
     var CanSelect: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var     r:trect;
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
 ARow: Integer; var CanSelect: Boolean);
begin

r:=StringGrid1.CellRect(ACol,ARow);
ComboBox1.Top:=r.Top+StringGrid1.Top;
ComboBox1.Left:=r.Left+StringGrid1.Left;
ComboBox1.Width:=StringGrid1.ColWidths[ACol];
ComboBox1.Height:=StringGrid1.RowHeights[ARow];
ComboBox1.Visible:=true;
end;

end.


А когда не нужно будет - прячЬ


 
EvChul ©   (2007-01-23 13:38) [3]

А как ты собственно список формируешь?


 
OnixLab   (2007-01-23 13:54) [4]

>Parent  := Форма (наверное, Self)
Так и писал с самого начала, но ничего не вышло.

>А как ты собственно список формируешь?
Список формирую из данных одной из таблиц.
По сути формирую список тем привязанных к предмету. Т.е. исли изменился текущий предмет, то и список должен поменяться.

>Elen
При таком раскладе компонента к сожалению не появится на StringGrid"е.
Parent  у него должен быть StringGrid"а.


 
OnixLab   (2007-01-23 13:57) [5]

>Elen
Если сделать Parent"ом StringGrid, то перестает раскрываться и реагировать на OnCange. Вот такая вот бодяга :-(((


 
MBo ©   (2007-01-23 14:05) [6]

>но ничего не вышло.
Почему?

>компонента к сожалению не появится на StringGrid"е.
Почему?


 
OnixLab   (2007-01-23 14:21) [7]

>MBo ©   (23.01.07 14:05) [6]

Т.е. он то создается, но родитель у него все равно StringGrid.

Вообщем если создавать на StringGrid"е, то все благополучие кончается (раскрытие списка и отклик на событие)


 
Elen ©   (2007-01-23 14:30) [8]


> OnixLab

Ты хоть пробовал мой код?


 
Elen ©   (2007-01-23 14:32) [9]


> При таком раскладе компонента к сожалению не появится на
> StringGrid"е.

При таком раскладе компонент появится Над нужной ячейкой Грида, Чем не катит?


 
MBo ©   (2007-01-23 14:51) [10]

>Т.е. он то создается, но родитель у него все равно StringGrid.
???
Если сделать родителем форму, то она и будет.
Комбик нужно создавать после грида, чтобы он был поверху.

А причина того, что детки грида не функционируют нормально, заключается в том, что обработчик сообщения WM_Command пересылает сообщения только InplaceEditor.


 
OnixLab   (2007-01-23 14:51) [11]

> Elen ©   (23.01.07 14:30) [8]
Первое что я сделал.

Не появится он там где я хотел бы.


 
OnixLab   (2007-01-23 14:56) [12]

>Elen
>При таком раскладе компонент появится Над нужной ячейкой Грида, Чем не >катит?

Он и появляется, но нужные свойства исчезают (раскрытие списка и отклик на событие)


 
Игорь Шевченко ©   (2007-01-23 15:02) [13]


> На форме есть TStringGrid. Мне нужно чтоб при выборе колонки
> в ее размерах появлялся ComboBox


Я так делал.

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Grids, StdCtrls;

type
 TfMain = class(TForm)
   StringGrid1: TStringGrid;
   procedure FormCreate(Sender: TObject);
   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
 private
   FComboBox : TComboBox;
   FComboRow, FComboCol : Integer;
   procedure ComboBoxChange (Sender : TObject);
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

procedure TfMain.ComboBoxChange(Sender: TObject);
begin
 if FComboBox.Visible then
   StringGrid1.Cells[FComboCol, FComboRow] := FComboBox.Text;
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
 FComboBox := TComboBox.Create(Self);
 FComboBox.Visible := false;
 FComboBox.Style := csDropDown;
 FComboBox.Parent := Self;
 FComboBox.OnChange := ComboBoxChange;
 FComboBox.Items.Add("1");
 FComboBox.Items.Add("2");
 FComboBox.Items.Add("3");
 FComboBox.Items.Add("4");
 FComboCol := -1;
 FComboRow := -1;
 StringGrid1.DefaultRowHeight := FComboBox.Height;
end;

procedure TfMain.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 ARect : TRect;
begin
 if (gdFixed in State) or (ARow < 1) then
   Exit;
 if (StringGrid1.Col <> FComboCol) or (StringGrid1.Row <> FComboRow) then begin
   if (FComboCol <> -1) and (FComboRow <> -1) then begin
     ARect := StringGrid1.CellRect(FComboCol,FComboRow);
     InvalidateRect(StringGrid1.Handle, @ARect, true);
   end;
   if not FComboBox.Visible then
     FComboBox.Visible := true;
   FComboBox.ItemIndex :=
     FComboBox.Items.IndexOf(StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]);
   ARect := StringGrid1.CellRect(StringGrid1.Col,StringGrid1.Row);
   MapWindowPoints(StringGrid1.Handle, Handle, ARect, 2);
   FComboBox.Height := StringGrid1.RowHeights[StringGrid1.Row];
   MoveWindow(FComboBox.Handle, ARect.left, ARect.Top,
                 ARect.Right - ARect.Left,
                 FComboBox.Height, true);
   FComboCol := StringGrid1.Col;
   FComboRow := StringGrid1.Row;
 end;
end;

end.


 
clickmaker ©   (2007-01-23 15:04) [14]

ComboBox1 создан в дизайне, лежит на форме, Visible = false

procedure TForm1.StringGrid1Click(Sender: TObject);
var
 CellRect: TRect;
 pt: TPoint;
begin
 CellRect := StringGrid1.CellRect(StringGrid1.Col, StringGrid1.Row);
 pt := StringGrid1.ClientToParent(Point(CellRect.Left, CellRect.Top));
 ComboBox1.Left := pt.X;
 ComboBox1.Top := pt.Y;
 ComboBox1.Width := CellRect.Right - CellRect.Left;
 ComboBox1.Visible := true;
 ComboBox1.BringToFront;
end;


 
Elen ©   (2007-01-23 15:10) [15]


OnixLab
> Он и появляется, но нужные свойства исчезают (раскрытие
> списка и отклик на событие)

Неправда. В таком случае [14] тоже не должен работать, а я clickmakerу верю.


 
OnixLab   (2007-01-23 15:17) [16]

>clickmaker ©   (23.01.07 15:04) [14]

Большое спасибо. Заработало.
Пока не понял чем твой код отличается, но работает именно так как нужно.
Большой респект.


 
OnixLab   (2007-01-23 15:38) [17]

>Elen ©   (23.01.07 15:10) [15]

Ни вкоем разе не хотел Вас обидеть.
Вероятно, я не так повторил Ваш код, поэтому и не получилось


 
Elen ©   (2007-01-23 15:39) [18]

Удалено модератором
Примечание: Оффтопик



Страницы: 1 вся ветка

Текущий архив: 2007.03.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
8-1152790718
TKN
2006-07-13 15:38
2007.03.18
32 ico


15-1172010886
Cooller
2007-02-21 01:34
2007.03.18
Delphi 7 для разработки программ на продажу


2-1172150387
Lonix
2007-02-22 16:19
2007.03.18
Помощь с сеткой на форме


1-1169717444
Альф
2007-01-25 12:30
2007.03.18
Обработка исключений в TThread


15-1171623176
pavel_guzhanov
2007-02-16 13:52
2007.03.18
можно ли сделать так, чтобы в exe файл входило что-то вроде базы