Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2013, 12:43   #1
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
Печаль speedbutton поверх stringgrid

доброго времени суток, форумчане
в общем, есть две таблицы stringgrid, для вывода данных из excel в ячейки этих grid'ов помещены combobox'ы. При щелчке по строке grid'a раскрывается список и после выбора вставляется содержимое. Мне необходимо несколько изменить этот процесс - надо чтобы на строчке grida при наведении мышки появлялась кнопка, при нажатии на которую раскрывался бы список, а если щелкать просто по строчке, то можно вручную вписывать значения. Пытаюсь использовать StringGridMouseMove, при наведении мышки кнопка действительно перемещается, но ее почему то не видно, как будто она оказывается за таблицей. Нажатие на speedbutton и раскрытие списка думаю и сам смогу сделать, но разместить эту кнопку поверх таблицы не получается. Прилагаю архив с исходниками, буду признателен за совет

Последний раз редактировалось marwell.; 01.02.2013 в 13:57.
marwell. вне форума Ответить с цитированием
Старый 01.02.2013, 13:00   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Наверное потому что кнопка эта - рисунок. А рисунок рисуется на канве родителя. А родитель - форма. Вот если создать ее с parent-ом в качестве грида, то думаю получится.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.02.2013, 13:06   #3
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Наверное потому что кнопка эта - рисунок. А рисунок рисуется на канве родителя. А родитель - форма. Вот если создать ее с parent-ом в качестве грида, то думаю получится.
точно! спасибо большое
marwell. вне форума Ответить с цитированием
Старый 02.02.2013, 14:07   #4
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
Печаль

Видимо я ошибался, когда сказал что сам смогу сделать нажатие на speedbutton и раскрытие списка поэтому прошу совета, как изменить вот эти две процедуры
Код:
   procedure TForm1.InitGrid(grid : TStringGrid; cbx : TComboBox;
                      Cols : array of integer; Rows : Integer; Sheet : Variant);
   var i : Integer;
   begin
      grid.DefaultRowHeight := cbx.Height;
      cbx.Visible := False;
      cbx.Style := csDropDownList;

      for i := 0 to High(Cols) do
         grid.ColWidths[i] := Cols[i];

      cbx.DropDownCount := 20;
      for i := 1 to Rows do
         cbx.Items.Add(Sheet.Cells[i, 1].Text);

      grid.Options := grid.Options + [goEditing];

      grid.OnSelectCell := MySelectCell; 
      grid.Tag := Integer(cbx);
   end;
и

Код:
procedure TForm1.MySelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
var
   R : TRect;
   Grid : TStringGrid;
begin
   if (ACol = 0) and (ARow <> 0) then
   begin
      Grid := Sender as TStringGrid;
      R := Grid.CellRect(ACol, ARow);
      OffsetRect(R, Grid.Left, Grid.Top);
      with TComboBox(Grid.Tag) do
      begin
         Left := R.Left + 1;
         Top := R.Top + 1;
         Width := (R.Right + 1) - R.Left;
         Height := (R.Bottom + 1) - R.Top;
         { Показываем combobox }
         Visible := True;
         SetFocus;
         DroppedDown := True;
      end;
   end;
   CanSelect := True;
end;
первая вставляет combobox в stringgrid, вторая вставляет содержимое combobox'a в выбранную ячейку grid'a. Мне надо повесить это раскрытие списка и вставку содержимого на speedbutton.
speedbutton рисуется на строчке grida,на которую наведен указатель

Код:
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  R: TRect;
  width, height: longint;
begin
StringGrid1.MouseToCell(X, Y, AAACol, AAARow);
width:=StringGrid1.ColWidths[AAACol];
height:=StringGrid1.RowHeights[AAARow];
  if ((AAACol = 0) AND
      (AAARow <> 0)) then begin
    R := StringGrid1.CellRect(AAACol, AAARow);
    R.Right := R.Right + StringGrid1.Left;
    SpeedButton1.Left := R.Left + width - speedbutton1.Width;
    SpeedButton1.Top := R.Top + height- speedbutton1.Height;
    SpeedButton1.Visible := True;
  end;

end;
пробовал убрать строчку grid.OnSelectCell := MySelectCell; из первой процедуры, и прописать на нажатие кнопки
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
MySelectCell(StringGrid1, AAACol, AAARow, True);
end;
, но выводит ошибку [Error]Types of actual and formal var parameters must be identical
marwell. вне форума Ответить с цитированием
Старый 02.02.2013, 14:16   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

procedure TForm1.MySelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
и
MySelectCell(StringGrid1, AAACol, AAARow, True);

Ошибка и говорит, что нельзя для var-параметра константу передавать. Нужно переменную того же типа, что и параметр
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.02.2013, 14:40   #6
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
procedure TForm1.MySelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
и
MySelectCell(StringGrid1, AAACol, AAARow, True);

Ошибка и говорит, что нельзя для var-параметра константу передавать. Нужно переменную того же типа, что и параметр
спасибо!
а если напишу
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var buba: boolean;
begin
MySelectCell(StringGrid1, AAACol, AAARow, buba);
end;
не будет ошибкой то что переменная buba у меня не определена? просто в процедуре MySelectCell этот CanSelect вроде ни на что не влияет...
marwell. вне форума Ответить с цитированием
Старый 02.02.2013, 15:47   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В переменную buba не помещено начальное значение. Но какое-то значение там есть. В данном случае ошибки не будет, как по мне это плохой стиль. И если параметр не используется в процедуре, то зачем он вообще в ней предусмотрен?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.02.2013, 15:59   #8
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В переменную buba не помещено начальное значение. Но какое-то значение там есть. В данном случае ошибки не будет, как по мне это плохой стиль. И если параметр не используется в процедуре, то зачем он вообще в ней предусмотрен?
к сожалению этого я не знаю, этот кусок был написан другим человеком и своевременно этот вопрос я у него не уточнял
marwell. вне форума Ответить с цитированием
Старый 02.02.2013, 18:01   #9
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

а, это допустимость ввода в данную ячейку
теперь понятно
marwell. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SpeedButton Ko$ Помощь студентам 2 09.11.2011 13:33
speedbutton.... f_z_l Компоненты Delphi 3 21.03.2011 18:56
SpeedButton mustang007 Общие вопросы Delphi 5 14.05.2009 19:44
PopUpMenu из SpeedButton Altera Общие вопросы Delphi 4 15.07.2008 04:14