unit UnitFormCidade;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, UnitFormPadrao, Vcl.StdCtrls,
  Vcl.ToolWin, Vcl.ComCtrls, UnitLista, contnrs, Vcl.ExtCtrls, Vcl.Grids, UnitDados,
  Vcl.ExtDlgs;

type
  TFormCidade = class(TFormPadrao)
    edCod: TEdit;
    edCidade: TEdit;
    edUF: TEdit;
    edPais: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure btInserirClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btExcluirClick(Sender: TObject);
    procedure btAnteriorClick(Sender: TObject);
    procedure btProximoClick(Sender: TObject);
    procedure btBuscarClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure btExportarClick(Sender: TObject);
    procedure btImportarClick(Sender: TObject);
    procedure btContarClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure edCodExit(Sender: TObject);
    procedure edFinalKeyPress(Sender: TObject; var Key: Char);
    procedure limpaCampos();
    procedure cbLimparCamposClick(Sender: TObject);
  private
    { Private declarations }
    strict private wLista: TLista;
    wClear: boolean;
  public
    { Public declarations }
  end;

  TCidade = class
  private
    wpCod: integer;
    wpCidade: string;
    wpPais: string;
    wpUF: string;
  public
    property wCod: integer read wpCod write wpCod;
    property wCidade: string read wpCidade write wpCidade;
    property wPais: string read wpPais write wpPais;
    property wUF: string read wpUF write wpUF;
  end;

var
  FormCidade: TFormCidade;
  wCidade: TCidade;
  Dado1: TDados;

implementation
{$R *.dfm}

uses UnitFormGrid;


procedure TFormCidade.btAnteriorClick(Sender: TObject);
var
  wObj: TObject;
  wIndex: integer;
  I: Integer;
begin
  inherited;
  if (trystrtoint(edCod.Text, wIndex)) then
     begin
       for I := 0 to wLista.Count-1 do
         begin
           wObj := wLista.getObjectByIndex(I);
           with wObj as TCidade do
             begin
               if wCod = strtoint(edCod.Text) then
                  wIndex := wLista.getIndexOfObj(wObj);
             end;
         end;
       if wIndex-1 >= 0 then
          begin
            wObj := wLista.getObjectByIndex(wIndex-1);
            with wObj as TCidade do
              begin
                edCod.Text := inttostr(wCod);
                edCidade.Text := wCidade;
                edPais.Text := wPais;
                edUF.Text := wUF;
              end;
        end;
     end;
end;

procedure TFormCidade.btProximoClick(Sender: TObject);
var
  wObj: TObject;
  wIndex: integer;
  I: integer;
begin
  inherited;
  if (trystrtoint(edCod.Text, wIndex)) then
  begin
    for I := 0 to wLista.Count-1 do
      begin
        wObj := wLista.getObjectByIndex(I);
        with wObj as TCidade do
          if wCod = strtoint(edCod.Text) then
             wIndex := wLista.getIndexOfObj(wObj);
      end;
    if wIndex+1 < wLista.Count then
       begin
        wObj := wLista.getObjectByIndex(wIndex+1);
        with wObj as TCidade do
          begin
            edCod.Text := inttostr(wCod);
            edCidade.Text := wCidade;
            edPais.Text := wPais;
            edUF.Text := wUF;
          end;
       end;
  end;
end;

procedure TFormCidade.Button1Click(Sender: TObject);
begin
  inherited;
  ShowMessage('teste');
end;

procedure TFormCidade.cbLimparCamposClick(Sender: TObject);
begin
  inherited;
  if wClear then
     wClear := false
  else
    wClear := true;
end;

procedure TFormCidade.limpaCampos();
begin
  if wClear then
     begin
      edCod.Clear;
      edCidade.Clear;
      edPais.Clear;
      edUF.Clear;
     end;
end;

procedure TFormCidade.edFinalKeyPress(Sender: TObject; var Key: Char);
var
  wObj: TCidade;
  wObjGet: TObject;
  wcont: Integer;
  wIndex: integer;
  wMaior: integer;
  wNew: boolean;
  wZero: boolean;
begin
  inherited;
  if (ord(key) = 13) or (ord(key) = 9) then
     begin
       wNew := true;
       if (trystrtoint(edCod.Text, windex)) then
          begin
            wObj := TCidade.Create;
            with wObj do
              begin
                wCod := strtoint(edCod.Text);
                wCidade := edCidade.Text;
                wPais := edPais.Text;
                wUF := edUF.Text;
              end;
            for wCont := 0 to wLista.Count-1 do
              begin
                wObjGet := wLista.getObjectByIndex(wCont);
                with wObjGet as TCidade do
                  if wCod = strtoint(edCod.Text) then
                     begin
                       wLista.Update(wCont, wObj);
                       wNew := false;
                       if wClear then
                          limpaCampos();
                       break;
                     end;
              end;
            if wNew = true then
               begin
               wLista.Inserir(wObj, TCidade);
               if wClear then
                  limpaCampos();
               end;

          end
          else
            if edCod.Text = '' then
               begin
                 wZero := true;
                 for wCont := 0 to wLista.Count-1 do
                   begin
                     wObjGet := wLista.getObjectByIndex(wCont);
                     with wobjGet as TCidade do
                     begin
                       if wCod > wMaior then
                          wMaior := wCod;
                       wZero := false;
                     end;

                   end;
                 wObj := TCidade.Create;
                 with wObj do
                   begin
                     if wZero then
                        wCod := 0
                     else
                       wCod := wMaior+1;
                     wCidade := edCidade.Text;
                     wPais := edPais.Text;
                     wUF := edUF.Text;
                   end;
                 wLista.Inserir(wObj, TCidade);
                 if wClear then
                    limpaCampos();
               end;
       // volta pro edit do inicio e altera status bar
       for wCont := 0 to ComponentCount-1 do
         if (Components[wCont].Tag = 0) and (Components[wCont] is TEdit) then
            with Components[wCont] as TEdit do
              begin
                setFocus;
                StatusBar1.Panels[0].Text := 'Aguardando';
              end;
     end;
