* * * *

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 28, 2024, 07:21:56 pm

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

320 Visitatori, 1 Utente

Autore Topic: DLL per salvare e richiamare file txt.  (Letto 62437 volte)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #90 il: Gennaio 19, 2013, 03:40:21 pm »
Ciao a tutti,

Ho inserito come const a Leggi e Stampa questo  ''  ma ho dei problemi ti tipo nelle 2 funzioni.

project1.lpr(115,12) Error: Constant and CASE types do not match
project1.lpr(115,12) Error: Ordinal expression expected
project1.lpr(115,12) Error: duplicate case label
project1.lpr(122,13) Error: Constant and CASE types do not match
project1.lpr(122,13) Error: Ordinal expression expected
project1.lpr(242) Fatal: There were 5 errors compiling module, stopping

ciao

Codice: [Seleziona]

const
  Inputs = 3;  // quantita entrata
  Outputs = 1; // quantita uscita

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

  {OUTPUTS}// nome per numero di uscita
  Stampa = '';  // valore Q0 = POutput[Q0] ossia POutput[0]


Codice: [Seleziona]


  function InputName(Channel: byte): ShortString; // trasferire nome di entrata
  begin
    case Channel of
      I0: Result := 'Cerca'; // nome di pin I0
      I1: Result := 'Salva'; // nome di pin I1
      Leggi: Result := '$Leggi';
    end;
  end;

  function OutputName(Channel: byte): ShortString; // trasferire nome di uscita
  begin
    case Channel of
      Stampa: Result := '$Stampa'; // nome di pin Q0
      //Q1: Result := 'Q1'; // nome di pin Q1
    end;
  end;   
« Ultima modifica: Gennaio 19, 2013, 03:42:05 pm da Simon75 »
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 per salvare e richiamare file txt.
« Risposta #91 il: Gennaio 19, 2013, 03:54:36 pm »
Ho inserito come const a Leggi e Stampa questo  ''  ma ho dei problemi ti tipo nelle 2 funzioni.

project1.lpr(115,12) Error: Constant and CASE types do not match
project1.lpr(115,12) Error: Ordinal expression expected
project1.lpr(115,12) Error: duplicate case label
project1.lpr(122,13) Error: Constant and CASE types do not match
project1.lpr(122,13) Error: Ordinal expression expected
project1.lpr(242) Fatal: There were 5 errors compiling module, stopping

In una istruzione CASE, come ti dice il comilatore, si possono usare solo tipi ordinali e le stringhe (Leggi e Stampa) non sono tipi ordinali.
Se devi per forza usare la stringa nulla devi sostituire il CASE con una serie di IF.

Altro errore: I0 e I1 sono si dei tipi ordinali (tutti i numeri interi lo sono) però hanno lo stesso valore e "duplicate case label" vuol dire che hai specificato due volte lo stesso valore in un CASE: non si può, un CASE può rispondere ad alternative mutuamente esclusive.
Imagination is more important than knowledge (A.Einstein)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #92 il: Gennaio 20, 2013, 12:16:55 am »
nomore ho bisogno che mi aiuti a farlo, anche perché c'e una funzione di mezzo.
Codice: [Seleziona]

  function InputName(Channel: byte): ShortString; // trasferire nome di entrata
  begin
    case Channel of
      I0: Result := 'Cerca'; // nome di pin I0
      I1: Result := 'Salva'; // nome di pin I1
      Leggi: Result := '$Leggi';
    end;
  end;

  function OutputName(Channel: byte): ShortString; // trasferire nome di uscita
  begin
    case Channel of
      Stampa: Result := '$Stampa'; // nome di pin Q0
      //Q1: Result := 'Q1'; // nome di pin Q1
    end;
  end;

Non capisco che condizione devo dare, poi Result sarebbe il nome della funzione giusto?
function InputName(Channel: byte): ShortString;
if I0 = Result then 'Cerca' ;
if I1 = Result then 'Salva' ;
if Leggi = Result then '$Leggi';


