* * * *
15 Visitatori, 0 Utenti

Autore Topic: DLL con SaveDialog  (Letto 22458 volte)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL con SaveDialog
« Risposta #30 il: Dicembre 26, 2012, 10:42:47 pm »
Una delle tante cose che non capisco è come mai Lazarus genera una dll da 13,8 MB  :o
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL con SaveDialog
« Risposta #31 il: Dicembre 27, 2012, 12:02:18 am »
Allora nelle modifiche che ho fatto ho rimesso Extended quindi non dovrebbero esserci problemi, poi in Procedure Calculate ho risolto così si aprono sia OpenDialog che SaveDialog, ma non si chiudono.
Sui 2 ingressi ho messo i controlli poiché il pulsante della mi libreria nel momento che viene premuto genera un 5V quindi si spiega il perché si apre... ma non si spiega il perché non si chiude...
Ciao

Codice: [Seleziona]

Procedure Calculate(PInput,POutput,PUser: PDLLParams); // Routine è permanente



   begin

       if  PInput^[I0] > 2.5 then ApriOpenDialog;
       if  PInput^[I1] > 2.5 then ApriSaveDialog;


      // piu funzioni


end;




Codice: [Seleziona]

library dialog;

{$mode objfpc}{$H+}

uses
   Interfaces, Classes, SysUtils, Windows, FileUtil, Forms, Controls,
Graphics, Dialogs;
   { you can add units after this }


// questa direttiva l'ho tolta perchè non mi creava la dll, mi sono documentato sul forum lazarus {$R *.RES}




Const  Inputs = 2;  // quantita entrata
        Outputs = 2; // quantita uscita

        {INPUTS}  // nome per numero di entrata
         I0 = 0;  // valore I0 = PInput[I0] ossia PInput[0]
         I1 = 1;  // valore I1 = PInput[I1] ossia PInput[1]
      // I2 = 2;
      // I3 = 3;
// ... I99 = 99;

        {OUTPUTS} // nome per numero di uscita
         Q0 = 0;  // valore Q0 = POutput[Q0] ossia POutput[0]
         Q1 = 1;  // valore Q1 = POutput[Q1] ossia POutput[1]
      // Q2 = 2;
      // Q3 = 3;
// ... Q99 = 99;

        {USER}   // nome per numero di variabile, I valori vengono memorizzati

         U0 = 0; // valore U0 = PUser[U0] ossia PUser[0]
      // U1 = 1;
      // U2 = 2;
      // U3 = 3;
// ... U99 = 99;

// I0,I1,I2,I3,Q0,Q1,Q2,Q3,U0,U1,U2,U3
// I nomi possono essere qualsiasi, sono case-insensitive

type TDLLParams = array[0..100] of Extended; //Type of ProfiLab DLL parameters
     PDLLParams = ^TDLLParams;               // Pointer to ProfiLab DLL parameters

     function ApriSaveDialog: ShortString;
     var pannello: TSaveDialog;
     begin
       pannello :=TSaveDialog.Create(nil);
       pannello.Filter:='*.txt';
       if pannello.Execute then
          result := pannello.FileName
   else
      result := '';


     end;


function ApriOpenDialog: ShortString;
var pannello: TOpenDialog;
begin
   pannello :=  TOpenDialog.Create(nil);
   pannello.Filter:='*.txt';
   if pannello.Execute then
      result := pannello.FileName
   else
      result := '';
end;



function NumInputs: Byte;
begin
   result := Inputs; // trasferire quantita entrata
end;



function NumOutputs: Byte;
begin
   result := Outputs; // trasferire quantita uscita
end;




function InputName(Channel: Byte): ShortString; // trasferire nome di entrata

begin
   case Channel of
    I0 : result := 'I0'; // nome di pin I0
    I1 : result := 'I1'; // nome di pin I1
   end;
end;




Function OutputName(Channel: Byte): ShortString; // trasferire nome di uscita

begin
   case Channel of
    Q0 : result := 'Q0'; // nome di pin Q0
    Q1 : result := 'Q1'; // nome di pin Q1
   end;
end;


Procedure SimStart(PInput,POutput,PUser: PDLLParams); // Routine viene eseguita solo al primo avvio

begin
  // solo per inizializzare
