Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2013, 14:59   #1
Mzg170
 
Регистрация: 27.11.2006
Сообщений: 4
По умолчанию Вопрос по TLabel

Существует ли какой-нибудь относительно несложный способ определения символа или слова в Label, находящегося по координатам, возвращаемым событием OnMouseDown?
Иными словами, стоит задача определения слова из текста в Label, по которому кликнул пользователь.
Mzg170 вне форума Ответить с цитированием
Старый 10.10.2013, 15:19   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,890
По умолчанию

Цитата:
стоит задача определения слова из текста в Label
В TLabel нет ни слов, ни текста. TLabel это картинка.
northener вне форума Ответить с цитированием
Старый 10.10.2013, 15:25   #3
Mzg170
 
Регистрация: 27.11.2006
Сообщений: 4
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
В TLabel нет ни слов, ни текста. TLabel это картинка.
Имел в виду TLabel.Caption, конечно же.
Mzg170 вне форума Ответить с цитированием
Старый 10.10.2013, 15:45   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,890
По умолчанию

Цитата:
Сообщение от Mzg170 Посмотреть сообщение
Имел в виду TLabel.Caption, конечно же.
Я понял что вы имели в виду. Но у TLabel нет своего окна, чей текст можно было бы получить стандартными средствами WinAPI. Это просто рисунок на канве парента.
northener вне форума Ответить с цитированием
Старый 10.10.2013, 16:00   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Все можно. Если речь о Label непосредственно на форме, то см. код ниже. Для Label в контейнерах все сильно посложней будет
Код:
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
  private
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  public
  end;

...

procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  if TControl(Message.LParam) is TLabel then Caption:=TLabel(Message.LParam).Caption
                                        else Caption:='Не Label';
end;
Запоминать например в строковую переменную, а в OnMouseDown её использовать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.10.2013 в 16:06.
Аватар вне форума Ответить с цитированием
Старый 10.10.2013, 16:18   #6
Mzg170
 
Регистрация: 27.11.2006
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Запоминать например в строковую переменную, а в OnMouseDown её использовать
Тогда уж прямо в OnMouseDown Label'а можно использовать TLabel(sender).Caption, вопрос в том, как определить на каком символе этого caption был совершен клик мышью.
Mzg170 вне форума Ответить с цитированием
Старый 10.10.2013, 16:25   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Тоды да. Это я не в ту степь. Координаты мыши и Label есть. Фонт и его размеры есть. Остается вычислить на какой букве клик используя что нибудь типа GetTextMetrics и/или GetTextExtentPoint32
Код:
procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var s,s1: String;
    i,k: Integer;
    Size: TSize;
begin
  if not (Sender is TLabel) then Exit;
  s:=''; s1:='';
  for i:=1 to Length(TLabel(Sender).Caption) do begin
    s:=s+TLabel(Sender).Caption[i];
    if TLabel(Sender).Caption[i]=' ' then s1:='' else s1:=s1+TLabel(Sender).Caption[i];
    GetTextExtentPoint32(TLabel(Sender).Canvas.Handle,PChar(s),Length(s),Size);
    if Size.cx>=X then begin
      for k:=i+1 to Length(TLabel(Sender).Caption) do
        if TLabel(Sender).Caption[k]=' ' then Break else s1:=s1+TLabel(Sender).Caption[k];
      Label2.Caption:=s1;
      Exit;
    end;
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.10.2013 в 18:57.
Аватар вне форума Ответить с цитированием
Старый 11.10.2013, 16:52   #8
Mzg170
 
Регистрация: 27.11.2006
Сообщений: 4
По умолчанию

Немного модифицировал, чтобы отрабатывались многострочные Label и переносы строки:
Код:
procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var s,s1: String;
    LastSpacePos,StrNum, _StrNum,i,k: Integer;
    Size: TSize;

begin
  if not (Sender is TLabel) then Exit;
  s:=''; s1:='';
  GetTextExtentPoint32(TLabel(Sender).Canvas.Handle,TLabel(Sender).Caption,Length(TLabel(Sender).Caption),Size);
  StrNum:=(Y div Size.cy)+1;
  _StrNum:=1;
  LastSpacePos:=0;
  for i:=1 to Length(TLabel(Sender).Caption) do
   begin
    s:=s+TLabel(Sender).Caption[i];
    if (TLabel(Sender).Caption[i]=' ')or(TLabel(Sender).Caption[i]=#13)or(TLabel(Sender).Caption[i]=#10) then
      begin
       LastSpacePos:=i;
       s1:='';
      end
    else s1:=s1+TLabel(Sender).Caption[i];
    GetTextExtentPoint32(TLabel(Sender).Canvas.Handle,PChar(s),Length(s),Size);
    if (Size.cx>TLabel(Sender).Width)or(TLabel(Sender).Caption[i]=#13) then
      begin
        inc(_StrNum);
        s:=copy(TLabel(Sender).Caption,LastSpacePos+1,i-LastSpacePos);
        s1:=s;
        Continue;
      end;
    if (Size.cx>=X)and(_StrNum=StrNum) then
      begin
          for k:=i+1 to Length(TLabel(Sender).Caption) do
            if (TLabel(Sender).Caption[k]=' ')or (TLabel(Sender).Caption[k]=#13) then Break else
              begin
                s1:=s1+TLabel(Sender).Caption[k];
              end;
          Label2.Caption:=s1;
          Exit;
     end;
   end;
end;
Mzg170 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tedit і TLabel... $T@LKER Компоненты Delphi 1 16.05.2009 19:47
Вопрос про TLabel Alex.rus Помощь студентам 3 14.07.2008 22:04
Tlabel Artificial Общие вопросы Delphi 4 16.06.2008 01:31
TLabel satana Компоненты Delphi 3 10.02.2008 22:01
работа с Tlabel Аббат Общие вопросы Delphi 18 18.04.2007 13:56