function OutputName(Channel: byte): ShortString;
if Stampa = Result then '$Stampa';
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 per salvare e richiamare file txt.
« Risposta #93 il: Gennaio 20, 2013, 10:25:55 am »
Codice: [Seleziona]
  function InputName(Channel: byte): ShortString; // trasferire nome di entrata
  begin
    case Channel of
      I0: Result := 'Cerca'; // nome di pin I0
      I1: Result := 'Salva'; // nome di pin I1
      Leggi: Result := '$Leggi';
    end;
  end;

anche io ho bisogno di aiuto, non capisco che c'è da fare

insomma, togliendo il case dovresti scrivere:
Codice: [Seleziona]
// decommenta sotto nel caso Leggi sia un valore di default
// Result := '$Leggi';

if Channel = I0 then
   Result := 'Cerca';
if Channel = I1 then
   Result := 'Salva';

poi, da quello che hai scritto io capisco: "se Channel = Leggi".
Ma Leggi non è un canale, che ruolo ha allora?
Se è un valore di default decommenta come scritto sopra nel codice.

Il problema però non lo risolvi: la correzione sopra ti permette di compilare ma rimane il bug concettuale in quanto I0 e I1 hanno lo stesso valore (cioè 0) ==> sono lo stesso canale ==> la funzione (per Channel = 0) restituirà sempre e comunque "Salva".
Il "case" anche se non ti compila è giusto, il bug sta nel fatto che hai dichiarato questo:

Codice: [Seleziona]
const
 {INPUTS}// nome per numero di entrata
  I0 = 0;  // valore I0 = PInput[I0] ossia PInput[0]
  I1 = 0;  // valore I1 = PInput[I1] ossia PInput[1]

Probabilmente I0 e I1 devono avere valori diversi, o no?
« Ultima modifica: Gennaio 20, 2013, 10:28:06 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #94 il: Gennaio 20, 2013, 10:28:42 pm »
Si Leggi è un canale d'ingresso, ma ho problemi di tipo perché ho messo come nullo la costante Leggi e Stampa  :)

project1.lpr(117,8) Error: Incompatible types: got "Byte" expected "AnsiString"
project1.lpr(128,8) Error: Incompatible types: got "Byte" expected "AnsiString"
project1.lpr(256) Fatal: There were 2 errors compiling module, stopping


Codice: [Seleziona]


const
  Inputs = 3;  // quantita entrata
  Outputs = 1; // 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]
  Leggi = '';
  // I3 = 3;
  // ... I99 = 99;

  {OUTPUTS}// nome per numero di uscita
  Stampa = '';

Codice: [Seleziona]

 function InputName(Channel: byte): ShortString; // trasferire nome di entrata
  begin
    //case Channel of
    if Channel = I0 then
      Result := 'Cerca';
    if Channel = I1 then
      Result := 'Salva';
    if Channel = Leggi then
      Result := '$Leggi';

Codice: [Seleziona]

function OutputName(Channel: byte): ShortString; // trasferire nome di uscita
  begin
    //case Channel of
    if Channel = Stampa then
      Result := '$Stampa';
« Ultima modifica: Gennaio 20, 2013, 10:30:14 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 per salvare e richiamare file txt.
« Risposta #95 il: Gennaio 21, 2013, 09:49:16 am »
STRINGHE
Codice: [Seleziona]
  Leggi = '';
  Stampa = '';

NUMERI
Codice: [Seleziona]
function OutputName(Channel: byte): ShortString; // trasferire nome di uscita

Codice: [Seleziona]
    if Channel = Stampa then

Che siano stringhe vuote o meno, il compilatore ti avvisa che stai confrontando tipo diversi e incompatibli.

Codice: [Seleziona]
  Leggi = $01;
  Stampa = '$02;

Con sto leggi e stampa stai facendo un casino pazzesco.
Inizia con dare nomi alle variabili che ti aiutino a capire cosa stai facendo.

Codice: [Seleziona]
  NomeDellPinLeggi = '';
  NomeDellPinStampa = '';

  NumeroDelPinLettura=$01;
  NumeroDelPinStampa=$02;

Sono gratis i caratteri, non hai problemi ad aggiungere linee di comunicazione tra le funzioni.

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #96 il: Gennaio 21, 2013, 04:01:49 pm »
Citazione
ho bisogno queste costanti nulle es: Leggi=''; Stampa='';
[/quote]