end;


Procedure Calculate(PInput,POutput,PUser: PDLLParams); // Routine è permanente



   begin

       if  PInput^[I0] > 2.5 then ApriOpenDialog;
       if  PInput^[I1] > 2.5 then ApriSaveDialog;


      // piu funzioni


end;


Procedure SimStop(PInput,POutput,PUser: PDLLParams); // Routine viene eseguita solo in fase di chiusura

begin
   // solo in chiusura
end;


//export methods for ProfiLab
exports SimStart,
         SimStop,
         NumInputs,
         NumOutputs,
         Calculate,
         InputName,
         OutputName,
         ApriOpenDialog,
         ApriSaveDialog;
begin
end. 
 
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:DLL con SaveDialog
« Risposta #32 il: Dicembre 27, 2012, 12:24:27 pm »
Una delle tante cose che non capisco è come mai Lazarus genera una dll da 13,8 MB  :o

prova a dare un'occhiata qua
http://www.lazarus.freepascal.org/index.php?topic=7590.0
Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:DLL con SaveDialog
« Risposta #33 il: Dicembre 27, 2012, 12:39:39 pm »
Allora nelle modifiche che ho fatto ho rimesso Extended quindi non dovrebbero esserci problemi, poi in Procedure Calculate ho risolto così si aprono sia OpenDialog che SaveDialog, ma non si chiudono.
Sui 2 ingressi ho messo i controlli poiché il pulsante della mi libreria nel momento che viene premuto genera un 5V quindi si spiega il perché si apre... ma non si spiega il perché non si chiude...

Non so perchè non si chiudono ma c'è un errore abbastanza serio nelle definizioni delle funzioni ApriSaveDialog e ApriOpenDialog.
Nel codice da te postato c'è la creazione dell'istanza ma non c'è la liberazione delle risorse. Questo vuol dire che ogni volta che invochi una di queste funzioni, viene allocata della memoria ma nessuno si preoccupa di restituirla al sistema.
La differenza nella gestione della memoria tra un componente messo su un form a design-time ed uno istanziato a run-time è che:
  • i componenti definiti a design-time sono sia istanziati che liberati automaticamente
  • i componenti istanziati a run-time *devono* essere liberati a run-time

quindi la tua funzione dovrebbe diventare così:

Codice: [Seleziona]
function ApriOpenDialog: ShortString;
var pannello: TOpenDialog;
begin
   pannello :=  TOpenDialog.Create(nil);
   try
      pannello.Filter:='*.txt';
      if pannello.Execute then
         result := pannello.FileName
      else
         result := '';
   finally
      pannello.Free;
   end;

Appena dopo la creazione, in casi come questi, ti consiglio di inserire sempre un blocco try...finally e di mettere nel finally la liberazione delle risorse.
Questo ti mette al riparo da eventuali crash e/o eccezioni e se la tua applicazione dovesse anche subire un arresto non previsto, avresti sempre la certezza di aver liberato la memoria istanziata a run-time.

Ho anche la sensazione che così i dialog potrebbero chiudersi ;)
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1967
  • Karma: +4/-0
Re:DLL con SaveDialog
« Risposta #34 il: Dicembre 27, 2012, 03:10:11 pm »
Una delle tante cose che non capisco è come mai Lazarus genera una dll da 13,8 MB  :o

prova a dare un'occhiata qua
http://www.lazarus.freepascal.org/index.php?topic=7590.0

Nomore. A volte non capisco se nel forum principale c'è gente che riceve soldi dai produttori di dischi o ISP. Sprecano risorse come se fossero gratis. A questi cascare in un cluod insegnerebbe che ogni virgola ha un costo.
Sarà che io sono cresciuto con un turbo modem (56.6k) e mi sentivo un signore. Ora con connessioni più veloci, ti ritrovi che non basta la banda ...

Simon, il ".free" serve a liberare memoria.
Facci sapere se è sufficiente, altrimenti mi è già venuta in mente un'altra modifica al codice ... ;)
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:DLL con SaveDialog
« Risposta #35 il: Dicembre 27, 2012, 04:01:53 pm »
Citazione
Nomore. A volte non capisco se nel forum principale c'è gente che riceve soldi dai produttori di dischi o ISP. Sprecano risorse come se fossero gratis. A questi cascare in un cluod insegnerebbe che ogni virgola ha un costo.
Sarà che io sono cresciuto con un turbo modem (56.6k) e mi sentivo un signore. Ora con connessioni più veloci, ti ritrovi che non basta la banda ...

