2,497
社区成员
发帖
与我相关
我的任务
分享
unit MyDBHyperLinkEdit;
interface
uses Variants, Windows, SysUtils, Messages, Controls, Forms, Classes, Dialogs,
Graphics, DB, cxDBEdit, cxEdit, cxDataUtils;
type
TMyDBHyperLinkEditDataBinding = class(TcxDBTextEditDataBinding)
private
FHyperLinkText,
FHyperLink,
FText: string;
FRecNo: integer;
FColor: TColor;
FCursor: TCursor;
FTextStyle: TFontStyles;
FOnDblClick: TNotifyEvent;
function IsvalidHyperLink(const aHyperLink: string): boolean;
function ParseHyperLink(const aHyperLink: string; var HyperLink, Text: string): boolean;
procedure OnDblClick(Sender: TObject);
protected
procedure SetDisplayValue(const Value: TcxEditValue); override;
procedure DataChanged; override;
procedure UpdateData; override;
public
constructor Create(AEdit: TcxCustomEdit); override;
property HyperLink: string read FHyperLink;
property HyperLinkAndText: string read FHyperLinkText;
end;
TMyDBHyperLinkTextEdit = class(TcxDBTextEdit)
private
protected
class function GetDataBindingClass: TcxEditDataBindingClass; override;
public
end;
implementation
uses ShellAPI;
type
TcxCustomEditAccess = class(TcxCustomEdit);
{ TMyDBHyperLinkEditDataBinding }
constructor TMyDBHyperLinkEditDataBinding.Create(AEdit: TcxCustomEdit);
begin
inherited;
FColor := AEdit.Style.TextColor;
FTextStyle := AEdit.Style.TextStyle;
FCursor := AEdit.Cursor;
FOnDblClick := AEdit.OnDblClick;
AEdit.OnDblClick := OnDblClick;
end;
procedure TMyDBHyperLinkEditDataBinding.DataChanged;
begin
if IsRefreshDisabled then
Exit;
if Edit.IsDesigning and not IsDataAvailable then
UpdateNotConnectedDBEditDisplayValue
else
begin
if not TcxCustomEditAccess(Edit).Focused and
Edit.ActiveProperties.IsValueEditorWithValueFormatting then
begin
if not IsDataAvailable or IsNull then
TcxCustomEditAccess(Edit).FEditValue := Null
else
TcxCustomEditAccess(Edit).FEditValue := Field.Value;
Edit.LockClick(True);
try
SetInternalDisplayValue(StoredValue);
finally
Edit.LockClick(False);
end;
end
else begin
FHyperLink := '';
if StoredValue=null then
FText := ''
else
FText := StoredValue;
if not (StoredValue=null) and IsvalidHyperLink(StoredValue) then
ParseHyperLink(Field.Value, FHyperLink, FText);
if FHyperLink='' then
Edit.EditValue := Format('<a href="http://">%s</a>', [FText])
else
Edit.EditValue := FText;
end;
end;
Edit.Hint := Format('http://%s', [FHyperLink]);
Edit.Style.TextColor := FColor;
Edit.Cursor := FCursor;
Edit.Style.TextStyle := FTextStyle;
if FHyperLink<>'' then
begin
Edit.Style.TextColor := clBlue;
Edit.Style.TextStyle := FTextStyle + [fsUnderline];
Edit.Cursor := crHandPoint;
end;
end;
function TMyDBHyperLinkEditDataBinding.IsvalidHyperLink(const aHyperLink: string): boolean;
var
tmp: string;
begin
//'<a href="http://www.163.com">网易主页</a>'
tmp := LowerCase(aHyperLink);
result := (Copy(tmp, 1, 16)='<a href="http://') and (Copy(tmp, Length(tmp)-3, 4)='</a>') and (Pos('">', aHyperLink)>0);
end;
procedure TMyDBHyperLinkEditDataBinding.OnDblClick(Sender: TObject);
begin
if HyperLink<>'' then
ShellExecute(Application.Handle, 'open', PWideChar('http://'+HyperLink), nil, nil, SW_SHOWNORMAL);
if Assigned(FOnDblClick) then
FOnDblClick(Sender);
end;
function TMyDBHyperLinkEditDataBinding.ParseHyperLink(const aHyperLink: string;
var HyperLink, Text: string): boolean;
var
tmp: string;
begin
result := false;
if IsvalidHyperLink(aHyperLink) then
begin
tmp := aHyperLink;
Delete(tmp, 1, 16);
Delete(tmp, Pos('</a>', tmp), 4);
HyperLink := Copy(tmp, 1, Pos('">', tmp)-1);
text := Copy(tmp, Pos('">', tmp)+2, Length(tmp));
result := true;
end;
end;
procedure TMyDBHyperLinkEditDataBinding.SetDisplayValue(
const Value: TcxEditValue);
begin
if IsDataAvailable then
begin
if not Edit.Focused and self.Editing and (FHyperLink<>'') then
SetInternalDisplayValue(Format('<a href="http://%s">%s</a>', [FHyperLink, Value]))
else
SetInternalDisplayValue(Value)
end
else
if Edit.IsDesigning then
SetInternalDisplayValue(Edit.Name)
else
SetInternalDisplayValue('');
end;
procedure TMyDBHyperLinkEditDataBinding.UpdateData;
begin
if IsDataAvailable then
begin
if Edit.ValidateEdit(True) then
begin
StoredValue := Edit.EditValue;
if not (Edit.EditValue=null) and not IsvalidHyperLink(Edit.EditValue) then
StoredValue := Format('<a href="http://%s">%s</a>', [FHyperLink, Edit.EditValue]);
end;
end;
end;
{ TMyDBHyperLinkEdit }
class function TMyDBHyperLinkTextEdit.GetDataBindingClass: TcxEditDataBindingClass;
begin
result := TMyDBHyperLinkEditDataBinding;
end;
end.