This patch fixes spin edit control, and removes TQtWinControl.SetText
/ GetText. GetText and SetText is implemented on the edit control
instead.
with this patch you can remove qtmemostrings.inc and add qtobjects.pas
thanks,
--
Felipe Monteiro de Carvalho
Index: lcl/interfaces/qt/qtwscontrols.pp
===================================================================
--- lcl/interfaces/qt/qtwscontrols.pp (revisão 9257)
+++ lcl/interfaces/qt/qtwscontrols.pp (cópia de trabalho)
@@ -70,8 +70,8 @@
class procedure SetSize(const AWinControl: TWinControl; const AWidth, AHeight: Integer); override;
class procedure ShowHide(const AWinControl: TWinControl); override; //TODO: rename to SetVisible(control, visible)
- class function GetText(const AWinControl: TWinControl; var AText: String): Boolean; override;
- class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
+// class function GetText(const AWinControl: TWinControl; var AText: String): Boolean; override;
+// class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
{ class procedure AddControl(const AControl: TControl); override;
class procedure SetBorderStyle(const AWinControl: TWinControl; const ABorderStyle: TBorderStyle); override;
@@ -242,42 +242,6 @@
{$endif}
end;
-class function TQtWSWinControl.GetText(const AWinControl: TWinControl; var AText: String): Boolean;
-var
- AString: WideString;
-begin
- Result := True;
- if AWinControl = nil then exit;
-
- if not AWinControl.HandleAllocated then exit;
- case AWinControl.fCompStyle of
- //csComboBox:
- csEdit,csSpinedit:
- QLineEdit_text(QLineEditH(TQtWidget(AWinControl.Handle).Widget),@AString);
- csMemo:
- QTextEdit_toPlainText(QTextEditH(TQtWidget(AWinControl.Handle).Widget),@AString);
- else
- Result := false;
- end;
- if Result then AText := AString;
-end;
-
-class procedure TQtWSWinControl.SetText(const AWinControl: TWinControl; const AText: string);
-var
- AString: WideString;
-begin
- if AWinControl = nil then exit;
- if not AWinControl.HandleAllocated then exit;
- AString := AText;
- case AWinControl.fCompStyle of
- csEdit,csSpinedit:
- QLineEdit_setText(QLineEditH(TQtWidget(AWinControl.Handle).Widget),@AString);
- //csStaticText:
- csMemo:
- QTextEdit_append(QTextEditH(TQtWidget(AWinControl.Handle).Widget),@AString);
- end;
-end;
-
initialization
////////////////////////////////////////////////////
@@ -293,4 +257,4 @@
// RegisterWSComponent(TCustomControl, TQtWSCustomControl);
// RegisterWSComponent(TImageList, TQtWSImageList);
////////////////////////////////////////////////////
-end.
\ No newline at end of file
+end.
Index: lcl/interfaces/qt/qtwsstdctrls.pp
===================================================================
--- lcl/interfaces/qt/qtwsstdctrls.pp (revisão 9257)
+++ lcl/interfaces/qt/qtwsstdctrls.pp (cópia de trabalho)
@@ -34,7 +34,7 @@
// uncomment only when needed for registration
////////////////////////////////////////////////////
Classes, StdCtrls, Controls, Graphics, Forms, SysUtils,
- InterfaceBase, qt4, qtprivate,
+ InterfaceBase, qt4, qtprivate, qtobjects,
////////////////////////////////////////////////////
WSStdCtrls, WSLCLClasses, LCLType;
@@ -129,6 +129,8 @@
const AParams: TCreateParams): HWND; override;
class procedure DestroyHandle(const AWinControl: TWinControl); override;
public
+ class function GetText(const AWinControl: TWinControl; var AText: String): Boolean; override;
+ class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
{ class function GetSelStart(const ACustomEdit: TCustomEdit): integer; override;
class function GetSelLength(const ACustomEdit: TCustomEdit): integer; override;
@@ -159,6 +161,8 @@
// class procedure SetScrollbars(const ACustomMemo: TCustomMemo; const NewScrollbars: TScrollStyle); virtual;
class procedure SetWordWrap(const ACustomMemo: TCustomMemo; const NewWordWrap: boolean); override;
public
+ class function GetText(const AWinControl: TWinControl; var AText: String): Boolean; override;
+ class procedure SetText(const AWinControl: TWinControl; const AText: string); override;
{ class function GetSelStart(const ACustomEdit: TCustomEdit): integer; override;
class function GetSelLength(const ACustomEdit: TCustomEdit): integer; override;
@@ -278,16 +282,11 @@
public
end;
-{$DEFINE MEMOHEADER}
-{$I qtmemostrings.inc}
-{$UNDEF MEMOHEADER}
implementation
uses LMessages;
-{$I qtmemostrings.inc}
-
{ TQtWSCustomMemo }
{------------------------------------------------------------------------------
@@ -364,6 +363,36 @@
end;
{------------------------------------------------------------------------------
+ Method: TQtWSCustomMemo.GetText
+ Params:
+ Returns: Nothing
+ ------------------------------------------------------------------------------}
+class function TQtWSCustomMemo.GetText(const AWinControl: TWinControl; var AText: String): Boolean;
+var
+ Str: WideString;
+begin
+ QTextEdit_toPlainText(QTextEditH(TQtWidget(AWinControl.Handle).Widget), @Str);
+
+ AText := String(Str);
+
+ Result := True;
+end;
+
+{------------------------------------------------------------------------------
+ Method: TQtWSCustomMemo.SetText
+ Params:
+ Returns: Nothing
+ ------------------------------------------------------------------------------}
+class procedure TQtWSCustomMemo.SetText(const AWinControl: TWinControl; const AText: string);
+var
+ AString: WideString;
+begin
+ AString := WideString(AText);
+
+ QTextEdit_append(QTextEditH(TQtWidget(AWinControl.Handle).Widget), @AString);
+end;
+
+{------------------------------------------------------------------------------
Method: TQtWSCustomMemo.SetReadOnly
Params: NewReadOnly boolean
Returns: Nothing
@@ -376,7 +405,7 @@
QTextEdit_setReadOnly(TextEditH,NewReadOnly);
end;
-{{ TQtWSCustomEdit }
+{ TQtWSCustomEdit }
{------------------------------------------------------------------------------
Method: TQtWSCustomEdit.CreateHandle
@@ -403,6 +432,36 @@
TQtLineEdit(AWinControl.Handle).Free;
end;
+{------------------------------------------------------------------------------
+ Method: TQtWSCustomEdit.GetText
+ Params: None
+ Returns: Nothing
+ ------------------------------------------------------------------------------}
+class function TQtWSCustomEdit.GetText(const AWinControl: TWinControl; var AText: String): Boolean;
+var
+ Str: WideString;
+begin
+ QLineEdit_text(QLineEditH(TQtWidget(AWinControl.Handle).Widget), @Str);
+
+ AText := String(Str);
+
+ Result := True;
+end;
+
+{------------------------------------------------------------------------------
+ Method: TQtWSCustomEdit.SetText
+ Params: None
+ Returns: Nothing
+ ------------------------------------------------------------------------------}
+class procedure TQtWSCustomEdit.SetText(const AWinControl: TWinControl; const AText: string);
+var
+ AString: WideString;
+begin
+ AString := WideString(AText);
+
+ QLineEdit_setText(QLineEditH(TQtWidget(AWinControl.Handle).Widget), @AString);
+end;
+
{ TQtWSStaticText }
{------------------------------------------------------------------------------
unit qtobjects;
{$mode delphi}{$H+}
interface
uses Classes, StdCtrls, Controls, Graphics, SysUtils, qt4;
type
{ TQtMemoStrings }
TQtMemoStrings = class(TStrings)
private
FTextChanged: Boolean; // StringList and QtTextEdit out of sync
FStringList: TStringList; // Holds the lines to show
FQtTextEdit: QTextEditH; // Qt Widget
FOwner: TWinControl; // Lazarus Control Owning MemoStrings
FUpdating: Boolean; // We're changing Qt Widget
procedure InternalUpdate;
procedure ExternalUpdate(var Astr: WideString; Clear: Boolean = True);
protected
function GetTextStr: string; override;
function GetCount: integer; override;
function Get(Index : Integer) : string; override;
//procedure SetSorted(Val : boolean); virtual;
public
constructor Create(TextEdit : QTextEditH; TheOwner: TWinControl);
destructor Destroy; override;
procedure Assign(Source : TPersistent); override;
procedure Clear; override;
procedure Delete(Index : integer); override;
procedure Insert(Index : integer; const S: string); override;
procedure SetText(TheText: PChar); override;
//procedure Sort; virtual;
public
//property Sorted: boolean read FSorted write SetSorted;
property Owner: TWinControl read FOwner;
function TextChangedHandler(Sender: QObjectH; Event: QEventH): Boolean; cdecl;
end;
Implementation
uses qtprivate, LMessages;
{------------------------------------------------------------------------------
DelphiOnChange sets Delphi compatibility for OnChange event:
If defined, OnChange is generated whenever there's a change
If undefined, OnChange is generated if change is caused by user action
------------------------------------------------------------------------------}
{$define DelphiOnChange}
{------------------------------------------------------------------------------
Method: TQtMemoStrings.InternalUpdate
Params: None
Returns: Nothing
Updates internal StringList from Qt Widget
------------------------------------------------------------------------------}
Procedure TQtMemoStrings.InternalUpdate;
var
Astr: WideString;
begin
QTextEdit_toPlainText(FQtTextEdit,@Astr); // get the memo content
FStringList.Text := Astr;
FTextChanged := False;
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.ExternalUpdate
Params: Astr: Text for Qt Widget; Clear: if we must clear first
Returns: Nothing
Updates Qt Widget from text - If DelphiOnChange, generates OnChange Event
------------------------------------------------------------------------------}
procedure TQtMemoStrings.ExternalUpdate(var Astr: WideString; Clear: Boolean = True);
{$ifdef DelphiOnChange}
var
Mess: TLMessage;
{$endif}
begin
FUpdating := True;
if Clear then
QTextEdit_clear(FQtTextEdit);
QTextEdit_append(FQtTextEdit,@Astr);
FUpdating := False;
{$ifdef DelphiOnChange}
FillChar(Mess, SizeOf(Mess), #0);
Mess.Msg := CM_TEXTCHANGED;
FOwner.Dispatch(TLMessage(Mess));
{$endif}
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.GetTextStr
Params: None
Returns: a string
Return the whole StringList content as a single string
------------------------------------------------------------------------------}
function TQtMemoStrings.GetTextStr: string;
begin
if FTextChanged then InternalUpdate;
Result := FStringList.Text;
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.GetCount
Params: None
Returns: an integer
Return the current number of strings
------------------------------------------------------------------------------}
function TQtMemoStrings.GetCount: integer;
begin
if FTextChanged then InternalUpdate;
Result := FStringList.Count;
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.GetCount
Params: String Index
Returns: a string
Return the string[Index], or an empty string of out of bounds.
------------------------------------------------------------------------------}
function TQtMemoStrings.Get(Index: Integer): string;
begin
if FTextChanged then InternalUpdate;
if Index < FStringList.Count then
Result := FStringList.Strings[Index]
else Result := '';
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.Create
Params: Qt Widget Handle and Lazarus WinControl Parent Object
Returns: Nothing
Contructor for the class.
------------------------------------------------------------------------------}
constructor TQtMemoStrings.Create(TextEdit: QTextEditH;
TheOwner: TWinControl);
var
Method: TMethod;
Hook : QTextEdit_hookH;
Astr: WideString;
begin
inherited Create;
{$ifdef VerboseQt}
if TextEdit = nil then WriteLn(
'TQtMemoStrings.Create Unspecified TextEdit widget');
if TheOwner = nil then WriteLn(
'TQtMemoStrings.Create Unspecified owner');
{$endif}
FStringList := TStringList.Create;
FQtTextEdit := TextEdit;
QTextEdit_toPlainText(TextEdit,@Astr); // get the memo content
FStringList.Text := Astr;
FOwner:=TheOwner;
// Callback Event
{Method := MemoChanged;}
TEventFilterMethod(Method) := TextChangedHandler;
Hook := QTextEdit_hook_create(FQtTextEdit);
QTextEdit_hook_hook_textChanged(Hook,Method);
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.Destroy
Params: None
Returns: Nothing
Destructor for the class.
------------------------------------------------------------------------------}
destructor TQtMemoStrings.Destroy;
begin
// don't destroy the widgets
inherited Destroy;
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.TextChangedHandler
Params: None
Returns: Nothing
Signal handler for the TextChanged Signal.
------------------------------------------------------------------------------}
function TQtMemoStrings.TextChangedHandler(Sender: QObjectH; Event: QEventH): Boolean; cdecl;
var
Mess: TLMessage;
// just for debugging
SenderView: QObjectH;
EventView: QEventH;
begin
if not FUpdating then begin
SenderView := Sender;
EventView := Event;
FTextChanged := True;
FillChar(Mess, SizeOf(Mess), #0);
Mess.Msg := CM_TEXTCHANGED;
FOwner.Dispatch(TLMessage(Mess));
end;
Result := False;
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.Assign
Params: None
Returns: Nothing
Assigns from a TStrings.
------------------------------------------------------------------------------}
procedure TQtMemoStrings.Assign(Source: TPersistent);
var
Astr: WideString;
{$ifdef DelphiOnChange}
Mess: TLMessage;
{$endif}
begin
if (Source=Self) or (Source=nil) then exit;
if Source is TStrings then begin
FStringList.Clear;
FStringList.Text := TStrings(Source).Text;
Astr := FStringList.Text;
ExternalUpdate(Astr,True);
FTextChanged := False;
{$ifdef DelphiOnChange}
FillChar(Mess, SizeOf(Mess), #0);
Mess.Msg := CM_TEXTCHANGED;
FOwner.Dispatch(TLMessage(Mess));
{$endif}
exit;
end;
Inherited Assign(Source);
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.Clear
Params: None
Returns: Nothing
Clears all.
------------------------------------------------------------------------------}
procedure TQtMemoStrings.Clear;
{$ifdef DelphiOnChange}
var
Mess: TLMessage;
{$endif}
begin
FUpdating := True;
FStringList.Clear;
QTextEdit_clear(FQtTextEdit);
FTextChanged := False;
FUpdating := False;
{$ifdef DelphiOnChange}
FillChar(Mess, SizeOf(Mess), #0);
Mess.Msg := CM_TEXTCHANGED;
FOwner.Dispatch(TLMessage(Mess));
{$endif}
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.Delete
Params: Index
Returns: Nothing
Deletes line at Index.
------------------------------------------------------------------------------}
procedure TQtMemoStrings.Delete(Index: integer);
var
Astr: WideString;
begin
if FTextChanged then InternalUpdate;
if Index < FStringList.Count then begin
FStringList.Delete(Index);
Astr := FStringList.Text;
ExternalUpdate(AStr,True);
FTextChanged := False;
end;
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.Delete
Params: Index, string
Returns: Nothing
Inserts line at Index.
------------------------------------------------------------------------------}
procedure TQtMemoStrings.Insert(Index: integer; const S: string);
var
Astr: WideString;
begin
if FTextChanged then InternalUpdate;
if Index < 0 then Index := 0;
if Index <= FStringList.Count then begin
FStringList.Insert(Index,S);
Astr := FStringList.Text;
ExternalUpdate(Astr,True);
FTextChanged := False;
end;
end;
{------------------------------------------------------------------------------
Method: TQtMemoStrings.SetText
Params: A null terminated string
Returns: Nothing
Fills the memo with the string
------------------------------------------------------------------------------}
procedure TQtMemoStrings.SetText(TheText: PChar);
Var
str: String;
Astr: WideString;
begin
str := StrPas(TheText);
FStringList.Text := str;
AStr := Str;
ExternalUpdate(Astr,True);
FTextChanged := False;
end;
end.