* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

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

Inserisci il nome utente, la password e la durata della sessione.

414 Visitatori, 0 Utenti

Autore Topic: DLL con SaveDialog  (Letto 36565 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: 2870
  • Karma: +20/-4
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: 2870
  • Karma: +20/-4
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: 2382
  • Karma: +10/-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: 2870
  • Karma: +20/-4
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: 2382
  • Karma: +10/-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: 2870
  • Karma: +20/-4
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: 2382
  • Karma: +10/-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: 2382
  • Karma: +10/-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: 2870
  • Karma: +20/-4
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

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18772
  • Topic in totale: 2233
  • Online Today: 578
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 414
Total: 414

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.