Dipende.
1) non sono nulle,  ma vuote.
Nulle vuole dire 0x00, ma nel caso di stringa vuota, non è a 0x00.
2) Cosa ne devi fare?
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 per salvare e richiamare file txt.
« Risposta #97 il: Gennaio 21, 2013, 04:08:35 pm »
Ho bisogno che Stampa sia vuoto, perchè nel momento che attivo il simulatore lui mi genera nel display il valore 0 che è la costante.
stessa cosa per Leggi che è l'ingresso lo vorrei vuoto. :)
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 per salvare e richiamare file txt.
« Risposta #98 il: Gennaio 21, 2013, 06:49:08 pm »
Codice: [Seleziona]

function OutputName(Channel: byte): ShortString; // trasferire nome di uscita
  begin
    //case Channel of
    if Channel = Stampa then
      Result := '$Stampa';

cerchiamo di capirci:
  • Channel --> è un numero
  • Stampa --> è una stringa

quando scrivi:
Codice: [Seleziona]
if Channel = Stampa then
è come se scrivi:
Codice: [Seleziona]
if 87 = 'ciao' then

l'unica cosa che puoi fare è "far finta" che il valore numerico -1 rappresenti la tua stringa nulla per cui potresti scrivere
Codice: [Seleziona]
if Channel = -1 then

Il problema è che ti stiamo dando consigli che nessuno di noi sa se sono contestualizzati con quello che devi fare...
Imagination is more important than knowledge (A.Einstein)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #99 il: Gennaio 22, 2013, 02:52:56 pm »
Grazie Nomore e Stilgar vi ho stressato fin troppo, se Legolas puo farmi un piacere è meglio poichè ha provato il software.
Ciao Legolas hai tempo di provare la dll e verificare perchè non salva bene e non legge?
Ho allegato la parte di profilab manca da caricare la dll e provare. :)
Grazie

Codice: [Seleziona]
library project1;

{$mode objfpc}{$H+}

uses
  Interfaces,
  Classes,
  SysUtils,
  Windows,
  FileUtil,
  Forms,
  Controls,
  Graphics,
  Dialogs,
  ShellApi;

const
  Inputs = 3;  // quantita entrata
  Outputs = 1; // 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]
  Leggi = 2;
  // I3 = 3;
  // ... I99 = 99;

  {OUTPUTS}// nome per numero di uscita
  Stampa = 0;  // valore Q0 = POutput[Q0] ossia POutput[0]
  //Q1 = 1;  // valore Q1 = POutput[Q1] ossia POutput[1]

  // 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
var
  globalDialog: TFileDialog;

type

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

  TStringParams = array[0..100] of PChar;   //Type of ProfiLab DLL parameters
  PStringParams = ^TStringParams;        // Pointer to ProfiLab DLL parameters


  function ApriSaveDialog: ShortString;

  begin
    Result := '';
    if not assigned(globalDialog) then
    begin
      globalDialog := TSaveDialog.Create(nil);
      try
        globalDialog.DefaultExt := 'txt';

        globalDialog.Filter := '*.txt';
        if globalDialog.Execute then
          Result := globalDialog.FileName
        else
          Result := '';
      finally
        FreeAndNil(globalDialog);
      end;
    end;
  end;




  function ApriOpenDialog: ShortString;
  begin
    Result := '';
    if not assigned(globalDialog) then
    begin
      globalDialog := TOpenDialog.Create(nil);
      try
        globalDialog.DefaultExt := 'txt';
        globalDialog.Filter := '*.txt';
        if globalDialog.Execute then
          Result := globalDialog.FileName
        else
          Result := '';
      finally
        FreeAndNil(globalDialog);
      end;
    end;
  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
      Leggi: Result := '$Leggi';
    end;
  end;

  function OutputName(Channel: byte): ShortString; // trasferire nome di uscita
  begin
    case Channel of
      Stampa: Result := '$Stampa'; // 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

  end;


  procedure SalvaArrayInFile(FileName: string; PAParams: PDLLParams);
  var
    i: integer;
    sl: TStringList;
  begin
    sl := TStringList.Create;
    try
      for i := low(PAParams^) to high(PAParams^) do
        if i <> 5 then
          Write(i);
      if PAParams^[i] <> 0 then


        sl.Add(FloatToStr(PAParams^[i]));


      sl.SaveToFile(FileName);
    finally
      sl.Free;
    end;
  end;

  procedure CaricaArrayDaFile(FileName: string; PAParams: PDLLParams);
  var
    i: integer;
    sl: TStringList;
    e: extended;
    s: string;
  begin

    sl := TStringList.Create;
    try
      sl.LoadFromFile(FileName);
      for i := low(PAParams^) to high(PAParams^) do

      begin

        s := sl.Values[IntToStr(i)];
        e := StrToFloat(s);
        PAParams^[i] := e;

      end;
    finally
      sl.Free;
    end;
  end;


  procedure CalculateEx(PInput, POutput, PUser: PDLLParams; PStrings: PStringParams);
  // Routine è permanente

  var
    i: integer;
    sl: TStringList;
    s: string;

  begin

    if PInput^[I0] > 2.5 then
    begin
      s := ApriOpenDialog;
      if s <> '' then
        CaricaArrayDaFile(s, POutput);
    end;

    if PInput^[I1] > 2.5 then

    begin

      s := ApriSaveDialog;
      if s <> '' then
        SalvaArrayInFile(s, PInput);
    end;

  end;




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

  end;


  //export methods for ProfiLab
