Ir para conteúdo
Fórum Script Brasil

Samuel Sewaybricker

Membros
  • Total de itens

    20
  • Registro em

  • Última visita

Posts postados por Samuel Sewaybricker

  1. Olá pessoal.

    Estou com a seguinte situação, tenho um ADOQuery e ClientDataSet linkados, tudo está certinho, o problema é que tem um campo blob e com o blobType igual a ftMemo.

    Este blob está ligado a um DBMemo, o problema ocorre quando vou dar o post do dataset, número Hex inválido, a solução para isso fiz uma função que converte o texto string do memo e converte para hexadecimal, com isso o fluxo segue normalmente. Contudo fiz um teste onde após o post eu retorno para a tela do registro e como a função converteu o meu texto do memo para hexa o memo mostra o value convertido rs.

    Analisei melhor e vi que tinha que fazer essa conversão antes do update final do registro, então no meu DataSetProvider eu utilizei o evento BeforeUpdateRecords, ai ficou "100%".

    Com apenas um campo blob ficou show, o problema atual que peço a ajuda de vocês é o seguinte, quando a query possui mais de um blob(3 por exemplo) quando chega na atribuição do valor convertido, eu não sei como e nem porque, o valor do último campo blob some, fica nulo! Isso que nem chegou nesse campo ainda para converter.

    Depurei todos passos do DBClient, DB, ADODB e nada.

    alguém já passou por isso ou sabe algo que possa iluminar??

    Segue o código do evento, note que não é feito nada de mais que possa interferir no valor do campo até que chegue a vez dele de converter:

    procedure TRDataSetProvider.CustomDataSetProviderBeforeUpdateRecord(
      Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
      UpdateKind: TUpdateKind; var Applied: Boolean);
    var
       i : integer;
    
       function IsConnectedToOracle(Source: TRADOQuery): Boolean;
       begin
         Result := (Pos('ORACLE', UpperCase(Source.Connection.Provider))>0);
       end;
    
    begin
      if (UpdateKind <> ukDelete) and IsConnectedToOracle(TRADOQuery(SourceDS)) then
      begin
         for i := 0 to DeltaDs.FieldCount - 1 do
         begin
            if (DeltaDs.Fields.Fields[i] is TBlobField) and
               (TBlobField(DeltaDs.Fields.Fields[i]).BlobType = ftMemo) then
            begin
               if DeltaDs.Fields.Fields[i].NewValue <> Unassigned then
               begin
                  DeltaDS.Edit;
                  DeltaDs.Fields.Fields[I].Value := StringToHexa(DeltaDS.Fields.Fields[I].Value);
                  DeltaDS.Post;
               end;
            end;
         end;
      end;
    end;
    
  2. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    tente

    MdiChild.BringToFront();

    MdiChild.Focus();

    abraço

    Obrigado pela resposta Jhonas, mas a dúvida em si não seria como trazer o form e sim como montar o evento do click, no entanto eu resolvi, segue os códigos:

    - Método do click do menu dinâmico:

    procedure TForm1.ClickButton(Sender: TObject);
    Var
      vForm : TForm;
      i,p: Integer;
    begin
      vForm := TForm(FindControl(HWnd(TMenuItem(Sender).Tag)));
      if vForm <> nil then
      begin
        vForm.BringToFront;
        vForm.WindowState := wsMaximized;
        //teste(TMenuItem(Sender));
      end;
    end;
    

    - Exibição dos menus de acordo com os forms abertos:

    procedure TForm1.ExibirMenu;
    var
      NewItem : TMenuItem;
      i,j,p : Integer;
    begin
      for i := 0 to self.MDIChildCount-1 do
      begin
        //Verificar se o menu já existe para não recria-lo
        for j:=0 to XPMainMenu1.Items[2].Count -1 do
        begin
          p := CompareStr(XPMainMenu1.Items[2].Items[j].Name, Self.MDIChildren[i].Name);
    
          if p = 0 then
            abort;
        end;
    
        XPMenu1.Active := False;
        NewItem := TMenuItem.create(XPMainMenu1);
        NewItem.Name := Self.MDIChildren[i].Name;
        NewItem.Caption := Self.MDIChildren[i].Caption;
        NewItem.Tag := Self.MDIChildren[i].Handle;
        NewItem.OnClick := ClickButton;
    
        XPMainMenu1.Items[2].Insert(XPMainMenu1.Items[2].Count, NewItem);
        XPMenu1.Active := True;
      end;
    
    end;
    
  3. Olá a todos, estou com seguinte situação, no meu sistema preciso usar o toolbar e relacionar o mainmenu nele, isso porque consigo alterar a posição do menu em tela (altop, albottom, etc), o meu formulario principal é um MDIForm e na propriedade WindowMenu está o menu no qual irá fazer o controle das telas abertas, porém não funciona, se eu tiro a referencia do menu no toolbar o mesmo volta a funcionar.

    Alguma sugestão? Já tentei 'fazer' esse controle dos formularios abertos dinamicamente, mas não sei como vou referenciar o evento OnClick para trazer o formulario para frente.

    Desde já agradeço.

  4. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    Jhonas obrigado pelas respostas, mas menu lateral também não posso adotar.

    Contudo eu consegui resolver minha situação, utilizei o componente TXPMenuBar e o TXPMenu(para dar um layout melhorzinho) e voltei a utilizar o TMainMenu.

    No XPMenuBar referencia o MainMenu, ai o mesmo carrega dentro da sua estrutura e nela é possivel alterar o posicionamento dele em tela.

    Obrigado pela paciência e respostas.

  5. Resolvi o problema, porém tratei de uma forma diferente.

    Ao invés de utilizar o componente TImage ou MDIImage utilizei o componente TMDIWallpaper, removi o TImage e nesse componente você linka a imagem e quando iniciado a aplicação a imagem carrega automaticamente.

    Um revés deste componente é que só pode ser linkado um Bitmap, e o tamanho de um arquivo bmp é alto e pode causar problemas de desempenho, para sanar isso reescrevi o código do componente trocando as instancias de TBitmap para TJPEGIMage e ajustando onde necessário.

    O tópico pode ser marcado como resolvido, qualquer dúvida quanto a implementação do JPG neste componente só avisar.

    Abraço.

  6. No meu projeto o form principal é fsMDIForm, e nele possuo um TImage AllClient contendo o logo do sistema, acima tenho uma barra de favoritos que é criada dinamicamente e que quando chega a quantidade limite cria um dropdown listando a quantidade que excedeu.

    O problema é quando clico nesse dropdown a imagem do fundo da uma piscada, já pesquisei e encontrei as soluções de Doublebuffer, setar para true a propriedade IncrementalDisplay do componente mas ambos sem sucesso.

    Alguma outra solução para resolver este problema?

    Abaixo imagem do dropdown, lembrando que o mesmo é gerado dinamicamente porém de forma automática quando chega no tamanho limite da barra de favoritos.

    https://uploaddeimagens.com.br/imagens/teste-jpg--271

  7. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    tente isso:

    va no Menu do delphi > Tools > Debugger Options...

    desmarque Integrated debugging

    compile e rode o programa

    com isso somente as mensagens do AppEvent é que serão mostradas

    abraço

    Obrigado pela resposta, mas não funcionou.

    Retire o que eu disse, OBRIGADO!!

    Resolvido

  8. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    tente isso:

    va no Menu do delphi > Tools > Debugger Options...

    desmarque Integrated debugging

    compile e rode o programa

    com isso somente as mensagens do AppEvent é que serão mostradas

    abraço

    Obrigado pela resposta, mas não funcionou.

  9. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    tire esse comando

    Msg.ShowModal;

    faça o teste e retorne o resultado

    Se eu retirar este comando a mensagem tratada não irá aparecer, somente o raise.

    O que estou tentando fazer é a situação contrária, não aparecer a mensagem do raise e sim a do AppEvent.

  10. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    faça um teste com esse código .... o erro gerado vai para um arquivo de log

    faça algumas alterações para o seu uso

    procedure TApres.ApplicationEvents1Exception(Sender: TObject;
      E: Exception);
      var
        NomeDoLog: string;
        Arquivo: TextFile;
      begin
        NomeDoLog := ChangeFileExt(Application.Exename, '.log');
        AssignFile(Arquivo, NomeDoLog);
    
        if FileExists(NomeDoLog) then
        Append(arquivo) { se existir, apenas adiciona linhas }
        else
          ReWrite(arquivo); { cria um novo se não existir }
        try
          WriteLn(arquivo, DateTimeToStr(Now) + ':' + E.Message);
          WriteLn(arquivo,'----------------------------------------------------------------------');
          Application.ShowException(E);
        finally
          CloseFile(arquivo)
        end;
    
    end;

    abraço

    Obrigado pela ajuda mas não é essa solução que preciso..

  11. procedure TMainForm.AppEvents1Exception(Sender: TObject; E: Exception);
    var
    Msg: TMensagemErroForm;
    begin
    try
    Msg := TMensagemErroForm.Create(Application);

    ERROFECH := False;
    {if E is EODBC then
    begin
    if (EODBC(E).Native = 0) and (EODBC(E).State = 'HY106')
    and (EODBC(E).RetCode=-1) then
    BEGIN
    ERROFECH := True;
    exit;
    END;
    end;}


    if E.ClassNameIs('Exception') then
    begin
    Msg.Mensagem0.Caption := E.Message;
    Msg.Mensagem1.Caption := '';
    Msg.Original.Lines.Clear;
    if(TABELATUR <> '') THEN
    Log_Sistema(MainForm.EmpresaFilial, TABELATUR, operacaotur, PEDTURNUM, MENSAGEMERRO, E.Message );
    Msg.ShowModal;
    end;
    finally
    Msg.Free;
    end;
    end;

  12. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    faça um teste

    tire o raise Exception.Create('Mensagem');

    e veja o que ocorre

    obs: siga a execução do código com o break point ( debugger )

    Mas como vou forçar o erro sem o raise? O AppEvents é acionado no onException, não sei se ajuda, mas estou convertendo o sistema de delphi4 para delphi7, no 4 não tenho esse problema.

  13. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    Dê um exemplo do erro e da mensagem de erro

    Por exemplo, no validate de um campo eu verifico se já existe o código que estou tentando inserir, caso viole esta regra eu dou um raise Exception.Create('Mensagem');

    Este raise vai para AppEvents onde é tratado e exibido em um modal, até ai tudo certo, o problema é que após o OK da mensagem a mesma é exibida novamente porém com o formato do raise.

    Segue imagens:

    Imagem do AppEvents

    https://uploaddeimagens.com.br/imagens/erro1-png--22

    Imagem do erro repitido

    https://uploaddeimagens.com.br/imagens/erro2-png--33

    Desde já agradeço.

  14. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    Olá Jhonas, tentei ambos possuem um menu muito bom, porém sem a propriedade Align :(((

    Help!

  15. Olá a todos.

    Estou desenvolvendo uma aplicação desktop e por questões de layout não pude utilizar o componente MainMenu, isso porque o mesmo não oferece a opção de alterar o seu Align no formulario(por default e sem poder alterar ele já fica alTop), como solução utilizo o ActionManager>ActionMenuBar.

    Até então tudo perfeito, o layout ficou dez, entretanto eis que surge o problema, o sistema(ERP) contém muitos itens de menu, e o ActionMenuBar "buga", dependendo da quantidade de itens ele começa a listagem no meio do form, as vezes do último item e sobe, mas isso até então não seria tão grave, o problema é que quando tem uma quantidade alta ele "come" os menus e não os mostra por completo, já fiz uma "limpeza" pra diminuir a quantidade mas já não sei o que fazer.

    alguém já passou por essa situação ou tem alguma ideia do que possa ser feito?

    Desde já agradeço.

×
×
  • Criar Novo...