in effetti questa è una cosa che non ho mai capito...
lasciare nel binario finale le info superflue ma che servono al debug mi può andare anche bene; dover vagare come un rabdomante per capire come rendere normali le dimensioni di un binario da distribuire: no!

speriamo se ne accorgano presto che nell'IDE non c'è un'opzione per ovviare alla cosa...
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1967
  • Karma: +4/-0
Re:DLL con SaveDialog
« Risposta #36 il: Dicembre 27, 2012, 04:17:10 pm »
Naaa, hai presente il discorso che abbiamo fatto con il crucco sulla necessità di ricompilare l'ide al bisogno? Visto che a me la Wind blocca il repo svn di freepascal.
Ha detto che visto che si può, si fà. Non vede il problema ....
(Io spero che la moglie non la pensi come lui, visto che se si trova nella possibilità di renderlo cervo, lo farà perchè si può farlo).
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:DLL con SaveDialog
« Risposta #37 il: Dicembre 27, 2012, 04:47:47 pm »
:D
Imagination is more important than knowledge (A.Einstein)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL con SaveDialog
« Risposta #38 il: Dicembre 27, 2012, 11:03:08 pm »
Ciao
Ho tolto SaveDialog per una prova più mirata:)
Ma genera questo errore:

Codice: [Seleziona]

project1.lpr(65,1) Error: Illegal expression
project1.lpr(65,10) Fatal: Syntax error, ";" expected but "identifier NUMINPUTS" found



Esattamente su qesta riga e non capisco il perché se prima andava bene:)

Codice: [Seleziona]
function NumInputs: Byte;               <--------------questa riga
begin
   result := Inputs; // trasferire quantita entrata
end; 


Codice: [Seleziona]






library dialog;

{$mode objfpc}{$H+}

uses
   Interfaces, Classes, SysUtils, Windows, FileUtil, Forms, Controls,
Graphics, Dialogs;
   { you can add units after this }




Const  Inputs = 2;  // quantita entrata
        Outputs = 2; // quantita uscita

        {INPUTS}  // nome per numero di entrata
         I0 = 0;  // valore I0 = PInput[I0] ossia PInput[0]
         I1 = 1;  // valore I1 = PInput[I1] ossia PInput[1]
      // I2 = 2;
      // I3 = 3;
// ... I99 = 99;

        {OUTPUTS} // nome per numero di uscita
         Q0 = 0;  // valore Q0 = POutput[Q0] ossia POutput[0]
         Q1 = 1;  // valore Q1 = POutput[Q1] ossia POutput[1]
      // Q2 = 2;
      // Q3 = 3;
// ... Q99 = 99;

        {USER}   // nome per numero di variabile, I valori vengono memorizzati

         U0 = 0; // valore U0 = PUser[U0] ossia PUser[0]
      // U1 = 1;
      // U2 = 2;
      // U3 = 3;
// ... U99 = 99;

// I0,I1,I2,I3,Q0,Q1,Q2,Q3,U0,U1,U2,U3
// I nomi possono essere qualsiasi, sono case-insensitive

type TDLLParams = array[0..100] of Extended; //Type of ProfiLab DLL parameters
     PDLLParams = ^TDLLParams;               // Pointer to ProfiLab DLL parameters




function ApriOpenDialog: ShortString;
var pannello: TOpenDialog;
begin
   pannello :=  TOpenDialog.Create(nil);
   try
      pannello.Filter:='*.txt';
      if pannello.Execute then
         result := pannello.FileName
      else
         result := '';
   finally
      pannello.Free;
   end;





function NumInputs: Byte;
begin
   result := Inputs; // trasferire quantita entrata
end;



function NumOutputs: Byte;
begin
   result := Outputs; // trasferire quantita uscita
end;




function InputName(Channel: Byte): ShortString; // trasferire nome di entrata

begin
   case Channel of
    I0 : result := 'I0'; // nome di pin I0
    I1 : result := 'I1'; // nome di pin I1
   end;
