Nirlan Posted October 23, 2013 Posted October 23, 2013 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 1 Quote
Nirlan Posted October 23, 2013 Author Posted October 23, 2013 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. Quote
Nirlan Posted October 24, 2013 Author Posted October 24, 2013 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 !! Quote
rullomare Posted October 24, 2013 Posted October 24, 2013 Maybe can help : download ExtPascal-0.9.8.zip from code.google.com/p/extpascal/ There is a Sample program (source code) of how to convert from Delphi or Lazarus to Extpascal. Regards. Quote
Sistema Fenix Posted October 24, 2013 Posted October 24, 2013 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 Quote
NelsonFS Posted October 28, 2013 Posted October 28, 2013 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.. Quote
wesleytcno Posted July 24, 2015 Posted July 24, 2015 estou problemas em fazer heranca, pois algumas vezes os componentes não funcionam, entao deixei de usar a mesma. gostei desse forum. estou aberto a dicas e sugestões wesleytcno@hotmail.com wesleytcno@gmail.com Quote
Nirlan Posted July 25, 2015 Author Posted July 25, 2015 eu uso herança dos forms em meus sistemas e não tenho tido problemas. Qual o erro que acontece com você ? Quote
Wilton Ergon Posted February 28, 2016 Posted February 28, 2016 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. Quote
Nirlan Posted February 29, 2016 Author Posted February 29, 2016 Sim, eu também uso herança com frame. Bastou criou uma frame base e fazer a herança nas novas frames. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.