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

Вниз

Найти символ в строке относительно мыши   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
15-1163174057
Колдун1111111
2006-11-10 18:54
2006.12.03
АЦП последовательного приближения


2-1163670719
galyc
2006-11-16 12:51
2006.12.03
правильность ввода пути


8-1145877105
us
2006-04-24 15:11
2006.12.03
анализатор звука


2-1163524922
Beavercrazy
2006-11-14 20:22
2006.12.03
Как сохранить файл в формате html


2-1163756985
q3
2006-11-17 12:49
2006.12.03
SQL: объединить timestamp