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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2008, 16:17   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию URL в RichEdit

Цитата:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, MMSystem, ShellApi, RichEdit, ExtCtrls,
sSkinProvider, sSkinManager, sButton;

type
TForm1 = class(TForm)
Logo: TImage;
RichEdit1: TRichEdit;
sSkinProvider1: TsSkinProvider;
sBOK: TsButton;
procedure FormCreate(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
protected
procedure WndProc(var Message: TMessage); override;
end;

var
Form1: TForm1;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm1.WndProc(var Message: TMessage);
var
p: TENLink;
strURL: string;
begin
if (Message.Msg = WM_NOTIFY) then
begin
if (PNMHDR(Message.lParam).code = EN_LINK) then
begin
p:=TENLink(Pointer(TWMNotify(Messag e).NMHdr)^);
if (p.Msg = WM_LBUTTONDOWN) then
begin
SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
strURL:=RichEdit1.SelText;
ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL);
end
end
end;

inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
mask: Word;
begin
mask:=SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);
RichEdit1.Text:='http://www.programmersforum.ru';
end;

end.
Такой код превращает в ссылки записи, которые начинаются с http://. Помогите его модифицировать, чтобы он воспринимал как ссылку запись начинающуюся на dchub://.
Shouldercannon вне форума Ответить с цитированием
Старый 28.09.2008, 00:02   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Могу только порекомендовать только RichView. Скачать.
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 28.09.2008, 02:12   #3
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

скорее всего в стандартный процедурах нету dchub://
так что самому придётся лопатить весь текст
если начинается на dchub:// и заканчивается на "пробел", то делаем ссылкой )
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 28.09.2008, 13:53   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

RichView надо покупать. Придётся отслеживать dchub://.
Shouldercannon вне форума Ответить с цитированием
Старый 28.09.2008, 16:23   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Я уж не знаю есть ли dchub://www, но если да, то можно и с RichEdit'ом поизвращаться
Код:
procedure TForm1.WndProc(var Message: TMessage);
var
  p: TENLink;
  strURL: string;
begin  
  if (Message.Msg = WM_NOTIFY) then
  if (PNMHDR(Message.lParam).code = EN_LINK) then
  begin
    p:=TENLink(Pointer(TWMNotify(Message).NMHdr)^);
    if (p.Msg = WM_LBUTTONDOWN) then
    begin
      SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
      strURL:=RichEdit1.SelText;
      if copy(richedit1.text, RichEdit1.SelStart - 8, 8)='dchub://'
      then strURL:='dchub://'+strURL;
      showmessage('Открывание '+strURL);
      ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL)
    end
  end;
  inherited
end;

procedure TForm1.FormCreate(Sender: TObject);
var 
  mask: Word;
begin  
  mask:=SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
  SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);
  RichEdit1.Text:='dchub:// www.site.ru' + #13+#10+
  'http://www.programmersforum.ru привет';
end;
"dchub:// " - после "//" пробел можно окрасить в синий и подчеркнуть (SelStart, SelLength, SelAttribute) для красоты
Если программа FlyLincDC (или подобная) установлена, то открывает.
Да, вот ещё, если кликнуть по пустому месту, открывается последняя ссыска в тексте - отслеживай это.
eoln вне форума Ответить с цитированием
Старый 28.09.2008, 16:49   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Да, вот ещё, если кликнуть по пустому месту, открывается последняя ссыска в тексте - отслеживай это.
Это если курсор находится под ней.
Получилось хорошо, только адреса хабов не начинаются на www. Вот например dchub://hub.mypenza.ru

Последний раз редактировалось Shouldercannon; 28.09.2008 в 17:24.
Shouldercannon вне форума Ответить с цитированием
Старый 28.09.2008, 17:23   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Ну тогда ищите или другой способ или ещё раз поизвращайтесь, заменив if copy(richedit1.text, RichEdit1.SelStart - 8, 8)='dchub://' then strURL:='dchub://'+strURL; на
Код:
      if copy(richedit1.text, RichEdit1.SelStart - 8, 8)='dchub://'
      then begin
        delete(strURL, 1, 4);
        strURL:='dchub://'+strURL;
      end;
где RichEdit1.Text:='dchub:// www.hub.mypenza.ru' + #13+#10+
'http://www.programmersforum.ru привет';
Переходить будет, но в тексте должны присутствовать www
eoln вне форума Ответить с цитированием
Старый 28.09.2008, 20:17   #8
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Уже лучше. Спасибо.
Shouldercannon вне форума Ответить с цитированием
Старый 28.09.2008, 22:53   #9
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Такой код превращает в ссылки записи, которые начинаются с http://. Помогите его модифицировать, чтобы он воспринимал как ссылку запись начинающуюся на dchub://.
Не правда он подсвечивает любую ссылку, которая зарегистрирована как протокол в системе. Можете просто зарегистрировать протокол с идентификатором dchub
Код:
var reg:tregistry;
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_Classes_Root;
if not(reg.KeyExists('dchub')) then
begin
reg.OpenKey('dchub',true);
reg.WriteString('','URL:dchub Protocol');
reg.WriteString('URL Protocol','');
reg.OpenKey('DefaultIcon',true);
reg.WriteString('',<путь к выполняемому файлу программы>);
reg.CloseKey;
reg.OpenKey('dchub\shell\open\command',true);
reg.WriteString('',<путь к выполняемому файлу программы>+' %1');
reg.CloseKey;
end;
reg.Free;
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 09.10.2008, 17:32   #10
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Не работает. Протокол зарегистрируется, а толку? Это не влияет на RichEdit.
Shouldercannon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
richedit Arkuz Общие вопросы Delphi 3 24.09.2008 22:38
RichEdit StartMis Общие вопросы Delphi 20 24.04.2008 15:40
RichEdit nimf Общие вопросы Delphi 8 23.04.2008 07:55
RichEdit и *.gif Teen4jump Общие вопросы Delphi 2 03.04.2008 10:10
RichEdit Римма Компоненты Delphi 3 23.01.2008 14:33