Форум: "Основная";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.039 c