domingo, 25 de agosto de 2013

Delphi XE4 iOS com DataSnap




Esta vídeo aula tem como objetivo ensinar como criar um projeto FireMonkey iOS utilizando uma conexão DataSnap com Oracle.

É mostrado como criar o servidor e como se conectar, alguns padrões de interface, utilização do GestureManager para atualização do ClientDataSet, deletar registros de um ListView e fazer o Update, mudar o visual de componentes em tempo de execução e etc... Espero que gostem, qualquer coisa estou a disposição. Abraços em bons estudos.

Eu não mostrei no vídeo, mas segue a forma de fazer com que o teclado virtual do iPhone não sobrescreva os edits.

Primeiro, dentro do tabitem que tem os edits, insira o componente: TVertScrollBox, em seguinda, dentro deste componente, insira o TLayout e de nome de: MainLayout1. Segundo, declare no uses a biblioteca System.Math.

Agora na seção private declare as seguintes variáveis e os seguintes métodos:
  private
    FKBBounds: TRectF;
    FNeedOffset: Boolean;

    procedure CalcContentBoundsProc(Sender: TObject; var ContentBounds: TRectF);
    procedure RestorePosition;
    procedure UpdateKBBounds;
Precione Ctrl + C para que o Delphi crie os métodos.


No procedimento CalcContentBoundsProc insira o seguinte código:
procedure TfrmPrincipal.CalcContentBoundsProc(Sender: TObject;
  var ContentBounds: TRectF);
begin
  if FNeedOffset and (FKBBounds.Top > 0) then
  begin
    ContentBounds.Bottom := Max(ContentBounds.Bottom,
                                2 * ClientHeight - FKBBounds.Top);
  end;
end;
No procedimento RestorePosition insira o seguinte código:
procedure TfrmPrincipal.RestorePosition;
begin
  VertScrollBox1.ViewportPosition := PointF(VertScrollBox1.ViewportPosition.X, 0);
  MainLayout1.Align := TAlignLayout.alClient;
  VertScrollBox1.RealignContent;
end;
No procedimento UpdateKBBounds insira o seguinte código:
procedure TfrmPrincipal.UpdateKBBounds;
var
  LFocused : TControl;
  LFocusRect: TRectF;
begin
  FNeedOffset := False;
  if Assigned(Focused) then
  begin
    LFocused := TControl(Focused.GetObject);
    LFocusRect := LFocused.AbsoluteRect;
    LFocusRect.Offset(VertScrollBox1.ViewportPosition);
    if (LFocusRect.IntersectsWith(TRectF.Create(FKBBounds))) and
       (LFocusRect.Bottom > FKBBounds.Top) then
    begin
      FNeedOffset := True;
      MainLayout1.Align := TAlignLayout.alHorizontal;
      VertScrollBox1.RealignContent;
      Application.ProcessMessages;
      VertScrollBox1.ViewportPosition :=
        PointF(VertScrollBox1.ViewportPosition.X,
               LFocusRect.Bottom - FKBBounds.Top);
    end;
  end;
  if not FNeedOffset then
    RestorePosition;
end;
No envento OnCreate do form insira o seguinte código:
procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
  VertScrollBox1.OnCalcContentBounds := CalcContentBoundsProc;
end;
No evento OnFocusChanged insira o seguinte código:
procedure TfrmPrincipal.FormFocusChanged(Sender: TObject);
begin
  UpdateKBBounds;
end;
No evento OnVirtualKeyboardHidden insira o seguinte código:
procedure TfrmPrincipal.FormVirtualKeyboardHidden(Sender: TObject;
  KeyboardVisible: Boolean; const Bounds: TRect);
begin
  FKBBounds.Create(0, 0, 0, 0);
  FNeedOffset := False;
  RestorePosition;
end;
E por fim, no evento OnVirtualKeyboardShown insira o seguinte código:
procedure TfrmPrincipal.FormVirtualKeyboardShown(Sender: TObject;
  KeyboardVisible: Boolean; const Bounds: TRect);
begin
  FKBBounds := TRectF.Create(Bounds);
  FKBBounds.TopLeft := ScreenToClient(FKBBounds.TopLeft);
  FKBBounds.BottomRight := ScreenToClient(FKBBounds.BottomRight);
  UpdateKBBounds;
end;

E é isso aí pessoal, boa sorte, qualquer dúvida ou sugestão basta comentar... Abraços.

9 comentários:

  1. Respostas
    1. Por sorte ainda tenho, eu geralmente apago rsrs...
      Se quiser me mande seu email que eu mando uma cópia zipada pra vc. Abraços.

      Excluir
  2. Olá vc pode enviar os fontes para esse e-mail: weslley-live@hotmail.com

    ResponderExcluir
    Respostas
    1. Desculpa, não tenho mais os fontes dessa vídeo aula, eu apaguei assim que fiz o vídeo... Tenho os fontes do delphi XE5, pode acessar aqui a baixar...

      Abraços.

      Excluir
  3. Primeiro projetinho com sqlite interno e o sincronismo vai para um banco firebird com datasnap,funciona legal.
    http://www.youtube.com/watch?v=cED9ZvUKOps

    ResponderExcluir
  4. Pode por favor me mandar os fontes para - gustavoinfomax@yahoo.com.br Obrigado

    ResponderExcluir
    Respostas
    1. Desculpa, não tenho mais os fontes dessa vídeo aula, eu apaguei assim que fiz o vídeo... Tenho os fontes do delphi XE5, pode acessar aqui a baixar...

      Abraços.

      Excluir
  5. Boa tarde, primeiramente parabéns pelo blog!
    Seguindo seu exemplo, me deparei com a seguinte msg de erro:

    "[dcc32 Error] ULogin.pas(157): E2010 Incompatible types: 'TPoint' and 'TPointF'"

    Código que coloquei no FormVirtualKeyboardShown

    Oq seria esse erro? Utilizo Delphi 10 Seatle.

    Obrigado desde já.

    ResponderExcluir
  6. Podes me enviar o fonte: rafaeljeremias@gmail.com

    ResponderExcluir