📄 wwdbedit.pas
字号:
end
else Result:= True;
end;
procedure TwwDBCustomEdit.Reset;
begin
if FDataLink.Field<>Nil then begin
FDataLink.Reset;
end
else
Text:= StartValue;
SelectAll;
SetModified(False);
DoRefreshValidationDisplay;
end;
procedure TwwDBCustomEdit.SetFocused(Value: Boolean);
begin
if FFocused <> Value then
begin
FFocused := Value;
if (GetEffectiveAlignment <> taLeftJustify) and not IsMasked then Invalidate;
if FDataLink.Field<>Nil then begin
FDataLink.Reset;
end
else if Focused then
StartValue:= Text; { For unbound case }
end;
end;
procedure TwwDBCustomEdit.Change;
begin
if not (csLoading in ComponentState) then
begin
if (DataLink<>Nil) and (DataLink.Field=Nil) then SetModified(True); {1/21/97 - Only set if unbound }
if SetModifiedInChangeEvent then Modified:= True;
// 1/13/03 - Recognize text assignments and go into edit mode
if (DataLink<>Nil) and (FDataLink.Field<>nil) and
(DataSource.state in [dsEdit, dsInsert]) then
begin
SetModified(True);
end
end;
inherited Change;
end;
function TwwDBCustomEdit.GetDataSource: TDataSource;
begin
if (FDataLink<>Nil) and (FDataLink.DataSource is TDataSource) then begin
Result := FDataLink.DataSource as TDataSource
end
else Result:= Nil;
end;
procedure TwwDBCustomEdit.SetDataSource(Value: TDataSource);
begin
if (Value<>FDataLink.DataSource) and (Value<>nil) then
inherited ReadOnly:= True; { 7/8/98 - Uncomment with further testing or IP 5}
FDataLink.DataSource := Value;
end;
function TwwDBCustomEdit.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;
procedure TwwDBCustomEdit.SetDataField(const Value: string);
begin
if not (csDesigning in ComponentState) then
ResetMaxLength(Self);
FDataLink.FieldName := Value;
end;
function TwwDBCustomEdit.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
procedure TwwDBCustomEdit.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
if ((Value=False) or (FDataLink.DataSet=nil)) and not (csLoading in ComponentState) then
inherited ReadOnly := Value;
end;
function TwwDBCustomEdit.GetField: TField;
begin
Result := FDataLink.Field;
end;
procedure TwwDBCustomEdit.DataChange(Sender: TObject);
begin
if FDataLink.Field <> nil then
begin
if FAlignment <> FDataLink.Field.Alignment then
begin
EditText := ''; {forces update}
FAlignment := FDataLink.Field.Alignment;
end;
if not HavePictureMask then EditMask:= FDataLink.Field.EditMask;
{ 12/24/97 - Retrieve maxlength from field }
if not (csDesigning in ComponentState) then
begin
if (FDataLink.Field.DataType in [ftString,ftWideString]) and (MaxLength = 0) then
MaxLength := FDataLink.Field.Size;
end;
if (FFocused or isMemoField) and FDataLink.CanModify then
begin
{$ifdef win32}
if isMemoField then { 12/20/96 - Retrieve memo field contents }
Text := FDataLink.Field.asString
else
{$endif}
Text := FDataLink.Field.Text
end
else begin
if isMemoField then { 1/10/2000 Readonly memo fields not displaying }
Text := FDataLink.Field.asString
else EditText := FDataLink.Field.DisplayText;
end
end else
begin
FAlignment := taLeftJustify;
EditMask := '';
if csDesigning in ComponentState then
EditText := Name else
EditText := '';
end;
end;
procedure TwwDBCustomEdit.EditingChange(Sender: TObject);
begin
inherited ReadOnly := not FDataLink.Editing;
end;
procedure TwwDBCustomEdit.UpdateData(Sender: TObject);
var FOnInvalidValue: TwwInvalidValueEvent;
NewDate, NewTime: TDateTime;
TempEpochYear: integer;
FloatValue: Extended;
begin
if inherited ReadOnly then exit;
{ 9/14/99 - Don't refer to ValidateWithMask flag here as that flag
should only be used when positing. Also use check Text value intead
of internally stored value. }
if (regexmask.mask<>'') then
begin
if not RegexMatch(regexmask.mask, not regexmask.CaseSensitive, Text) then
begin
ValidationErrorUsingMask(regexMask.ErrorMessage);
//ValidationErrorUsingMask(FDatalink.Field)
end;
end
else if (FwwPicture.PictureMask<>'') then
begin
if not isValidPictureValue(Text) then begin
DoRefreshValidationDisplay(false);
// DoOnCheckValue(false);
FOnInvalidValue := wwGetOnInvalidValue(FDataLink.DataSet);
if Assigned(FOnInvalidValue) then
begin
FOnInvalidValue(FDataLink.DataSet, FDataLink.Field)
end
else ValidationErrorUsingMask('')
// else ValidationErrorUsingMask(FDatalink.Field)
end
else
DoRefreshValidationDisplay(true);// DoOnCheckValue(true);
end
else begin
if not JustHaveLiteralTemplate then ValidateEdit;
end;
if modified then begin
if isMemoField then
FDataLink.Field.asString := GetStoredText { 12/20/96 - Save to memo field }
else if FDataLink.editing or wwisNonPhysicalField(FDataLink.Field) then {7/4/97}
begin
if GetStoredText='' then
FDataLink.Field.Text:= GetStoredText
else if (FDataLink.Field is TDateTimeField) and
wwStrToDate(GetStoredText) then { 9/2/98 - Call wwStrToDate instead }
begin
{ 12/16/98 -
Uses 1950 as Epoch Date for 2 digt years, Only for Delphi 4 so-as to
preserve backward package compatibility. }
{$ifdef wwDelphi4Up}
if FEpochYear=0 then TempEpochYear:= 1950
else TempEpochYear:= EpochYear;
if wwScanDateEpoch(GetStoredText, NewDate, TempEpochYear) then
{$else}
if wwScanDate(GetStoredText, NewDate) then
{$endif}
begin
NewTime:= Frac(StrToDateTime(GetStoredText));
TDateTimeField(FDataLink.Field).asDateTime:= NewDate + NewTime;
end
end
else begin
if JustHaveLiteralTemplate then
FDataLink.Field.Clear //Text := ''
else if (FDataLink.Field is TNumericField) and (GetDisplayFormat<>'') then
// (TNumericField(FDataLink.Field).DisplayFormat<>'') then
begin
if wwStrToFloat2(Text, FloatValue, GetDisplayFormat) then
begin
if (FDataLink.Field is TFloatField) or
{$ifdef wwDelphi6Up}
(FDataLink.Field is TFmtBCDField) or
{$endif}
(FDataLink.Field is TBCDField) then
FDataLink.Field.asFloat:= FloatValue
else begin
FDataLink.Field.asInteger:= Round(FloatValue)
end
end
end
else
FDataLink.Field.Text := GetStoredText; {3/12/97- Only update if edit mode}
end
end
end
end;
Function TwwDBCustomEdit.GetStoredText: string;
begin
result:= Text;
end;
{ Return displaytext for field - Used by TwwDBGrid}
Function TwwDBCustomEdit.GetFieldMapText(StoreValue: string; var res: string): boolean;
begin
result:= False;
end;
procedure TwwDBCustomEdit.WMPaste(var Message: TMessage);
var prevText: string;
prevSelStart: integer;
sClpBrd: String;
iPos: Integer;
ClipBoardTextAdjusted: boolean;
begin
PrevText:= Text;
PrevSelStart:= selStart; { 11/26/96 - save previous selStart for use later }
if (DataSource=nil) then begin {9/11/96 }
if not ReadOnly then ReadOnly:= False
else exit;
end;
if PreventEdit then exit;
// 2003-03-25 -
// When carriage return is present in the clipboard with borderstyle=bsnone, the control cannot
// paste. So we instead paste up to the first carriage return. If WordWrap is enabled
// it will work so don't do workaround code in this case
ClipboardTextAdjusted:= False;
if (BorderStyle = bsNone) and (not WordWrap) and (PasswordChar = #0) then
begin
Clipboard.Open;
try
sClpBrd := Clipboard.AsText;
iPos := Pos(#13, Clipboard.AsText);
if iPos > 0 then
begin
Clipboard.AsText := Copy(Clipboard.AsText, 1, iPos-1);
ClipboardTextAdjusted:= True;
end;
finally
Clipboard.Close;
end
end;
EnableEdit;
inherited;
SetModified(True);
// 2003-03-25
if ClipBoardTextAdjusted then
if Clipboard.AsText <> sClpBrd then Clipboard.AsText := sClpBrd;
{ 9/11/96 }
ApplyMask;
{ Incorrect Kludge - Override Delphi strange behavior of not moving selStart if previous selStart=0}
if (selStart=0) then selStart:= prevSelStart + length(Text) - length(PrevText);
DoRefreshValidationDisplay;
end;
{ 5/18/00 - Need to save changes in undo mode }
procedure TWWDBCustomEdit.WMUndo(var Message: TMessage);
begin
if PreventEdit then exit;
EnableEdit;
inherited;
SetModified(True);
end;
procedure TwwDBCustomEdit.WMCut(var Message: TMessage);
begin
if PreventEdit then exit;
EnableEdit;
inherited;
SetModified(True);
DoRefreshValidationDisplay;
end;
procedure TwwDBCustomEdit.CMEnter(var Message: TCMEnter);
var exStyle, origStyle: longint;
// r: TRect;
begin
SetEditRect;
SetFocused(True);
if AutoSelect and not (csLButtonDown in ControlState) then
begin
SelectAll;
end;
inherited;
if not Editable then Invalidate;
if IsTransparentEffective then begin
Frame.CreateTransparent:= False;
OrigStyle:= Windows.GetWindowLong(handle, GWL_EXSTYLE);
exStyle:= OrigStyle and not WS_EX_TRANSPARENT;
Windows.SetWindowLong(handle, GWL_EXSTYLE, exStyle);
invalidate;
end;
if Frame.enabled then invalidate; { See if this causes any flicker }
end;
procedure TwwDBCustomEdit.UpdateRecord;
var lastModified: boolean;
begin
lastModified:= modified;
try
FDataLink.UpdateRecord;
except
SelectAll;
SetFocus;
modified:= lastModified;
raise;
end;
end;
procedure TwwDBCustomEdit.SetUnboundValue(Value: Double);
begin
if (FDataLink.Field =nil) and (GetDisplayFormat<>'') then
begin
Text := FormatFloat(GetDisplayFormat, Value);
end;
end;
function TwwDBCustomEdit.GetUnboundValue: Double;
var FloatValue: Extended;
begin
result:= 0;
if (FDataLink.Field =nil) and (GetDisplayFormat<>'') then
begin
if wwStrToFloat2(Text, FloatValue, GetDisplayFormat) then
begin
result:= FloatValue;
end
end;
end;
procedure TwwDBCustomEdit.CMExit(var Message: TCMExit);
var
FloatValue: Extended;
begin
UpdateRecord;
DoExit;
if not DoExitPictureError then begin
SetFocused(False); { Only call SetFocused(False) if no validation error }
SetCursor(0);
end;
// 5/7/03
if (FDataLink.Field =nil) and (GetDisplayFormat<>'') then
begin
if wwStrToFloat2(Text, FloatValue, GetDisplayFormat) then
begin
Text := FormatFloat(GetDisplayFormat, FloatValue);
end
end;
if not Editable then Invalidate;
if IsTransparentEffective then begin
Frame.CreateTransparent:= True;
RecreateWnd;
end;
if Frame.enabled then begin
invalidate; { See if this causes any flicker }
wwInvalidateTransparentArea(self,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -