Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1163252014
antonn
2006-11-11 16:33
2006.12.03
опять про пхп (а может и нет...)


15-1163713710
dreamse
2006-11-17 00:48
2006.12.03
SQL запрос


6-1152735417
papaP
2006-07-13 00:16
2006.12.03
Проблема с ошибкой 302 Found


2-1163577126
DragonIG
2006-11-15 10:52
2006.12.03
Как можно из-под программы переписать строковые ресурсы в DLL


15-1163510461
Loginov Dmitry
2006-11-14 16:21
2006.12.03
Какое значение окажется в итоге в Caption?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский