Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Nicola - Febbraio 18, 2014, 11:37:35 pm

Titolo: Problema passaggio dati.
Inserito da: Nicola - Febbraio 18, 2014, 11:37:35 pm
Scusate il post, che sicuramente vi sembrerà banale, ma provengo da pascal in cui l'ide era praticamente testuale e con la potenza anche grafica di lazarus mi sto perdendo, e anche con
google non riesco ad uscirne.
Avrei bisogno di un chiarimento:
ho creato un programmino di prova dove al click sul bottone della finestra principale si apre una form secondaria; vorrei dalla form caricare dei dati nel record FFILE, ma il problema è, come faccio a passare
tale record alla seconda form?
Spero di essermi spiegato invio anche i sorgenti di prova, la unit pprogetto è la principale la unit pinserimento la secondaria alla quale vorrei passare il record.

Grazie
Titolo: Re:Problema passaggio dati.
Inserito da: Stilgar - Febbraio 19, 2014, 01:23:26 am
Ciao Nicola.
Nella form2:

Codice: [Seleziona]
   Tforminserimento = class(TForm)
    provincia: TEdit;
    Label1: TLabel;
    procedure Label1Click(Sender: TObject);
    procedure provinciaChange(Sender: TObject);
  private
   fRecordDati : RecordDati;
  public
     public recordDaPassare: recordati read fRecordDati write fRecordDati;
  end;

Codice: [Seleziona]

procedure Tforminserimento.provinciaChange(Sender: TObject);
begin
  FRecordDati.provincia := 'Quella che vuoi";
  write(fdati,FRecordDati);
  showmessage ('Scritto record');
end;

Titolo: Re:Problema passaggio dati.
Inserito da: Stilgar - Febbraio 19, 2014, 01:30:07 am
cmq, a me non piace molto la soluzione che ti ho proposto prima.

Codice: [Seleziona]
unit Pinserimento;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  TRecorDati=record
     provincia:string[20];
     settore:string[30];
     pagina:longint
  end;

  { Tforminserimento }

  Tforminserimento = class(TForm)
    provincia: TEdit;
    Label1: TLabel;
    procedure Label1Click(Sender: TObject);
    procedure provinciaChange(Sender: TObject);
  private
   fdati : File of RecordDati;
  public
    { public declarations }
  end;

var
  forminserimento: Tforminserimento;

implementation

{$R *.lfm}

{ Tforminserimento }
{$J+}
const
  NomeFile : String= '/home/nicola/Scrivania/WorkingDocs/ProveLazarus/File/filedati.dat';
{$J-}

procedure TFormInserimento.apriFile;
Begin
    assign (fdati,NomeFile);
     if fileexists (NomeFile) then
     begin
           reset(fdati);
           showmessage ('file già esistente')
      end
      else
      begin
           rewrite (fdati);
           showmessage ('file creato')
     end;
end;


procedure TFormInserimento.chiudiFile;
Begin
    fClose(fdati);
end;

procedure Tforminserimento.Label1Click(Sender: TObject);
begin

end;

procedure Tforminserimento.provinciaChange(Sender: TObject);
begin
  Try
  ApriFile;
  showmessage ('e qua mi fermo!!!')
  ChiudiFile;
  Except
   on E: Exception  do
   ShowMessage("Errore nella manipolazione del file:"+E.Message);
  end;
end;

end.

Questo ha il solo vantaggio che, in caso di errore il programma non entra in uno stato inconsistente.
Hai la tua bella eccezione che scatta e viene gestita all'interno del metodo. In modo atomico.
Se, per qualche motivo, in fase di boostrap, l'applicazione non collassa e non non ti apre i file, poi ti trovi gli handle sballati.