exports
  SimStart,
  SimStop,
  NumInputs,
  NumOutputs,
  CalculateEx,
  InputName,
  OutputName,
  ApriOpenDialog,
  ApriSaveDialog;
begin
end.

« Ultima modifica: Gennaio 22, 2013, 03:17:35 pm da Simon75 »
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Legolas

  • Global Moderator
  • Sr. Member
  • *****
  • Post: 366
  • Karma: +3/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #100 il: Gennaio 22, 2013, 03:27:57 pm »
Ok, posso provare stasera, perché rientro tardi dal lavoro ;)

Legolas

  • Global Moderator
  • Sr. Member
  • *****
  • Post: 366
  • Karma: +3/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #101 il: Gennaio 23, 2013, 03:54:05 pm »
Allora, ho spulciato per benino il progettino e i sorgenti della dll. Mi incuriosiva il problema del 5 non voluto. Da dove viene? Nella dll abbiamo 3 canali di input e 1 di output. I canali di input sono così impiegati:

Canale 1 -> tasto salva
Canale 2 -> tasto carica
Canale 3 -> campo "Leggi"

Il canale di output invece è impiegato per la casella di testo "Stampa"

Nella procedura di salvataggio dell'array viene salvato lo stato dei 3 canali di input. Il 5 è lo stato di "premuto" del tasto di apertura della dialog.
Nella procedura di caricamento dell'array da file viene copiato il contenuto dei 3 canali di input sui canali di output. Siccome il primo canale di input (cioè lo stato del tasto che apre la dialog) è 5, allora il valore 5 viene copiato nel primo canale di output. Per questo motivo ti trovi quel 5 non voluto.

Soluzione? Trovare un sistema più consono per il salvataggio e il caricamento dei dati. Potresti ad esempio provare a salvare solo i canali che ti servono, sia input che output.


Devi anche fare in modo che le dialog non rimangano sempre aperte, cosa che adesso succede. Nell'esempio di dll in delphi c'è qualcosa a riguardo. Dovrebbe essere qualcosa di simile:

Codice: [Seleziona]
    
    if PInput^[I0] > 2.5 then
    begin
      if (PInput^[I0] > 2.5) and not(PUser^[U0] > 2.5) then
      begin
        s := ApriOpenDialog;
        if s <> '' then
        CaricaArrayDaFile(s, POutput);
      end;
      PUser^[U0]:=PInput^[I0];

fermo restando che c'è da modificare CaricaArrayDaFile e SalvaArrayInFile

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #102 il: Gennaio 23, 2013, 09:41:38 pm »
Ciao Legolas,

Citazione

Potresti ad esempio provare a salvare solo i canali che ti servono, sia input che output.


Come faccio a salvare solo i canali che mi servono?
Per salvare sono costretto a premere il Canale 1 -> tasto salva e di conseguenza mi salva il 5 perché esce un valore 5 da quel tasto.


Citazione

Devi anche fare in modo che le dialog non rimangano sempre aperte, cosa che adesso succede. Nell'esempio di dll in delphi c'è qualcosa a riguardo.

Si le dialog rimangono aperte perché il tasto rimane premuto se provi a ripremere il tasto si sblocca e poi si riesce a chiuderle, certamente non va bene così, spero di risolvere con quel codice che mi hai scritto.

Citazione

fermo restando che c'è da modificare CaricaArrayDaFile e SalvaArrayInFile

Non ho idea di come fare :o :)

Mi puoi spiegare questo : if (PInput^[I0] > 2.5) and not(PUser^[U0] > 2.5) then
il PUser cosa serve?
Grazie
« Ultima modifica: Gennaio 23, 2013, 09:44:17 pm da Simon75 »
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Legolas

  • Global Moderator
  • Sr. Member
  • *****
  • Post: 366
  • Karma: +3/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #103 il: Gennaio 23, 2013, 10:15:21 pm »
Come faccio a salvare solo i canali che mi servono?
Per salvare sono costretto a premere il Canale 1 -> tasto salva e di conseguenza mi salva il 5 perché esce un valore 5 da quel tasto.

No, la conseguenza è che assegni il valore sbagliato al controllo sbagliato. Se il valore 5 lo salvi dal canale 1 degli input, perché poi lo assegni al canale 1 degli output?
Citazione
Citazione

fermo restando che c'è da modificare CaricaArrayDaFile e SalvaArrayInFile

Non ho idea di come fare :o :)

Semplice, invece di salvare tutto l'array, ti salvi soltanto i valori che ti servono, ad esempio il canale 3 degli input e il canale 1 dell'output. Così, quando li vai a rileggere, non devi fare altro che assegnare il primo valore alla casella di input e il secondo a quella di output

Citazione
Mi puoi spiegare questo : if (PInput^[I0] > 2.5) and not(PUser^[U0] > 2.5) then
il PUser cosa serve?
Grazie

PUser[U0] è una variabile di appoggio in cui viene inserito lo stato precedente del tasto, così sai se è già stato premuto e non riapre la dialog se non serve :)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:DLL per salvare e richiamare file txt.
« Risposta #104 il: Gennaio 24, 2013, 01:58:10 pm »
Ciao Legolas,

Citazione
Se il valore 5 lo salvi dal canale 1 degli input, perché poi lo assegni al canale 1 degli output?


Mi puoi indicare dove lo sto assegnando?
dici qua? oppure devo modificare le costanti?
Codice: [Seleziona]

function OutputName(Channel: byte): ShortString; // trasferire nome di uscita
  begin
    case Channel of
      Stampa: Result := '$Stampa'; // nome di pin Q0
      //Q1: Result := 'Q1'; // nome di pin Q1
    end;
  end;                                         


Citazione

invece di salvare tutto l'array, ti salvi soltanto i valori che ti servono, ad esempio il canale 3 degli input e il canale 1 dell'output.

Questa modifica la devo fare qui?

Codice: [Seleziona]
procedure SalvaArrayInFile(FileName: string; PAParams: PDLLParams);
  var
    i: integer;
    sl: TStringList;
  begin
    sl := TStringList.Create;
    try
      for i := low(PAParams^) to high(PAParams^) do

        if PAParams^[i] <> 0 then


          sl.Add(FloatToStr(PAParams^[i]));


      sl.SaveToFile(FileName);
    finally
      sl.Free;
    end;
  end;

  procedure CaricaArrayDaFile(FileName: string; PAParams: PDLLParams);
  var
    i: integer;
    sl: TStringList;
    e: extended;
    s: string;
  begin

    sl := TStringList.Create;
    try
      sl.LoadFromFile(FileName);
      for i := low(PAParams^) to high(PAParams^) do

      begin

        s := sl.Values[IntToStr(i)];
        e := StrToFloat(s);
        PAParams^[i] := e;

      end;
    finally
      sl.Free;
    end;
  end;

Citazione

PUser[U0] è una variabile di appoggio in cui viene inserito lo stato precedente del tasto, così sai se è già stato premuto e non riapre la dialog se non serve

Attualmente si apre e si chiude bene, ma una volta aperto i dialog non posso più riaprili   :o

Ti ringrazio  :)

Ti allego tutta la dll che ho modificato

Codice: [Seleziona]


library project1;

{$mode objfpc}{$H+}

