Série da semana: Primeiros passos no Flutter

Veja mais

Erro ao Compilar código no Delphi 10.2 - RX

08/03/2019

11

Olá membros do DevMedia. Estou tento um problema em compilar meu projeto. O começo desse projeto é em uma tela de configuração permitir que vá para a tela de menu principal somente se for colocado o caminho do Banco de Dados.

Estou utilizando o Delphi 10.2 - RX. Abaixo está o código separados por paginas criadas dentro do projeto. Acontece que está dando um erro ao compilar. Preciso da vossa ajuda, pois só posso dar continuidade no meu projeto apos essa etapa.

===== FORMULARIO PRINCIPAL ===== uPrincial (frmPrincipal)

unit uPrincipal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TfrmPrincipal = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPrincipal: TfrmPrincipal;

implementation

{$R *.dfm}

end.


===== DATA MODULE ===== uDmDados (dmDados)
1> FDConnection1 da palheta FireDAC

unit uDmDados;

interface

uses
  System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.FB,
  FireDAC.Phys.FBDef, FireDAC.VCLUI.Wait, Data.DB, FireDAC.Comp.Client,
  uConfigBanco, uBiblioteca, Vcl.Forms;

type
  TdmDados = class(TDataModule)
    FDConnection1: TFDConnection;
    procedure DataModuleCreate(Sender: TObject);
  private
    procedure CarregaBanco;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  dmDados: TdmDados;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

procedure TdmDados.CarregaBanco;
begin
  try
    FDConnection1.Params.Database := GetValorInicial(ExtractFieldName(Application.ExeName), 'CONFIGURACAO', 'LOCAL'); // erro ???
    FDConnection1.Connected := True;
  except
    frmConfigBanco.ShowModal;
  end;
end;

procedure TdmDados.DataModuleCreate(Sender: TObject);
begin
  CarregaBanco;
end;

end.


===== UNIT CRIADA A MÃO ====== uBiblioteca

unit uBiblioteca;

interface
uses IniFiles, System.SysUtils;
  procedure SetValorInicial(pLocal, pSessao, pSubSessao, pValor: string);
  function GetValorInicial (pLocal, pSessao, pSubSessao: string): string;
implementation
  procedure SetValorInicial(pLocal, pSessao, pSubSessao, pValor: string);
var vArquivo: TIniFile;
begin
  vArquivo := TIniFile.Create(pLocal);
  vArquivo.WriteString(pSessao, pSubSessao, pValor);
  vArquivo.Free;
end;

  function GetValorInicial (pLocal, pSessao, pSubSessao: string): string;
var vArquivo : TIniFile;
begin
  vArquivo := TIniFile.Create(pLocal);
  Result := vArquivo.ReadString(pSessao, pSubSessao, '');
  vArquivo.Free;
end;
  end.


===== FORMULARIO PRA CONFIGURAR O BANCO ===== uConfigBanco (frmConfigBanco)
1> Edit
1> Button
1> OpenDialog

unit uConfigBanco;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  Vcl.ExtCtrls,  // coloquei essa Vcl na mão
  uBiblioteca;

type
  TfrmConfigBanco = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    procedure Configura;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmConfigBanco: TfrmConfigBanco;

implementation

{$R *.dfm}

{ TfrmConfigBanco }

procedure TfrmConfigBanco.Button1Click(Sender: TObject);
begin
  Configura;
end;

procedure TfrmConfigBanco.Configura;
var vFileName :string;
begin
  //alt+f11 pra jogar a biblioteca dentro de interface
  if OpenDialog1.Execute then
    begin
      Edit1.Text := OpenDialog1.FileName;
      vFileName     := ExtractFilePath(Application.ExeName) + 'config.ini';
      SetValorInicial(vFileName, 'CONFIGURACAO', 'LOCAL', Edit1.Text);
    end;

end;

end.


==========================================================================

Acima esta as linhas de comando separadas por paginas

Quando clico em Shift + F9, o Delphi me da duas mensagens de erro:

[dcc32 Error] uDmDados.pas(35): E2250 There is no overloaded version of 'ExtractFieldName' that can be called with these arguments
e
[dcc32 Fatal Error] Cardigan.dpr(6): F2063 Could not compile used unit 'uDmDados.pas'

Segue imagem da tela: https://prnt.sc/mvayv4
Responder

Posts

10/03/2019

Rubens Pena

Olá membros do DevMedia. Estou tento um problema em compilar meu projeto. O começo desse projeto é em uma tela de configuração permitir que vá para a tela de menu principal somente se for colocado o caminho do Banco de Dados.