Stilgar
Titolo: Re:Problema passaggio dati.
Inserito da: Nicola - Febbraio 19, 2014, 09:42:52 am
Devo ammettere che non ci sarei mai arrivato da solo, mi manca la via di mezzo, cioè conosco il
pascal ma quando girava in dos e non si parlava di oggetti; che ne dici mi conviene acquistare il
manuale? ne vale la pena?
grazie ancora
ciao
Titolo: Re:Problema passaggio dati.
Inserito da: nomorelogic - Febbraio 19, 2014, 07:06:50 pm
il manuale lo puoi sempre acquistare ma credo che su internet trovi già molta documentazione ;)
Titolo: Re:Problema passaggio dati.
Inserito da: Nicola - Febbraio 21, 2014, 10:29:12 am
nella procedure
procedure TFormInserimento.apriFile;
mi da sto errore
pinserimento.pas(45,36) Error: method identifier expected
Titolo: Re:Problema passaggio dati.
Inserito da: nomorelogic - Febbraio 21, 2014, 03:05:40 pm
ci posti il pezzo di codice incriminato?
Titolo: Re:Problema passaggio dati.
Inserito da: cliff - Febbraio 22, 2014, 09:04:05 am
Una soluzione "sporca" potrebbe essere creare una unit contenitore con dentro le variabili condivise che poi richiami da entrambe le form.
Ad esempio in questa unit metti la definizione del record, la variabile tipizzata e magari anche la procedura che provvedere a caricare in memoria i dati da file.
Nella form principale richiami la procedura di lettura, che provvederà a caricare il memoria i dati e memorizzare lo stato dell'operazione avvenuta.
Richiami la form secodaria, che vedrà lo stato del recupero dei dati e i dati già belli pronti da usare.
Puoi anche spostare il caricamento dei dati nella seconda form ....

Questo metodo "barbaro" lo uso spessissimo per condivire dei dati globali con le varie form del progetto.

Bye
Titolo: Re:Problema passaggio dati.
Inserito da: Nicola - Febbraio 22, 2014, 02:03:10 pm
questo è il codice "incriminato"
Codice: [Seleziona]
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
  const
    nomefile=('/home/nicola/Scrivania/WorkingDocs/ProveLazarus/prova file e label/movimenti.dat');
type
    fileprova=record
    citta:string[20];
    indirizzo:string [30];
    numero:longint;
    end;


  { TForm2 }

  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form2: TForm2;
  movimentoform:fileprova;
  filemovimentoform:file of fileprova;
  dimensione:longint;


implementation

{$R *.lfm}

{ TForm2 }

procedure TForm2.Edit1Change(Sender: TObject);
begin
 movimentoform.citta:=edit1.text;
 end;

procedure TForm2.Button1Click(Sender: TObject);
 var mvf:fileprova;

begin
 reset(filemovimentoform);
 while not eof (filemovimentoform)
       do begin
          read(filemovimentoform,mvf)
       end;
 write (filemovimentoform,movimentoform);
 closefile(filemovimentoform)

end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  edit1.text:='';
  edit2.text:='';
  edit3.text:='';
end;

procedure TForm2.Edit2Change(Sender: TObject);
begin
  movimentoform.indirizzo:=edit2.text;
end;

procedure TForm2.Edit3Change(Sender: TObject);
begin
  movimentoform.numero:=strtoint(edit3.text);
end;
  {$I-}
begin
  movimentoform.citta:='';
  movimentoform.indirizzo:='';
  movimentoform.numero:=0;
  assign(filemovimentoform,nomefile);

end.

però la soluzione "sporca" suggerita da cliff direi che proprio cosi' sporca non è tant'è che
avrei risolto il problema
Titolo: Re:Problema passaggio dati.
Inserito da: El Salvador - Febbraio 22, 2014, 03:33:55 pm
Invece di "file of fileprova;" dovresti utilizzare "TextFile" e quindi gestirti da te l'inserimento e la lettura dei dati nel file.

Vedi http://wiki.freepascal.org/File_Handling_In_Pascal (http://wiki.freepascal.org/File_Handling_In_Pascal)