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

Вниз

Подсказка в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.056 c
15-1343378205
Phoenix_
2012-07-27 12:36
2013.03.22
Delphi -> Java/Android


8-1228319255
SpecRam
2008-12-03 18:47
2013.03.22
Типа календарный план график


2-1333633305
теркин
2012-04-05 17:41
2013.03.22
Поля синхронного просмотра


15-1338322058
Bluejohn
2012-05-30 00:07
2013.03.22
Чем порезать видео?


1-1299075890
pvr
2011-03-02 17:24
2013.03.22
Заполнение странички с помощью TWebBrowser