Estou utilizando o Delphi 10.2 - RX. Abaixo está o código separados por paginas criadas dentro do projeto. Acontece que está dando um erro ao compilar. Preciso da vossa ajuda, pois só posso dar continuidade no meu projeto apos essa etapa.

===== FORMULARIO PRINCIPAL ===== uPrincial (frmPrincipal)

unit uPrincipal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TfrmPrincipal = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPrincipal: TfrmPrincipal;

implementation

{$R *.dfm}

end.


===== DATA MODULE ===== uDmDados (dmDados)
1> FDConnection1 da palheta FireDAC

unit uDmDados;

interface

uses
  System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.FB,
  FireDAC.Phys.FBDef, FireDAC.VCLUI.Wait, Data.DB, FireDAC.Comp.Client,
  uConfigBanco, uBiblioteca, Vcl.Forms;

type
  TdmDados = class(TDataModule)
    FDConnection1: TFDConnection;
    procedure DataModuleCreate(Sender: TObject);
  private
    procedure CarregaBanco;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  dmDados: TdmDados;

implementation

{%CLASSGROUP ''Vcl.Controls.TControl''}

{$R *.dfm}

procedure TdmDados.CarregaBanco;
begin
  try
    FDConnection1.Params.Database := GetValorInicial(ExtractFieldName(Application.ExeName), ''CONFIGURACAO'', ''LOCAL''); // erro ???
    FDConnection1.Connected := True;
  except
    frmConfigBanco.ShowModal;
  end;
end;

procedure TdmDados.DataModuleCreate(Sender: TObject);
begin
  CarregaBanco;
end;

end.


===== UNIT CRIADA A MÃO ====== uBiblioteca

unit uBiblioteca;

interface
uses IniFiles, System.SysUtils;
  procedure SetValorInicial(pLocal, pSessao, pSubSessao, pValor: string);
  function GetValorInicial (pLocal, pSessao, pSubSessao: string): string;
implementation
  procedure SetValorInicial(pLocal, pSessao, pSubSessao, pValor: string);
var vArquivo: TIniFile;
begin
  vArquivo := TIniFile.Create(pLocal);
  vArquivo.WriteString(pSessao, pSubSessao, pValor);
  vArquivo.Free;
end;

  function GetValorInicial (pLocal, pSessao, pSubSessao: string): string;
