Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.047 c
2-1172410281
CaptainBlack
2007-02-25 16:31
2007.03.18
C++,DLL и Delphi


15-1171701023
Александр Иванов
2007-02-17 11:30
2007.03.18
Дважды MCP


15-1171957234
Unknown user
2007-02-20 10:40
2007.03.18
Кто работал с OpenCV в Delphi?


15-1171890622
CCili
2007-02-19 16:10
2007.03.18
Кто-нить играл в World of Warcraft


15-1171961214
vasIZmax
2007-02-20 11:46
2007.03.18
Вот Вам и утка...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский