Jump to content

conversor beta 1


Nirlan

Recommended Posts

Nos últimos 40 dias comecei a desenvolver um sistema web em uniGUI tendo como base um software desktop desenvolvido em Delphi XE2.

 

Basicamente eu crio um novo form uniGUI utilizando o form desktop como modelo.

 

Quando me deparei com o form de cadastro de clientes ( e de fornecedores) que possuíam dezenas de campos.

Bateu aquela preguiça.

Pensei então em criar uma rota alternativa.

 

Abri o .PAS e o DFM no bloco de notas e fazia a substituição de, por exemplo, Label para UniLabel, etc.

Testei e deu certo.

 

Mas havia outro problema, eu uso quase 80 componentes da paleta standart, data controls e ainda do Jedi.

Os componentes do dbexpress e do report buider seriam reaproveitados.

Seriam 80 busca/substituição para cada .PAS  e a mesma quantidade no .DFM.

A preguiça voltou.

 

E teriam mais de 100 forms.

 

Foi quando pensei, porque não existe um conversor ?

 

Basicamente ele teria que abrir o .PAS e o .DFM por fora do delphi e fazer as substituições.

 

Foi isso que eu fiz, e funcionou com relativo sucesso me poupando bastante tempo, pois precisava  converter mais de 100 forms.

 

Ao abrir  o form convertido no sistema uniGUI ele vai dar um aviso relativo as propriedades que não existem, deve-se ignorar tudo e depois ao salvar ele adiciona as classes nas uses automaticamente.

 

O que está faltando é um modo de retirar as classes não mais utilizadas da uses. Para adiantar eu mantenho a primeira linha da minha uses:   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uniGUIForm; e apago todo o resto. Peço para salvar e as classes corretas aparecem novamente.

 
Sim, no meu conversor eu consegui incluir a uniGUIForm.
 
Faltou ainda substituir o:
var form1 : TForm1
 
por:

function form1 : TForm1 

 

 Não posso fazer a busca pelo "var" pois existem outros "var" nas minhas functions e procedures
Além disso o form1 pode ser form10, form40, etc
 
 
Falta também incluir o código a seguir logo abaixo da linha {$R *.dfm}:
 
function Form1: TForm1;
begin
  Result := TForm1(DM.GetFormInstance(TForm1));
end;
 

 

Posso afirmar que adianta muito o processo de conversão. Por isso disponibilizo em anexo.

 

 

Conversor.zip

  • Upvote 1
Link to comment
Share on other sites

eu fiz esse aplicativo no final de semana, e com certamente pode melhorar muito e por isso conto com auxílio de quem se interessar.

 

segue o código fonte:

 

 

// conversor  vcl ==> uniGUI

// beta 1

// 20/Out/2013

// Nirlan E. Fundão

// MTG Softwares Ltda.

 

unit Prog001;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask, JvExMask, JvToolEdit, Vcl.Buttons;
 
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    frFileName: TJvFilenameEdit;
    GroupBox2: TGroupBox;
    Memo1: TMemo;
    BotaoOK: TBitBtn;
    GroupBox3: TGroupBox;
    Memo2: TMemo;
    procedure BotaoOKClick(Sender: TObject);
  private
    { Private declarations }
    vArray : array[1..70 , 1..70] of String;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.BotaoOKClick(Sender: TObject);
var
  vPasFile : String;
  vDfmFile : String;
  I        : Integer;
 
begin
  //  VCL
  vArray[ 01, 01 ] :=  'TForm';
  vArray[ 01, 02 ] :=  'TUniForm';
  vArray[ 02, 01 ] :=  'TEdit';
  vArray[ 02, 02 ] :=  'TUniEdit';
  vArray[ 03, 01 ] :=  'TMaskEdit';
  vArray[ 03, 02 ] :=  'TUniEdit';
  vArray[ 04, 01 ] :=  'TPanel';
  vArray[ 04, 02 ] :=  'TUniPanel';
  vArray[ 05, 01 ] :=  'TLabel';
  vArray[ 05, 02 ] :=  'TUniLabel';
  vArray[ 06, 01 ] :=  'TBitBtn';
  vArray[ 06, 02 ] :=  'TUniBitBtn';
  vArray[ 07, 01 ] :=  'TGroupBox';
  vArray[ 07, 02 ] :=  'TUniGroupBox';
  vArray[ 08, 01 ] :=  'TSpeedButton';
  vArray[ 08, 02 ] :=  'TUniSpeedButton';
  vArray[ 09, 01 ] :=  'TCheckBox';
  vArray[ 09, 02 ] :=  'TUniCheckBox';
  vArray[ 10, 01 ] :=  'TButton';
  vArray[ 10, 02 ] :=  'TUniButton';
  vArray[ 11, 01 ] :=  'TListBox';
  vArray[ 11, 02 ] :=  'TUniListBox';
  vArray[ 12, 01 ] :=  'TComboBox';
  vArray[ 12, 02 ] :=  'TUniComboBox';
  vArray[ 13, 01 ] :=  'TImage';
  vArray[ 13, 02 ] :=  'TUniImage';
  vArray[ 14, 01 ] :=  'TMemo';
  vArray[ 14, 02 ] :=  'TUniMemo';
  vArray[ 15, 01 ] :=  'TTabControl';
  vArray[ 15, 02 ] :=  'TUniTabControl';
  vArray[ 16, 01 ] :=  'TPageControl';
  vArray[ 16, 02 ] :=  'TUniPageControl';
  vArray[ 17, 01 ] :=  'TSpinEdit';
  vArray[ 17, 02 ] :=  'TUniSpinEdit';
  vArray[ 18, 01 ] :=  'TScrollBox';
  vArray[ 18, 02 ] :=  'TUniScrollBox';
  vArray[ 19, 01 ] :=  'TRadioGroup';
  vArray[ 19, 02 ] :=  'TUniRadioGroup';
 
  //  VCL DB
  vArray[ 30, 01 ] :=  'TDBEdit';
  vArray[ 30, 02 ] :=  'TUniDBEdit';
  vArray[ 31, 01 ] :=  'TDBLookupComboBox';
  vArray[ 31, 02 ] :=  'TUniDBLookupComboBox';
  vArray[ 32, 01 ] :=  'TDBGrid';
  vArray[ 32, 02 ] :=  'TUniDBGrid';
  vArray[ 33, 01 ] :=  'TDBNavigator';
  vArray[ 33, 02 ] :=  'TUniDBNavigator';
  vArray[ 34, 01 ] :=  'TDBListBox';
  vArray[ 34, 02 ] :=  'TUniDBListBox';
  vArray[ 35, 01 ] :=  'TDBComboBox';
  vArray[ 35, 02 ] :=  'TUniDBComboBox';
  vArray[ 36, 01 ] :=  'TDBImage';
  vArray[ 36, 02 ] :=  'TUniDBImage';
  vArray[ 37, 01 ] :=  'TDBMemo';
  vArray[ 37, 02 ] :=  'TUniDBMemo';
 
  //  Jedi Components
  vArray[ 50, 01 ] :=  'TJvCalcEdit';
  vArray[ 50, 02 ] :=  'TUniNumberEdit';
  vArray[ 51, 01 ] :=  'TDBJvCalcEdit';
  vArray[ 51, 02 ] :=  'TUniDBNumberEdit';
  vArray[ 52, 01 ] :=  'TJVDateEdit';
  vArray[ 52, 02 ] :=  'TUniDateTimePicker';
  vArray[ 53, 01 ] :=  'TJVDBDateEdit';
  vArray[ 53, 02 ] :=  'TUniDBDateTimePicker';
  vArray[ 54, 01 ] :=  'TJvDBLookupCombo';
  vArray[ 54, 02 ] :=  'TUniDBLookupComboBox';
  vArray[ 55, 01 ] :=  'TJvSpinEdit';
  vArray[ 55, 02 ] :=  'TUniSpinEdit';
 
  //  Diversos
  vArray[ 60, 01 ] :=  'Forms,';
  vArray[ 60, 02 ] :=  'Forms, uniGUIForm,';
  vArray[ 61, 01 ] :=  'Buttons,';
  vArray[ 61, 02 ] :=  '';
  vArray[ 62, 01 ] :=  'Mask,';
  vArray[ 62, 02 ] :=  '';
 
  //  Valida preenchimento
  if Trim(frFileName.Text) = '' then
    begin
      Application.MessageBox('O arquivo .PAS a ser convertido deve ser informado.',
                             'Atenção', mb_ok + mb_IconError );
      Exit;
    end;
 
  vPasFile := LowerCase(frFileName.Text);
  vDfmFile := StringReplace(vPasFile, 'pas', 'dfm', [rfReplaceAll, rfIgnoreCase]);
 
  //  Carrega arquivos
  GroupBox2.Caption := ' ' + vPasFile + ' ';
  GroupBox3.Caption := ' ' + vDfmFile + ' ';
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
  Memo1.Lines.LoadFromFile(vPasFile);
  Memo2.Lines.LoadFromFile(vDfmFile);
 
  for I := 1 to 70 do
   begin
     Memo1.Text := StringReplace(Memo1.Text, vArray[ I , 01], vArray[ I , 02 ], [rfReplaceAll, rfIgnoreCase]);
     Memo2.Text := StringReplace(Memo2.Text, vArray[ I , 01], vArray[ I , 02 ], [rfReplaceAll, rfIgnoreCase]);
   end;
 
  //  Grava arquivos
  Memo1.Lines.SaveToFile(vPasFile);
  Memo2.Lines.SaveToFile(vDfmFile);
 
  ShowMessage('Arquivo convertido com sucesso.');