end;




Function OutputName(Channel: Byte): ShortString; // trasferire nome di uscita

begin
   case Channel of
    Q0 : result := 'Q0'; // nome di pin Q0
    Q1 : result := 'Q1'; // nome di pin Q1
   end;
end;


Procedure SimStart(PInput,POutput,PUser: PDLLParams); // Routine viene eseguita solo al primo avvio

begin
  // solo per inizializzare
end;


Procedure Calculate(PInput,POutput,PUser: PDLLParams); // Routine è permanente



   begin

       if  PInput^[I0] > 2.5 then ApriOpenDialog;
       if  PInput^[I1] > 2.5 then ApriSaveDialog;


      // piu funzioni


end;


Procedure SimStop(PInput,POutput,PUser: PDLLParams); // Routine viene eseguita solo in fase di chiusura

begin
   // solo in chiusura
end;


//export methods for ProfiLab
exports SimStart,
         SimStop,
         NumInputs,
         NumOutputs,
         Calculate,
         InputName,
         OutputName,
         ApriOpenDialog,
         ApriSaveDialog;
begin
end.       
« Ultima modifica: Dicembre 27, 2012, 11:07:41 pm da Simon75 »
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1967
  • Karma: +4/-0
Re:DLL con SaveDialog
« Risposta #39 il: Dicembre 27, 2012, 11:49:58 pm »
Controlla gli end della funzione prima ...
Codice: [Seleziona]
begin
   pannello :=  TOpenDialog.Create(nil);
   try
      pannello.Filter:='*.txt';
      if pannello.Execute then
         result := pannello.FileName
      else
         result := '';
   finally
      pannello.Free;
   end;

function NumInputs: Byte;

Credo che il compilatore stia cercando di dirti che per lui manca un end per fare quello che vuoi tu ;)
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL con SaveDialog
« Risposta #40 il: Dicembre 27, 2012, 11:57:12 pm »
Che Asino che sono :)
Ma scusa perché ci vanno due end;
per i controlli?
Grazie Stilgard sei sempre presente  ;)
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1967
  • Karma: +4/-0
Re:DLL con SaveDialog
« Risposta #41 il: Dicembre 28, 2012, 12:01:03 am »
Ogni blocco ha un inizio e una fine.
Codice: [Seleziona]
begin <-inizio blocco
   pannello :=  TOpenDialog.Create(nil);
   try <-inizio blocco
      pannello.Filter:='*.txt';
      if pannello.Execute then
         result := pannello.FileName
      else
         result := '';
   finally
      pannello.Free;
   end;<-fine blocco try finally end
end; <- fine blocco begin end
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2132
  • Karma: +8/-1
Re:DLL con SaveDialog
« Risposta #42 il: Dicembre 28, 2012, 01:25:55 am »
mea culpa
mi sa tanto che quando ho copia/incollato ci ho lasciato l'ultimo "end;"
Imagination is more important than knowledge (A.Einstein)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL con SaveDialog
« Risposta #43 il: Dicembre 28, 2012, 02:32:15 am »
nomorelogic grazie funziona molto meglio ma vi saprò dire di più domani, anzi oggi visto l'orario   ;D.
Ma se dovessi far accendere un led sull'uscita della mi dll dovrei creare un altra funzione e poi richiamarla in procedure ?
Vi ringrazio per quello che mi state insegnando.
Ciao
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL con SaveDialog
« Risposta #44 il: Dicembre 28, 2012, 11:08:29 pm »
Ciao

Allora si aprono e si chiudono bene ma a volte rimane premuto il pulsante e quindi non mi fa chiudere la OpenDialog lo stesso capita per la SaveDialog.
Attualmente ho inserito questi controlli in procedure Calculate per garantire la chiusura qundo non lo chiamo.
E poi come prova ho inserito 2 LED sulle ripettive uscite, quindi quando viene premuto il pulsante della OpenDialog si deve accendere un led, se viene premuto il pulsante della SaveDialog si deve accendere l'altro LED.
Ha funzionato ma poi non l'ho visto più accendere.

è giusto come ho scritto?

Codice: [Seleziona]

