Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Подсказка в StringGrid   Найти похожие ветки 

 
cardon   (2012-02-02 14:41) [0]

Добрый день. Нужна помощь по компоненту StringGrid.
А именно...
На форме лежит StringGrid с 4 колонками и 20 рядами.
Пользователю показываются только 2 колонки 0 и 1.
В StringGrid на событии OnSelectSell висит функция при выделении к примеру 2 ряда открывается новая панель и в нее передаются данные с StringGrid а сам StringGrid временно закрывается.

В 3 и 4 колонка хранятся данные которые необходимо показывать как подсказку пользователю при наведении на ряд в StringGrid. То есть пользователь навел мышку на 2 ряд и ему из 3 и 4 колонки во 2 ряду вывела общая подсказка.

Так вот вопрос как реализовать вывод данной подсказки пользователю?
P.S. Не стоит отправлять гуглить все методы что в интернете основаны на OnMouseMove и MouseToCell что не подходит мне т.к. MouseToCell выделяет ряд а как указано выше при выделении открывается панель и закрывается StringGrid.

В общем найдено мной одно решение.

procedure TForm1.strngrd1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
 var
   Row:Integer;
begin
 Row:= Y div strngrd1.DefaultRowHeight;

 strngrd1.Hint :=strngrd1.Rows[Row].Strings[3]+#32+strngrd1.Rows[Row].Strings[4];

end;


Но оно не идеальное по тому что
1) Если список с прокруткой то данный метод уже является не действительным
2) Чтобы повторно показать подсказку на другом ряде надо выйти за пределы StringGrid и заново навести на нужный ряд.(если есть решение данного вопроса буду оч признателен)


 
Dimka Maslov ©   (2012-02-02 15:25) [1]

1. Смотри как реализована стандартная подсказка - через класс THintWindow.
2. Смотри как она вызывается стандартным образом - как ответ на OnMouseEnter (может по другому, точно не помню)
3. Сделай так, чтобы она вызывалась при наведении мыши на ячейку через OnMouseMove


> MouseToCell выделяет ряд а как указано выше при выделении
> открывается панель и закрывается StringGrid


Брехня написана, ошибка в другом месте. MouseToCell просто возвращает координаты ячейки.


 
cardon   (2012-02-02 15:42) [2]

Ну в инете натыкался на один и тот же код

procedure TForm1.strngrd1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 r: integer;
 c: integer;
begin
 strngrd1.MouseToCell(X, Y, C, R);
 with strngrd1 do
 begin
   if ((Row <> r) or(Col <> c)) then
   begin
     Row := r;
     Col := c;
     Application.CancelHint;
     strngrd1.Hint :=IntToStr(r)+#32+IntToStr(c);
   end;
  end;
 end;



Вот если использовать его то при наведении на ячейку данные сразу передаются на новую панель и StringGrid закрывается.
А мне необходимо чтобы при наведении на новую ячейку выводилась инфа в подсказке из 3 и 4 столбца наведенного мышкой ряда.


 
Dimka Maslov ©   (2012-02-02 16:24) [3]

Что значит "данные сразу передаются на новую панель и стринггрид закрывается"?

В этих ваших интернетах пишут очень много всякой брехни.


 
Dimka Maslov ©   (2012-02-02 17:09) [4]

procedure TForm2.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 R, C: Integer;
begin
 StringGrid1.MouseToCell(X, Y, C, R);
 StringGrid1.Hint := IntToStr(R) + " " + IntToStr(C);
 Application.ActivateHint(StringGrid1.ClientToScreen(Point(X, Y)));
end;


 
Dimka Maslov ©   (2012-02-02 17:29) [5]

Ещё вариант (чтобы хинт не бегал за курсором)

var
 LastR: Integer = -1;
 LastC: Integer = -1;

procedure TForm2.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 R, C: Integer;
begin
 with StringGrid1 do begin
   MouseToCell(X, Y, C, R);
   if (LastR <> R) or (LastC <> C) then begin
     LastR := R;
     LastC := C;
     Hint := IntToStr(R) + " " + IntToStr(C);
     Application.ActivateHint(StringGrid1.ClientToScreen(Point(X, Y)));
   end;
 end;
end;


Если же мы хотим, чтобы при наведении курсора и его удержании над ячейкой - надо писать свой компонент, который получает WM_MOUSEHOVER и соотв. образом его обрабатывает. Это уже сложнее.


 
Юрий Зотов ©   (2012-02-03 02:31) [6]

Эх, давно не писал я компонентов... вот и решил размяться.

unit Unit1;

interface

uses
 SysUtils, Classes, Controls, Forms, Grids;

type
 TYzStringGrid = class;
 TGetHintEvent = function(Sender: TYzStringGrid; C, R: integer): string of object;

 TYzStringGrid = class(TStringGrid)
 private
   FMouseCol: integer;
   FMouseRow: integer;
   FOnGetHintEvent: TGetHintEvent;
 protected
   procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
   function DoGetHintEvent: string; dynamic;
   property MouseCol: integer read FMouseCol;
   property MouseRow: integer read FMouseRow;
 public
   constructor Create(AOwner: TComponent); override;
 published
   property OnGetHintEvent: TGetHintEvent read FOnGetHintEvent write FOnGetHintEvent;
 end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   function OnGetHint(Sender: TYzStringGrid; C, R: integer): string;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TYzStringGrid }

constructor TYzStringGrid.Create(AOwner: TComponent);
begin
 inherited;
 FMouseRow := -1;
 FMouseCol := -1
end;

function TYzStringGrid.DoGetHintEvent: string;
begin
 if Assigned(FOnGetHintEvent) then
   Result := FOnGetHintEvent(Self, MouseRow, MouseCol)
 else
   Result := Hint
end;

procedure TYzStringGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
var
 C, R: integer;
begin
 inherited;
 MouseToCell(X, Y, C, R);
 if (FMouseCol <> C) or (FMouseRow <> R) then
 begin
   FMouseCol := C;
   FMouseRow := R;
   Hint := DoGetHintEvent;
   if Hint = "" then
     Application.CancelHint
   else
     Application.ActivateHint(ClientToScreen(Point(X, Y)))
 end
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 with TYzStringGrid.Create(Self) do
 begin
   ColCount := 5;
   RowCount := 3;
   ShowHint := True;
   OnGetHintEvent := OnGetHint;
   Parent := Self
 end
end;

function TForm1.OnGetHint(Sender: TYzStringGrid; C, R: integer): string;
begin
 if (C >= Sender.FixedCols) and (R >= Sender.FixedRows) then
   Result := Format("C = %d, R = %d", [C, R])
 else
   Result := ""
end;

end.



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

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.058 c
15-1336681802
Юрий
2012-05-11 00:30
2013.03.22
С днем рождения ! 11 мая 2012 пятница


6-1262521995
Indy 10
2010-01-03 15:33
2013.03.22
Перенос проекта Indy 9 > Indy 10. Проблема с IdTCPServerExecute.


4-1261055064
Андрей Пл
2009-12-17 16:04
2013.03.22
Работа с СОМ портом, пакет AsyncPro406


4-1261510346
denis_l
2009-12-22 22:32
2013.03.22
Определение пользователя который запустил процесс


15-1337097562
brother
2012-05-15 19:59
2013.03.22
Интересно мнение:





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский