![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Найти символ в строке относительно мыши [D7]
MsGuns © (2006-10-19 12:59:00)Добрый день, уважаемые Мастера.
Есть стрингрид, в одной из колонок которого отображается информация, представляющая собою некоторые блоки текста, разделенные " - ". Например: "ШД123456 - ВВ387647 - ИЮ7653487324".
Надо при наведении мыши на любой из блоков хинтом отображать некоторую дополнительную информацию о блоке (которая для простоты лежит в некотором списке объектов и имеется функция GetBlockInfo(<строка с обозначением блока, например "ВВ387647">). Задача по позиции мыши определить символ строки, по нему найти начало блока (по разделителю), отпарсировать его в строку и хинтом отобразить подсказку, подставив в функцию обозначение блока.
Проблема в том, что не получается вычислить эту самую позицию в строке. Шрифт может быть любой.
Спасибо за любую помощь и участие.
Ketmar (2006-10-23 15:13:00) [1]>[10] MsGuns(c) 23-Oct-2006, 14:53
>Не находит зип ;(
http://www.delphikingdom.com/zip/combo.zip
MsGuns (2006-10-23 14:53:00) [2]Не находит зип ;(
Игорь Шевченко (2006-10-23 10:37:00) [3]MsGuns © (23.10.06 09:57) [8]
> На как заставить перерисовываться хинт ? При движении мыши
> внутри контрола хинт не "перерисовывается".
Наследнику класса THintWindow сказать ActivateHint, например.
Посмотри, как сделано в http://www.delphikingdom.com/asp/viewitem.asp?catalogid=566
MsGuns (2006-10-23 09:57:00) [4]Спасибо, Игорь. На как заставить перерисовываться хинт ? При движении мыши внутри контрола хинт не "перерисовывается".
guav (2006-10-20 16:29:00) [5]
GetTextExtentExPoint- и можно не разбивать строку, а искать нужный элемент в alpDx
Elen (2006-10-20 13:10:00) [6]
> Игорь Шевченко
Похожий принцип. Тоже можно. Спасибо пригодиться.
Игорь Шевченко (2006-10-20 12:59:00) [7]Тупо и в лоб получилось так: (работает)
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.
MsGuns (2006-10-20 10:23:00) [8]>Elen © (19.10.06 14:23) [3]
>P.S. Просьбочка - Если найдете решение поэлегантней запостить его сюда. Весьма любопытная задачка :)
Спасибо за код. Буду разбираться. Решение напишу если не вытрет модератор ;))
Elen (2006-10-19 14:23:00) [9]P.S. Просьбочка - Если найдете решение поэлегантней запостить его сюда. Весьма любопытная задачка :)
Elen (2006-10-19 14:20:00) [10]
> 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;
В капшине будет символ под курсором
MsGuns (2006-10-19 13:13:00) [11]Прошу прощения, что сунул не в ту конференцию. Если можно, перенесите, пожалуйста, в "Основную"