Форум: "Основная";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизНайти символ в строке относительно мыши Найти похожие ветки
← →
MsGuns © (2006-10-19 12:59) [0]Добрый день, уважаемые Мастера.
Есть стрингрид, в одной из колонок которого отображается информация, представляющая собою некоторые блоки текста, разделенные " - ". Например: "ШД123456 - ВВ387647 - ИЮ7653487324".
Надо при наведении мыши на любой из блоков хинтом отображать некоторую дополнительную информацию о блоке (которая для простоты лежит в некотором списке объектов и имеется функция GetBlockInfo(<строка с обозначением блока, например "ВВ387647">). Задача по позиции мыши определить символ строки, по нему найти начало блока (по разделителю), отпарсировать его в строку и хинтом отобразить подсказку, подставив в функцию обозначение блока.
Проблема в том, что не получается вычислить эту самую позицию в строке. Шрифт может быть любой.
Спасибо за любую помощь и участие.
← →
MsGuns © (2006-10-19 13:13) [1]Прошу прощения, что сунул не в ту конференцию. Если можно, перенесите, пожалуйста, в "Основную"
← →
Elen © (2006-10-19 14:20) [2]
> MsGuns ©
Уважаемый коллега по цеху. У меня есть старый пример такого из курсача (подарили студенты). Он сыроват но может наведет вас на мысль :
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var ar, br,k,e,ax,ay:integer;tr:TRect;s, s2:string;
begin
ax:=StringGrid1.MouseCoord(X,y).X;
ay:=StringGrid1.MouseCoord(X,y).y;
tr:=StringGrid1.CellRect(ax,ay);
if (ax>0)and(ay>0) then s:=StringGrid1.Cells[ax,ay];
ax:=abs(tr.Left-x);
ay:=tr.Top-y;
s2:="";
ar:=0;
if s<>"" then begin
br:=StringGrid1.Canvas.TextExtent(s2).cx;
while br<ax do begin
br:=StringGrid1.Canvas.TextExtent(s2).cx;
s2:=s2+s[ar];inc(ar);
end;
caption:=inttostr(ar)+" "+s[ar-2];
end;
end;
В капшине будет символ под курсором
← →
Elen © (2006-10-19 14:23) [3]P.S. Просьбочка - Если найдете решение поэлегантней запостить его сюда. Весьма любопытная задачка :)
← →
MsGuns © (2006-10-20 10:23) [4]>Elen © (19.10.06 14:23) [3]
>P.S. Просьбочка - Если найдете решение поэлегантней запостить его сюда. Весьма любопытная задачка :)
Спасибо за код. Буду разбираться. Решение напишу если не вытрет модератор ;))
← →
Игорь Шевченко © (2006-10-20 12:59) [5]Тупо и в лоб получилось так: (работает)
procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);
var
curPos: Integer;
curStr: string;
begin
Parts.Clear;
if Length(S) = 0 then
Exit;
Parts.BeginUpdate;
try
CurStr:= S;
repeat
CurPos:= AnsiPos(Delimeter, CurStr);
if CurPos > 0 then begin
Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
CurStr:= Copy(CurStr, CurPos+Length(Delimeter),
Length(CurStr)-CurPos-Length(Delimeter)+1);
end else
Parts.Add(CurStr);
until CurPos=0;
finally
Parts.EndUpdate;
end;
end;
function GetGridCellPartTextUnderCursor (Grid: TStringGrid;
X, Y: Integer): string;
var
ACol, ARow: LongInt;
CRect: TRect;
CellText: string;
I: Integer;
Distance: Integer;
StartX, EndX: Integer;
StartPart, EndPart: string;
Parts: Tstrings;
begin
Result := "";
Grid.MouseToCell(X, Y, ACol, ARow);
if (ACol > 0) and (ARow > 0) then begin
CRect := Grid.CellRect(ACol, ARow);
Distance := X - CRect.Left;
CellText := Grid.Cells[ACol, ARow];
Parts := TStringList.Create;
try
StrBreakApart(CellText, " - ", Parts);
StartPart := "";
EndPart := "";
for I:=0 to Pred(Parts.Count) do begin
EndPart := EndPart + Parts[I];
StartX := Grid.Canvas.TextWidth(StartPart);
EndX := Grid.Canvas.TextWidth(EndPart);
if (StartX <= Distance) and (EndX > Distance) then begin
Result := Parts[I];
Break;
end;
StartPart := EndPart + " - ";
EndPart := EndPart + " - ";
end;
finally
Parts.Free;
end;
end;
end;
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
Edit2.Text := GetGridCellPartTextUnderCursor((Sender as TStringGrid), X, Y);
end;
end.
← →
Elen © (2006-10-20 13:10) [6]
> Игорь Шевченко
Похожий принцип. Тоже можно. Спасибо пригодиться.
← →
guav © (2006-10-20 16:29) [7]
GetTextExtentExPoint
- и можно не разбивать строку, а искать нужный элемент в alpDx
← →
MsGuns © (2006-10-23 09:57) [8]Спасибо, Игорь. На как заставить перерисовываться хинт ? При движении мыши внутри контрола хинт не "перерисовывается".
← →
Игорь Шевченко © (2006-10-23 10:37) [9]MsGuns © (23.10.06 09:57) [8]
> На как заставить перерисовываться хинт ? При движении мыши
> внутри контрола хинт не "перерисовывается".
Наследнику класса THintWindow сказать ActivateHint, например.
Посмотри, как сделано в http://www.delphikingdom.com/asp/viewitem.asp?catalogid=566
← →
MsGuns © (2006-10-23 14:53) [10]Не находит зип ;(
← →
Ketmar © (2006-10-23 15:13) [11]>[10] MsGuns(c) 23-Oct-2006, 14:53
>Не находит зип ;(
http://www.delphikingdom.com/zip/combo.zip
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.052 c