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.

Reply via email to