PDA

View Full Version : ?HyperLink in DBMemo



FirstLine
سه شنبه 26 آبان 1383, 19:27 عصر
با سلام
یه مشکل بزرگ؟!
یک لیست 10000 صفحه ای دارم که بعضی از صفحات 10 الی 40 خط است. من هر صفحه را در یک DBMemo نمایش میدهم. (که بصورت NText داخل SQL موجود است)
اطلاعات این صفحات با هم مرتبط هستند، بصورتیکه مثلا در صفحه 10 چندین بار عنوان صفحات 21 و 59 و ... مثلا بصورت "صفحه 21" در بین حروف و عبارات DBMemo نمایش داده شده است.
حالا من میخواهم که اگر عنوان صفحه ای در هریک از صفحات موجود بود بصورت یک هایپر لینک HyperLink عمل کرده و با کلیک بر روی آن صفحه مربوطه در یک پنجره جدید باز شود.
این صورت مسئله بود و من نمیدانم که چه باید کرد. لطفا اینجانب را در حل این مشکل راهنمایی بفرمایید.
با تشکر

MiRHaDi
سه شنبه 26 آبان 1383, 23:00 عصر
سلام
به جای Memo از Html استفاده کن و اونو توی دیتابیس بذار و برای اون تعریف کن
بای

FirstLine
سه شنبه 26 آبان 1383, 23:21 عصر
با سلام
میشه بیشتر راهنمایی کنید؟
یعنی یه چیزی مثل همین ادیتور HTML که به یک عنوان جواب میدیم؟
چجوری به دیتنابیس وصلش کنم؟
با تشکر

vcldeveloper
چهارشنبه 27 آبان 1383, 01:42 صبح
برای این کار لازم نیست از HTML استفاده کنی، کافیه از RichEdit استفاده کنی. برای این کار ابتدا باید به RichEdit قابلیت شناخت اتوماتیک URL رو اضافه کنی. این کار در تاپیک های مختلف همین سایت و سایت های دیگه توضیح داده شده. من کدی رو که قبلا در سایت delphi.about.com توضیح داده شده بود، اینجا برات میزارم:



{************************************************* ******
TRichEditURL - hyperlink aware RichEdit

http://delphi.about.com/library/weekly/aa051804a.htm

Full source code of the TRichEditURL Delphi component,
an extension to the standard RichEdit component. The
TRichEditURL automatically recognizes URLs. Whenever the
text in a RichEditURL matches the format of a URL, the
control will display it as a hyperlink - when the link is
clicked an event is raised enabling you to, for example,
open a browser or send an email. The TRichEditURL works
correctly event when placed on a Panel or any other container control.

RichEditURL.pas
************************************************** *******}
unit RichEditURL;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Controls,
ComCtrls, ExtCtrls, RichEdit;

type
TURLClickEvent = procedure(Sender :TObject; const URL: string) of object;

TRichEditURL = class(TRichEdit)

private
FOnURLClick: TURLClickEvent;
procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY;
protected
procedure DoURLClick (const URL : string);
procedure CreateWnd; override;
published
property OnURLClick : TURLClickEvent read FOnURLClick write FOnURLClick;
end;

procedure Register;


implementation

procedure Register;
begin
RegisterComponents('delphi.about.com', [TRichEditURL]);
end;

{ TRichEditURL }
procedure TRichEditURL.DoURLClick(const URL : string);
begin
if Assigned(FOnURLClick) then OnURLClick(Self, URL);
end; (*DoURLClick*)