uses
  Interfaces,
  Classes,
  SysUtils,
  Windows,
  FileUtil,
  Forms,
  Controls,
  Graphics,
  Dialogs,
  ShellApi;

const
  Inputs = 3;  // quantita entrata
  Outputs = 1; // 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]
  Leggi = 2;
  // I3 = 3;
  // ... I99 = 99;

  {OUTPUTS}// nome per numero di uscita
  Stampa = 0;  // valore Q0 = POutput[Q0] ossia POutput[0]
  //Q1 = 1;  // valore Q1 = POutput[Q1] ossia POutput[1]

  // 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
var
  globalDialog: TFileDialog;

type

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

  TStringParams = array[0..100] of PChar;   //Type of ProfiLab DLL parameters
  PStringParams = ^TStringParams;        // Pointer to ProfiLab DLL parameters


  function ApriSaveDialog: ShortString;

  begin
    Result := '';
    if not assigned(globalDialog) then
    begin
      globalDialog := TSaveDialog.Create(nil);
      try
        globalDialog.DefaultExt := 'txt';

        globalDialog.Filter := '*.txt';
        if globalDialog.Execute then
          Result := globalDialog.FileName
        else
          Result := '';
      finally
        FreeAndNil(globalDialog);
      end;
    end;
  end;




  function ApriOpenDialog: ShortString;
  begin
    Result := '';
    if not assigned(globalDialog) then
    begin
      globalDialog := TOpenDialog.Create(nil);
      try
        globalDialog.DefaultExt := 'txt';
        globalDialog.Filter := '*.txt';
        if globalDialog.Execute then
          Result := globalDialog.FileName
        else
          Result := '';
      finally
        FreeAndNil(globalDialog);
      end;
    end;
  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
      Leggi: Result := '$Leggi';
    end;
  end;

  function OutputName(Channel: byte): ShortString; // trasferire nome di uscita
  begin
    case Channel of
      Stampa: Result := '$Stampa'; // 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

  end;


  procedure SalvaArrayInFile(FileName: string; PAParams: PDLLParams);
  var
    i: integer;
    sl: TStringList;
  begin
    sl := TStringList.Create;
    try
      for i := low(PAParams^) to high(PAParams^) do

        if PAParams^[i] <> 0 then


          sl.Add(FloatToStr(PAParams^[i]));


      sl.SaveToFile(FileName);
    finally
      sl.Free;
    end;
  end;

  procedure CaricaArrayDaFile(FileName: string; PAParams: PDLLParams);
  var
    i: integer;
    sl: TStringList;
    e: extended;
    s: string;
  begin

    sl := TStringList.Create;
    try
      sl.LoadFromFile(FileName);
      for i := low(PAParams^) to high(PAParams^) do

      begin

        s := sl.Values[IntToStr(i)];
        e := StrToFloat(s);
        PAParams^[i] := e;

      end;
    finally
      sl.Free;
    end;
  end;


  procedure CalculateEx(PInput, POutput, PUser: PDLLParams; PStrings: PStringParams);
  // Routine è permanente

  var
    i: integer;
    sl: TStringList;
    s: string;

  begin

    if PInput^[I0] > 2.5 then
    begin
      if (PInput^[I0] > 2.5) and not (PUser^[U0] > 2.5) then
      begin
        s := ApriOpenDialog;
        if s <> '' then
          CaricaArrayDaFile(s, POutput);
      end;
      PUser^[U0] := PInput^[I0];

    end;



    if PInput^[I1] > 2.5 then

    begin
      if (PInput^[I1] > 2.5) and not (PUser^[U0] > 2.5) then
      begin
        s := ApriSaveDialog;
        if s <> '' then
          SalvaArrayInFile(s, PInput);
      end;
      PUser^[U0] := PInput^[I1];

    end;

  end;




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

  end;


  //export methods for ProfiLab
exports
  SimStart,
  SimStop,
  NumInputs,
  NumOutputs,
  CalculateEx,
  InputName,
  OutputName,
  ApriOpenDialog,
  ApriSaveDialog;
begin
end.


« Ultima modifica: Gennaio 24, 2013, 02:01:34 pm da Simon75 »
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18781
  • Topic in totale: 2235
  • Online Today: 327
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 320
Total: 321

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.