var vArquivo : TIniFile;
begin
  vArquivo := TIniFile.Create(pLocal);
  Result := vArquivo.ReadString(pSessao, pSubSessao, '''');
  vArquivo.Free;
end;
  end.


===== FORMULARIO PRA CONFIGURAR O BANCO ===== uConfigBanco (frmConfigBanco)
1> Edit
1> Button
1> OpenDialog

unit uConfigBanco;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  Vcl.ExtCtrls,  // coloquei essa Vcl na mão
  uBiblioteca;

type
  TfrmConfigBanco = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    procedure Configura;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmConfigBanco: TfrmConfigBanco;

implementation

{$R *.dfm}

{ TfrmConfigBanco }

procedure TfrmConfigBanco.Button1Click(Sender: TObject);
begin
  Configura;
end;

procedure TfrmConfigBanco.Configura;
var vFileName :string;
begin
  //alt+f11 pra jogar a biblioteca dentro de interface
  if OpenDialog1.Execute then
    begin
      Edit1.Text := OpenDialog1.FileName;
      vFileName     := ExtractFilePath(Application.ExeName) + ''config.ini'';
      SetValorInicial(vFileName, ''CONFIGURACAO'', ''LOCAL'', Edit1.Text);
    end;

end;

end.


==========================================================================
Acima esta as linhas de comando separadas por paginas

Quando clico em Shift + F9, o Delphi me da duas mensagens de erro:

[dcc32 Error] uDmDados.pas(35): E2250 There is no overloaded version of ''ExtractFieldName'' that can be called with these arguments
e
[dcc32 Fatal Error] Cardigan.dpr(6): F2063 Could not compile used unit ''uDmDados.pas''

Segue imagem da tela: https://prnt.sc/mvayv4
Boa noite... Uma ajuda... Alguém. ?
Responder

11/03/2019

Raylan Zibel

ExtractFILEName
Responder
Copiando a dica do nosso amigo Rylan, o problema é que você usou ExtractFieldName, mas o correto é ExtractFileName, ou se preferir utilizar a sintaxe mais moderna do delphi pode utilizar TPath.GetFileName('Application.ExeName').
Responder

13/03/2019

Rubens Pena

Copiando a dica do nosso amigo Rylan, o problema é que você usou ExtractFieldName, mas o correto é ExtractFileName, ou se preferir utilizar a sintaxe mais moderna do delphi pode utilizar TPath.GetFileName('Application.ExeName').
Boa noite pessoal. Obrigado a vocês dois (Raylan Zibel e Hélio Devmedia). Deu certo e ao mesmo tempo não deu certo. Deu certo porque esta compilando sem erros. O que não ta dando certo é porque quando clico em F9 ele vai pra esse formulário que é o de localizar o banco de dados (segue imagem: http://prntscr.com/mx3f2x), localizo o diretório do banco e ele me traz o caminho como na imagem ( http://prntscr.com/mx3fm7 ), clico em OK e automaticamente o formulário fecha. Até ai tudo bem. Mas quando clico novamente em F9 ele não ta indo pra tela de Menu Inicial (Form Principal), ele ta voltando pra essa tela de CONFIGURAÇÃO DO BANCO novamente, e não é pra voltar já que foi feito a configuração do banco anteriormente. Fiz um debug para ver o que se passava e novamente me encontro enganchado, segue imagem das mensagens do debug ( http://prntscr.com/mx3joj).

No formulário de conf do banco acrescentei duas linhas de codigo segue abaixo:
procedure TfrmConfigBanco.Configura;
var vFileName :string;
begin
  //alt+f11 pra jogar a biblioteca dentro de interface
  if OpenDialog1.Execute then
    begin
      Edit1.Text := OpenDialog1.FileName;
      vFileName     := ExtractFilePath(Application.ExeName) + 'config.ini';
      SetValorInicial(vFileName, 'CONFIGURACAO', 'LOCAL', Edit1.Text);
      ShowMessage('Banco de Dados Configurado.'); //codigo acrescentado
      Self.Close; //codigo acrescentado
    end;

end;


E no DataModule fiz apenas uma alteração em uma das linhas de codigo
procedure TdmDados.CarregaBanco;
begin
  try
    FDConnection1.Params.Database := GetValorInicial(ExtractFieldName(Application.ExeName) + 'config.ini', 'CONFIGURACAO', 'LOCAL'); // codigo modificado nessa linha
    FDConnection1.Connected := True;
  except
    frmConfigBanco.ShowModal;
  end;


Onde será o erro dessa vez? :)
Responder
O Erro está no código onde você utiliza a tecla F9!!! essa parte você não colocou o código.
Responder

13/03/2019

Rubens Pena

O Erro está no código onde você utiliza a tecla F9!!! essa parte você não colocou o código.
A tecla F9 é o atalho no delphi pra compilar o projeto.
Responder
Poxa Rubens! Você acredita que eu pensei que que era uma tecla de atalho que voce tinha implementado para chamar a tela! KKK

Na verdade olhando a Imagem da sua depuração, percebi que onde está
GetValorInicial(ExtractFieldName(Application.ExeName) + 'config.ini', 'CONFIGURACAO', 'LOCAL'); // codigo modificado nessa linha

o que você deveria utilizar é ExtractFilePath(), para ele retornar o caminho do executável com uma '\\' (barra) no final sem o nome do executável, para concatenar com o nome do arquivo de configuração.

faça um teste e depois diga se funcionou.
Responder

13/03/2019

Rubens Pena

Poxa Rubens! Você acredita que eu pensei que que era uma tecla de atalho que voce tinha implementado para chamar a tela! KKK

Na verdade olhando a Imagem da sua depuração, percebi que onde está
GetValorInicial(ExtractFieldName(Application.ExeName) + 'config.ini', 'CONFIGURACAO', 'LOCAL'); // codigo modificado nessa linha

o que você deveria utilizar é ExtractFilePath(), para ele retornar o caminho do executável com uma '\\\\' (barra) no final sem o nome do executável, para concatenar com o nome do arquivo de configuração.

faça um teste e depois diga se funcionou.
Deu certo. Agora sim ele esta reconhecendo o caminho do banco de dados e passando direto pra tela principal. Fiz o teste entrando na pasta config.ini e apaguei parte do caminho do banco pra ver se ele entrava na tela de configuracao. Deu certo. Reconheceu o caminho, passa pra principal. O codigo nessa linha ficou assim:

FDConnection1.Params.Database := GetValorInicial(ExtractFilePath(Application.ExeName)  'config.ini', 'CONFIGURACAO', 'LOCAL');

>> entre o .ExeName) e 'config, tem um sinal de mais.

Não precisou colocar a '\\\\', ele ta gravando o caminho direitinho, que no meu caso é LOCAL=R:\\Rubens\\_MEGA DOWNLOADS\\Projeto Card em Delphi\\Dados\\DADOS.FDB

Obrigado pela atenção. Agora vou dar continuidade no meu projeto. Esse projeto é pequeno, mais de grande aprendizado para mim. Ele é para imprimir umas etiquetas.
Responder