procedure TRichEditURL.CNNotify(var Msg: TWMNotify);
var
p: TENLink;
sURL: string;
begin
if (Msg.NMHdr^.code = EN_LINK) then
begin
p := TENLink(Pointer(Msg.NMHdr)^);
if (p.Msg = WM_LBUTTONDOWN) then
begin
try
SendMessage(Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
sURL := SelText;
DoURLClick(sURL);
except
end;
end;
end;

inherited;
end; (*CNNotify*)

procedure TRichEditURL.CreateWnd;
var
mask: Word;
begin
inherited CreateWnd;

SendMessage(Handle, EM_AUTOURLDETECT,1, 0);
mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
end; (*CreateWnd*)

end. (* RichEditURL.pas *)


دقت کن که با کد بالا فقط به RichEdit امکان تشخیص URL های استاندارد داده میشه، نه هر لینکی که خودت دوست داشتی، پس لینک های تو هم باید از همون قالب های استاندارد استفاده کنند، مثلا

http://www.pagenumber.mylink (برای نمونه http://www.25.mylink ).

بعد از نصب این کامپوننت ساده می تونی از رویداد OnURLClick این کامپوننت بصورت زیر استفاده کنی:

1- دو تابع به رویداد OnURLClick بالا اضافه کن. یکی برای چک کردن لینک و تشخیص اینکه آیا لینک مربوطه به صفحات داخل بانک اطلاعاتی ارجاع میشه یا اینکه یه لینک ساده وب هست. مثلا function LinkIsPageNumber(URL: string): boolean

یکی هم برای پیدا کردن شماره صفحه مورد نظر از داخل لینک (یعنی اگر لینک مربوط به صفحات بانک اطلاعاتی بود، کلمات داخل لینک رو چک کنه و شماره صفحه رو که بین http://www و .mylink قرار گرفته بدست بیاره). مثلا function GetPageNumber: integer

2- در رویداد OnURLClick این کامپوننت کدی شبیه به این رو اضافه کن:



procedure RichEditURL1.OnURLClick(Sender :TObject; const URL: string);
function LinkIsPageNumber(URL: string): boolean;
begin
// Check if the passed URL is a database link
// if it is then Result := True
end;

function GetPageNumber: integer;
begin
// Parse the URL and find page number in it.
end;

var
PageNum : integer;

begin
if LinkIsPageNumber(URL) then
begin
PageNum := GetPageNumber;
// Search database for the record which page number refers to and go to that record.
end

else
// if URL is not a database page link, then open it in default browser
ShellExecute(Application.Handle,
PChar('open'),
PChar(URL),
PChar(0),
nil,
SW_NORMAL);
end;


نکته آخر اینه که: این کامپوننت از TRichEdit به ارث گرفته شده، اگر قصد اضافه کردن قابلیت Data-Aware رو بهش داری میتونی بجای TRichEdit اونو از TDBRichEdit ارث بگیری.

موفق باشی. :موفق:

FirstLine
چهارشنبه 27 آبان 1383, 06:14 صبح
با سلام
از راهنمایی شما بسیار سپاسگزارم .
اما یه نکته اینکه من نمیخوام هیچ URL ای باز بشه بلکه میخوام مثل URL عمل کنه ، به این صورت که اگه روی یک نوشته ای که بصورت مشخص است و اگر موس روی آن رفت مثل هایپر لینک بصورت دست شود و اگر کلیک کرد مثلا یک کد را به برنامه برگرداند.
یعنی اینکه
1- چجوری چند کلمه داخل یک متن را متمایز تر از بقیه نمایش دهم و اگر موس روی آن رفت بصورت دست بشود (مثل هایپر لینک)
2- اگر روی آن قسمت متمایز کلیک کرد یک آرگومان (ID موجود در دیتابیس) بر اساس آن قسمت مشخص شده را برگرداند
با تشکر

vcldeveloper
چهارشنبه 27 آبان 1383, 16:15 عصر
بدر کد بالا هم شما می تونید کاری رو که میخواید انجام بدید (در رویداد OnURLClick) کاری رو که باید در زمان کلیک روی لینک انجام بشه رو تعریف کنید.
در ضمن با کد بالا ، هر بار که موس روی لینک قرار بگیره، بطور اتوماتیک به شکل دست در میاد.

MiRHaDi
پنج شنبه 28 آبان 1383, 01:07 صبح
سلام
این چیزی که میخوای دقیقا مثل فرمت Help هست !
20 30 تا تاپیک برو عقب شاید به دردت بخوره
بای