end;

procedure TFormCidade.edCodExit(Sender: TObject);
var
  wObj: TObject;
  wCont: Integer;
  wIndex: integer;
  wNew: boolean;
begin
  inherited;
  if (trystrtoint(edCod.Text, wIndex)) then
     begin
       wNew := true;
       for wCont := 0 to wLista.Count-1 do
         begin
           wObj := wLista.getObjectByIndex(wCont);
             with wObj as TCidade do
               if wCod = strtoint(edCod.Text) then
                  begin
                    StatusBar1.Panels[0].Text := 'Alterando registro';
                    edCod.Text := inttostr(wCod);
                    edCidade.Text := wCidade;
                    edPais.Text := wPais;
                    edUF.Text := wUF;
                    wNew := false;
                    exit;
                  end;
         end;
       if wNew then
          StatusBar1.Panels[0].Text := 'Novo registro';
     end
     else
       if edCod.Text = '' then
          StatusBar1.Panels[0].Text := 'Novo registro'
     else
       StatusBar1.Panels[0].Text := 'Aguardando';
end;

procedure TFormCidade.btExportarClick(Sender: TObject);
var
  DadoArmazenado: TDadoArmazenado;
  wDir: string;
begin
  inherited;
  DadoArmazenado := TDadoArmazenado.Create;
  if SaveTextFileDialog1.Execute then
    wDir := SaveTextFileDialog1.FileName;
  DadoArmazenado.saveToFile(wDir, wLista, TCidade);
end;

procedure TFormCidade.btBuscarClick(Sender: TObject);
var
  FormGrid: TFormGrid;
begin
  inherited;
  if wLista.Count > 0 then
     begin
       FormGrid := TFormGrid.Create(nil);
       FormGrid.geraGrid(wLista, TCidade);
       FormGrid.Show;
     end;
end;

procedure TFormCidade.btContarClick(Sender: TObject);
begin
  inherited;
  ShowMessage(inttostr(wLista.Count));
end;

procedure TFormCidade.btExcluirClick(Sender: TObject);
var
  wObj: TObject;
  I: Integer;
begin
  inherited;
  try
    for I := 0 to wLista.Count-1 do
      begin
        wObj := wLista.getObjectByIndex(I);
        with wObj as TCidade do
          if wCod = strtoint(edCod.Text) then
             begin
               wLista.Excluir(I);
               break;
             end;
      end;
  finally
    edCod.Clear;
    edCidade.Clear;
    edPais.Clear;
    edUF.Clear;
  end;
end;

procedure TFormCidade.btImportarClick(Sender: TObject);
var
  DadoArmazenado: TDadoArmazenado;
  wDir: string;
  begin
    inherited;
    DadoArmazenado := TDadoArmazenado.Create;
    if OpenTextFileDialog1.Execute then
       wDir := OpenTextFileDialog1.FileName;
    wLista := DadoArmazenado.loadFromFile(wDir, TCidade);
end;

procedure TFormCidade.btInserirClick(Sender: TObject);
var
  Cidade: TCidade;
  wObj: TObject;
  wIndex: integer;
  I: integer;
  wAux: integer;
begin
  inherited;
  Cidade := TCidade.Create;
  if (trystrtoint(edCod.Text, wIndex)) then
     begin
       with Cidade do
         begin
           wCod := strtoint(edCod.Text);wCidade := edCidade.Text;wPais := edPais.Text;wUF := edUF.Text;
         end;
       if wLista.Count >= 1 then
          begin
            for I := 0 to wLista.Count-1 do
              begin
                wObj := wLista.getObjectByIndex(I);
                with wObj as TCidade do
                  begin
                    if wCod = strtoint(edCod.Text) then
                       begin
                        wAux := 1;
                        wLista.Update(I, Cidade);
                        if wClear then
                           limpaCampos();
                        break;
                       end
                    else
                      wAux := 0;
                  end;
              end;
            if wAux =0 then
               begin
               wLista.Inserir(Cidade, TCidade);
               if wClear then
                  limpaCampos();
               end;

          end
       else
         wLista.Inserir(Cidade, TCidade);
         if wClear then
            limpaCampos();
     end;
end;

procedure TFormCidade.FormActivate(Sender: TObject);
var
  wObj: TObject;
  wCont: Integer;
begin
  inherited;
  if Dado1.Dado > -1 then
     begin
       wObj := wLista.getObjectByIndex(Dado1.Dado);
       with wObj as TCidade do
         begin
           edCod.Text := inttostr(wCod);
           edCidade.Text := wCidade;
           edPais.Text := wPais;
           edUF.Text := wUF;
         end;
     end;
end;

procedure TFormCidade.FormCreate(Sender: TObject);
begin
  inherited;
  wLista := TLista.Create;
  Dado1 := TDados.Create;
  wClear := false;
end;

initialization
  registerclass (TFormCidade);
end.