end;
 
end.
Link to comment
Share on other sites

Penso que na próxima versão do conversor, eu possa carregar o que vai ser substituído a partir de um arquivo txt, para evitar ter que recompilar o programa após cada alteração. Sugestões (com código fonte) são bem vindas !!

Link to comment
Share on other sites

Olá Nirlan.

 

Teve uma vez que precisei fazer algo parecido e encontrei no próprio jedi a ferramenta para fazer a conversão, na época convertir do rxlib para o jedi.

Você abre um arquivo dat, onde tem os parâmetros tipo label para unilabel, no caso dos uses, fiz a mesma coisa, o que precisava remover, deixei no "from" o nome e no "to" vazio.

 

Bom vou deixar em anexo os fontes e o executável para você dar uma olhada e ter novas ideias no que está fazendo. Para compilar vai precisar do jedi.

 

Obrigado por compartilhar.

 

Abraços

JVCLConvert.rar

post-1507-0-49089900-1382610799_thumb.jpg

Link to comment
Share on other sites

Já pensei realmente em fazer esse conversor.

Só que de uma forma diferente, seria dois clientdataset em memoria que salvaria os dados em arquivos .DAT.

O segundo, teria relação com o primeiro, indicando para cada tipo de objeto, aquelas propriedades que seriam removidas ou definidas como padrão.

Depois em cada form, seria incluso as classes do unigui. Para retirar as classes que não seriam mais necessárias, aí é mais complicado pois poder ter dezenas, então poderia sim ter uma configuração para listar as que seriam removidas.

Por fim, recriaria a cláusula de inicialização, basta localizar a clausula de inicialização, colocar antes a variavel (corrigir a que estava) e depois da inicialização incluir o codigo que instância a variavel.

Basicamente é isso. Se você quiser ver dessa forma, posso te dar uma mão. Não é tão difícil assim, nada que vários loops em um objeto memo que carregou os dados não resolva.

Ou então fica como uma ideia. Abração..

Link to comment
Share on other sites

  • 1 year later...
  • 7 months later...

voce já conseguiu usar herança com frame?, estava tentando fazer um projeto usando a ideia de tabs, onde cria-se os frames em paginas de um pagecontrol

porem como cada frame e herdado de um base, nao consegui fazer rodar..

tive que usar form padrao mesmo.

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...