diff --git a/lcl/customdrawn_common.pas b/lcl/customdrawn_common.pas index 06275169b5..03defdafb9 100644 --- a/lcl/customdrawn_common.pas +++ b/lcl/customdrawn_common.pas @@ -794,7 +794,8 @@ var begin if not AStateEx.CaretIsVisible then Exit; - lControlText := AStateEx.Lines.Strings[AStateEx.CaretPos.Y]; + if AStateEx.Lines.Count = 0 then lControlText := '' + else lControlText := AStateEx.Lines.Strings[AStateEx.CaretPos.Y]; lCaptionHeight := GetMeasuresEx(ADest, TCDCONTROL_CAPTION_HEIGHT, AState, AStateEx); lTextBottomSpacing := GetMeasures(TCDEDIT_BOTTOM_TEXT_SPACING); lTextTopSpacing := GetMeasures(TCDEDIT_TOP_TEXT_SPACING); diff --git a/lcl/customdrawncontrols.pas b/lcl/customdrawncontrols.pas index 1a3e3fb0d9..0e52360e21 100644 --- a/lcl/customdrawncontrols.pas +++ b/lcl/customdrawncontrols.pas @@ -1496,6 +1496,7 @@ begin // Impose limits in the caret too FEditState.CaretPos.X := Min(FEditState.CaretPos.X, UTF8Length(lLineText)); FEditState.CaretPos.Y := Min(FEditState.CaretPos.Y, FEditState.Lines.Count-1); + FEditState.CaretPos.Y := Max(FEditState.CaretPos.Y, 0); end; // Result.X -> returns a zero-based position of the caret @@ -1516,6 +1517,7 @@ begin if Result.Y < 0 then begin Result.X := 1; + Result.Y := 0; Exit; end; @@ -1903,12 +1905,22 @@ end; function TCDEdit.GetCurrentLine: string; begin - Result := FLines.Strings[FEditState.CaretPos.Y]; + if (FEditState.Lines.Count = 0) or (FEditState.CaretPos.Y >= FEditState.Lines.Count) then + Result := '' + else Result := FLines.Strings[FEditState.CaretPos.Y]; end; procedure TCDEdit.SetCurrentLine(AStr: string); begin - FLines.Strings[FEditState.CaretPos.Y] := AStr; + if (FEditState.Lines.Count = 0) or (FEditState.CaretPos.Y >= FEditState.Lines.Count) then + begin + FEditState.Lines.Text := AStr; + FEditState.VisibleTextStart.X := 1; + FEditState.VisibleTextStart.Y := 0; + FEditState.CaretPos.X := 0; + FEditState.CaretPos.Y := 0; + end + else FLines.Strings[FEditState.CaretPos.Y] := AStr; end; { TCDCheckBox } diff --git a/lcl/interfaces/customdrawn/customdrawnwsfactory.pas b/lcl/interfaces/customdrawn/customdrawnwsfactory.pas index bbcda70d34..f6d36700a3 100644 --- a/lcl/interfaces/customdrawn/customdrawnwsfactory.pas +++ b/lcl/interfaces/customdrawn/customdrawnwsfactory.pas @@ -297,8 +297,8 @@ end; function RegisterCustomMemo: Boolean; alias : 'WSRegisterCustomMemo'; begin -// RegisterWSComponent(TCustomMemo, TWinCEWSCustomMemo); - Result := False; + RegisterWSComponent(TCustomMemo, TCDWSCustomMemo); + Result := True; end; function RegisterButtonControl: Boolean; alias : 'WSRegisterButtonControl'; diff --git a/lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas b/lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas index 978bd9f2e6..9e3932c951 100644 --- a/lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas +++ b/lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas @@ -212,16 +212,23 @@ type { TCDWSCustomMemo } TCDWSCustomMemo = class(TWSCustomMemo) + public + class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl); published -{ class function CreateHandle(const AWinControl: TWinControl; + // TWSWinControl + class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; override; + class procedure DestroyHandle(const AWinControl: TWinControl); override; + class procedure AppendText(const ACustomMemo: TCustomMemo; const AText: string); override; class function GetStrings(const ACustomMemo: TCustomMemo): TStrings; override; - class procedure SetAlignment(const ACustomEdit: TCustomEdit; const AAlignment: TAlignment); override; + class procedure FreeStrings(var AStrings: TStrings); override; +{ class procedure SetAlignment(const ACustomEdit: TCustomEdit; const AAlignment: TAlignment); override; class procedure SetScrollbars(const ACustomMemo: TCustomMemo; const NewScrollbars: TScrollStyle); override; class procedure SetWantReturns(const ACustomMemo: TCustomMemo; const NewWantReturns: boolean); override; class procedure SetWantTabs(const ACustomMemo: TCustomMemo; const NewWantTabs: boolean); override; class procedure SetWordWrap(const ACustomMemo: TCustomMemo; const NewWordWrap: boolean); override;} + class procedure ShowHide(const AWinControl: TWinControl); override; end; { TCDWSEdit } @@ -338,6 +345,62 @@ type implementation +{ TCDWSCustomMemo } + +class procedure TCDWSCustomMemo.InjectCDControl(const AWinControl: TWinControl; + var ACDControlField: TCDControl); +begin + TCDIntfEdit(ACDControlField).LCLControl := TCustomEdit(AWinControl); + TCDIntfEdit(ACDControlField).MultiLine := True; + ACDControlField.Caption := AWinControl.Caption; + ACDControlField.Parent := AWinControl; + ACDControlField.Align := alClient; +end; + +class function TCDWSCustomMemo.CreateHandle(const AWinControl: TWinControl; + const AParams: TCreateParams): HWND; +var + lCDWinControl: TCDWinControl; +begin + Result := TCDWSWinControl.CreateHandle(AWinControl, AParams); + lCDWinControl := TCDWinControl(Result); + lCDWinControl.CDControl := TCDIntfEdit.Create(AWinControl); +end; + +class procedure TCDWSCustomMemo.DestroyHandle(const AWinControl: TWinControl); +var + lCDWinControl: TCDWinControl; +begin + lCDWinControl := TCDWinControl(AWinControl.Handle); + lCDWinControl.CDControl.Free; + lCDWinControl.Free; +end; + +class procedure TCDWSCustomMemo.AppendText(const ACustomMemo: TCustomMemo; + const AText: string); +begin + +end; + +class function TCDWSCustomMemo.GetStrings(const ACustomMemo: TCustomMemo): TStrings; +var + lCDWinControl: TCDWinControl; +begin + lCDWinControl := TCDWinControl(ACustomMemo.Handle); + if lCDWinControl.CDControl = nil then Exit; + Result := TCDIntfEdit(lCDWinControl.CDControl).Lines; +end; + +class procedure TCDWSCustomMemo.FreeStrings(var AStrings: TStrings); +begin + // Don't free it in the WS! +end; + +class procedure TCDWSCustomMemo.ShowHide(const AWinControl: TWinControl); +begin + inherited ShowHide(AWinControl); +end; + { TCDWSScrollBar } class procedure TCDWSScrollBar.InjectCDControl(const AWinControl: TWinControl; @@ -1263,7 +1326,7 @@ begin Result := False; lCDWinControl := TCDWinControl(AWinControl.Handle); if lCDWinControl.CDControl = nil then Exit; - AText := TCDIntfEdit(lCDWinControl.CDControl).Text; + AText := TCDIntfEdit(lCDWinControl.CDControl).Lines.Text; //DebugLn('[TCDWSCustomEdit.GetText] AWinControl=' + AWinControl.Name + ' AText='+AText); Result := True; end; @@ -1275,7 +1338,7 @@ var begin lCDWinControl := TCDWinControl(AWinControl.Handle); if lCDWinControl.CDControl = nil then Exit; - TCDIntfEdit(lCDWinControl.CDControl).Text := AText; + TCDIntfEdit(lCDWinControl.CDControl).Lines.Text := AText; end; class procedure TCDWSCustomEdit.ShowHide(const AWinControl: TWinControl);