Форум: "Начинающим";
Текущий архив: 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.071 c