Procedure Calculate(PInput,POutput,PUser: PDLLParams); // Routine è permanente


   begin

       if  PInput^[I0] >2.5 then ApriOpenDialog
       else PInput^[I0]:=0;
       if  PInput^[I1] >2.5 then ApriSaveDialog
       else PInput^[I1]:=0;
       If  PInput^[I0] >2.5 then POutput^[Q0]:=5
         else POutput^[Q0]:=0;
        If  PInput^[I1] >2.5 then POutput^[Q1]:=5 
       else POutput^[Q1]:=0;

       // accende il led quando viene premuto PInput^[I0] ovvero OpenDilog
       // accende il led quando viene premuto PInput^[I1] ovvero SaveDialog
   

   // piu funzioni


end;   



A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

 

Recenti

How To

Trascinare un file nel programma da xinyiman
DB concetti fondamentali e ZeosLib da xinyiman
Recuperare codice HTML da pagina web da xinyiman
Mandare mail con Lazarus da xinyiman
Stabilire il sistema operativo da xinyiman
Esempio lista in pascal da xinyiman
File INI da xinyiman
Codice di attivazione da xinyiman
Realizzare programmi multilingua da xinyiman
Lavorare con le directory da xinyiman
Utilizzare Unità esterne da Loryea
TTreeView da xinyiman
TTreeview e Menu da xinyiman
Generare controlli RUN-TIME da xinyiman
LazReport, PDF ed immagini da xinyiman
Intercettare tasti premuti da xinyiman
Ampliare Lazarus da xinyiman
Lazarus e la crittografia da xinyiman
System Tray con Lazarus da xinyiman
UIB: Unified Interbase da Microges2000
Il file: questo sconosciuto da Microges2000
Conferma di chiusura di un applicazione da xinyiman
Liste e puntatori da Microges2000
Overload di funzioni da Microges2000
Funzioni a parametri variabili da Microges2000
Proprietà da Microges2000
Conversione numerica da Microges2000
TImage su Form e Panel da Maverich
Indy gestiore server FTP lato Client da Maverich
PopUpMenu sotto Pulsante (TSpeedButton) da Maverich
Direttiva $macro da Microges2000
Toolbar da xinyiman
Evidenziare voci TreeView da Maverich
Visualizzare un file Html esterno da Maverich
StatusBar - aggirare l'errore variabile duplicata da Maverich
Da DataSource a Excel da xinyiman
Le permutazioni da xinyiman
Brute force da xinyiman
Indy 10 - Invio email con allegati da Maverich
La gestione degli errori in Lazarus da xinyiman
Pascal Script da xinyiman
Linux + Zeos + Firebird da xinyiman
Dataset virtuale da xinyiman
Overload di operatori da Microges2000
Lavorare con file in formato JSON con Lazarus da nomorelogic
Zeos ... dietro le quinte (prima parte) da Stilgar
Disporre le finestre in un blocco unico (come Delphi) da Maverich
Aspetto retrò (Cmd Line) da xinyiman
Come interfacciare periferica twain da Narciso
Ubuntu - aggiornare free pascal e lazarus da xinyiman
fpcup: installazioni parallele di lazarus e fpc da nomorelogic
Free Pascal e Lazarus sul Raspberry Pi da nomorelogic
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal. da nomorelogic
Creare un server multithread da xinyiman
guida all'installazione di fpc trunk da subversion in linux gentoo da nomorelogic
Indice da nomorelogic
DB concetti fondamentali e connessioni standard da xinyiman
Advanced Record Syntax da nomorelogic
DB concetti fondamentali e DBGrid da xinyiman
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText da xinyiman
Advanced Record Syntax: un esempio pratico da nomorelogic
Superclasse form base per programmi gestionali (e non) da nomorelogic
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox da nomorelogic
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form da nomorelogic
Superclasse form base per programmi gestionali (e non) #4 - wait animation da nomorelogic
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog da nomorelogic
Installare lazarus su mac osx sierra da xinyiman
immagine docker per lavorare con lazarus e free pascal da nomorelogic
Utenti
Stats
  • Post in totale: 12633
  • Topic in totale: 1570
  • Online Today: 25
  • Online Ever: 520
  • (Novembre 04, 2018, 12:00:31 pm)
Utenti Online
Users: 0
Guests: 15
Total: 15

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.