Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Delphi] Come utilizzare una function

    Salve, ho iniziato da pochi giorni a dedicarmi a Delphi (ho programmato in VB6 per diversi anni) e sono in difficoltà ad utilizzare la seguente function che dovrebbe servire a convertire in lettere un valore di tipo Currency:

    codice:
    function NumeroToStringa(Numero: Currency) : string;
    const
      LIMITE_STRINGA = '#';
    var
      Negativo : boolean;
      Intero     : currency;
      TempIntero : currency;
      Resto      : integer ;
      Triplette  : integer ;
      nI         : integer ;
      Multiplo   : currency;
      FinoA999   : integer ;
      strFinoA999: string  ;
      Stringa    : string  ;
    
      // funzioni IntPow prese da libreria xProcs
      function IntPow(Base,Expo: Integer): Integer;
      var
        Loop             : Word;
      begin
        Result:=1;
        for Loop:=1 to Expo do Result:=Result*Base;
      end;
    
      function IntPow10(Exponent: Integer): Integer;
      begin
        Result:=IntPow(10,Exponent);
      end;
    
      // esegue il lavoro di creazione della stringa base
      function IntToStrFinoA999(var FinoA999: integer ): string;
      var
        temp      : string;
        centinaia : byte  ;
        decine    : byte  ;
        unita     : byte  ;
      begin
    
        if FinoA999 > 10 then begin
          centinaia := 0 ;
          decine    := 0 ;
          unita     := FinoA999 ;
        end else if FinoA999 > 100 then begin
          centinaia := 0 ;
          decine    := Trunc(FinoA999/10) ;
          unita     := FinoA999 - decine * 10 ;
        end else begin
          centinaia := Trunc(FinoA999/100) ;
          decine    := Trunc(FinoA999/10) - centinaia * 10 ;
          unita     := (FinoA999 - centinaia * 100) - decine * 10 ;
        end ;
    
        case unita of
          0 : temp := ''       ;
          1 : temp := 'uno'    ;
          2 : temp := 'due'    ;
          3 : temp := 'tre'    ;
          4 : temp := 'quattro';
          5 : temp := 'cinque' ;
          6 : temp := 'sei'    ;
          7 : temp := 'sette'  ;
          8 : temp := 'otto'   ;
          9 : temp := 'nove'   ;
        end ;
        case decine of
          0 : ; // lascia temp com'è
          1 : case unita of
                0 : temp := 'dieci'      ;
                1 : temp := 'undici'     ;
                2 : temp := 'dodici'     ;
                3 : temp := 'tredici'    ;
                4 : temp := 'quattordici';
                5 : temp := 'quindici'   ;
                6 : temp := 'sedici'     ;
                7 : temp := 'diciassette';
                8 : temp := 'diciotto'   ;
                9 : temp := 'diciannove' ;
              end ;
          2 : case unita of
                 1      : temp := 'ventuno'     ;
                 2..9,0 : temp := 'venti' + temp;
               end ;
          3 : case unita of
                 1      : temp := 'trentuno'     ;
                 2..9,0 : temp := 'trenta' + temp;
               end ;
          4 : case unita of
                 1      : temp := 'quarantuno'     ;
                 2..9,0 : temp := 'quaranta' + temp;
               end ;
          5 : case unita of
                 1      : temp := 'cinquantuno'     ;
                 2..9,0 : temp := 'cinquanta' + temp;
               end ;
          6 : case unita of
                 1      : temp := 'sessantuno'     ;
                 2..9,0 : temp := 'sessanta' + temp;
               end ;
          7 : case unita of
                 1      : temp := 'settantuno'     ;
                 2..9,0 : temp := 'settanta' + temp;
               end ;
          8 : case unita of
                 1      : temp := 'ottantuno'  ;
                 2..9,0 : temp := 'ottanta' + temp;
               end ;
          9 : case unita of
                 1      : temp := 'novantuno'     ;
                 2..9,0 : temp := 'novanta' + temp;
               end ;
        end ;
        case centinaia of
          1 :  temp := 'cento'        + temp ;
          2 :  temp := 'duecento'     + temp ;
          3 :  temp := 'trecento'     + temp ;
          4 :  temp := 'quattrocento' + temp ;
          5 :  temp := 'cinquecento'  + temp ;
          6 :  temp := 'seicento'     + temp ;
          7 :  temp := 'settecento'   + temp ;
          8 :  temp := 'ottocento'    + temp ;
          9 :  temp := 'novecento'    + temp ;
          0 :  ;
        end ;
        Result := temp ;
      end ;  {function IntToStrFinoA999}
    
    begin
      // Se il segno è negativo lo metto subito positivo
      if Numero > 0 then
       begin
         Numero := numero * -1;
         Negativo := true
       end else Negativo := false;
    
      // del numero divido la parte intera e i centesimi
      Intero := Int(Numero);
      Resto  := Round(Frac(Numero) * 100);
    
      if Intero = 0 then
        Stringa := 'zero'
      else begin
        // guardo quanti moltiplicatori a 1000
        Triplette := ( Length(CurrToStr(Intero)) + 2 ) div 3;
    
        For nI := 1 to Triplette do begin
          TempIntero := Int(Intero / IntPow10((nI -1)*3));
          Multiplo   := Int(TempIntero / IntPow10(3));
          FinoA999   := Trunc(TempIntero - Multiplo * IntPow10(3));
          strFinoA999 := IntToStrFinoA999(FinoA999);
          case nI of
            //fino a 1000
            1 : Stringa := strFinoA999;
            //fino a un milione
            2 : if strFinoA999 = '' then
                 // nulla
                else if strFinoA999 = 'uno' then
                  Stringa := 'mille' + Stringa
                else Stringa := strFinoA999 + 'mila' + Stringa;
            //fino a un miliardo
            3 : if strFinoA999 = '' then
                 // nulla
                else if strFinoA999 = 'uno' then
                  Stringa := 'unmilione' + Stringa
                else Stringa := strFinoA999 + 'milioni' + Stringa;
            //fino a 1000 miliardi
            4 : if strFinoA999 = '' then
                  // nulla
                else if strFinoA999 = 'uno' then
                  Stringa := 'unmiliardo' + Stringa
                else Stringa := strFinoA999 + 'miliardi' + Stringa;
          end;
        end;
      end ;
    
      // aggiunge i centesimi
      if Resto <> 0 then begin
        strFinoA999 := IntToStrFinoA999(Resto);
        Stringa := Stringa + ' e ' + strFinoA999 + ' centesimi';
      end;
      // aggiunge i terminatori
      if negativo then Stringa := '- '+stringa;
      Stringa := LIMITE_STRINGA + Stringa + LIMITE_STRINGA;
      Result := UpperCase(Stringa) ;
    end ;
    Dopo aver inserito sul form un controllo Edit (txtNumero), una Label (lblNumero), ed un pulsante (cmdConverti), ho provato a richiamare la function nel seguente modo, ma senza successo:

    codice:
    procedure TForm1.cmdConvertiClick(Sender: TObject);
    begin
    
    	lblStringa.Caption := NumeroToStringa(StrToCurr(txtNumero.Text));
    
    end;
    Il codice da me utilizzato restituisce soltanto alcuni caratteri cancelletto, ma nessuna stringa.

    Qualcuno saprebbe indicarmi dov'è l'errore?

    Grazie in anticipo.
    http://www.espositosoftware.it

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Delphi include una funzione in grado di trasformare un valore di tipo Currency in String: la funzione si chiama CurrToStr.

    Il fatto che tu abbia implementato una funzione "custom", però, mi fa sospettare che forse avevi già individuato la funzione menzionata sopra ma che, per qualche motivo, tale funzione non soddisfi le tue esigenze.

    Ad ogni modo, se ti era sfuggita semplicemente la funzione di cui sopra, ti basta fare uso di quella per convertire un valore Currency in una stringa; in caso contrario, spiega bene quali sono le caratteristiche che dovrà avere la stringa ottenuta dalla conversione e formattazione del valore... forse si riesce a risolvere il problema sfruttando le opzioni di formattazione che possono essere passate come argomento alla funzione.

    Nel sito che ti ho riportato sopra ci sono molti esempi e indicazioni sulle funzioni utilizzate più comunemente che fanno parte della libreria VCL di Delphi; anche la Guida in linea, benché non all'altezza della documentazione di MSDN in termini di "quantità di argomenti", contiene molte informazioni.

    In particolare, se non ricordo male, proprio per chi proviene da Visual Basic è presente un argomento specifico che elenca tutte le funzioni Delphi corrispondenti alle funzioni di runtime di VB6.

    Ricordo di aver visto anche un sito che conteneva "template" (utilizzabili da D2006 in poi) in grado di trasformare automaticamente il nome di una funzione VB6 appena digitato nel corrispondente in Delphi.

    Esistono poi alcune unit che forniscono funzioni tipiche di VB6, con lo stesso nome, che si rifanno poi alle funzioni comunemente utilizzate in Delphi (ad esempio, la unit StrUtils che contiene qualche Left, Mid, Right ricondotte poi all'uso della funzione Delphi omnicomprensiva Copy).

    Buona programmazione con Delphi!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    la chiamata alla funzione è corretta, quello che è sbagliato è l'algoritmo.
    Mi è caduto l'occhio sulla parte

    ...
    // Se il segno è negativo lo metto subito positivo
    if Numero > 0 then
    begin
    Numero := numero * -1;
    Negativo := true
    end else Negativo := false;
    ...
    dove devi scrivere
    if Numero < 0 then

    facendo questa correzione funzione fino al 10, per il resto riguardatelo con calma
    ciao
    sergio

  4. #4
    Grazie, Sergio. L'errore era proprio quello che mi hai segnalato: nella function, ho invertito tutti i segni "<" con ">". Ora funziona a pennello.

    Grazie, Alka, per il link. Riguardo a CurrToStr, a me serviva convertire una cifra non solo in un valore stringa ma anche in lettere, ossia volevo che "1" restituisse "UNO", cosa che la function (corretta) ora riesce a fare.

    Grazie anche per avermi augurato buona programmazione con Delphi. In effetti, forse questo linguaggio rappresenta l'unica alternativa credibile al VB6, essendo decisamente più potente e supportando, contemporaneamente, applicazioni COM e .NET. Come ho fatto a vivere senza Delphi fino ad oggi?
    http://www.espositosoftware.it

  5. #5
    Originariamente inviato da esposito
    ...
    Come ho fatto a vivere senza Delphi fino ad oggi?
    se ti va di avventurarti nel mondo open source ti consegno if Free Pascal Compiler (fpc) pienamente compatibile con Delphi (non saprei dirti fino a che versione, io ho D7).
    Come IDE puoi scaricarti lazarus (sempre dal sito fpc), RAD e clone quasi perfetto di Delphi, e per alcuni aspetti superiore.
    Per entrambi esisteno le versioni per win e linux, per win scarichi direttamente i binari, per linux te li devi compilare.

    buon lavoro
    sergio

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da esposito
    Grazie, Alka, per il link. Riguardo a CurrToStr, a me serviva convertire una cifra non solo in un valore stringa ma anche in lettere, ossia volevo che "1" restituisse "UNO", cosa che la function (corretta) ora riesce a fare.
    Ah ok, allora non avevo proprio compreso cosa dovesse fare precisamente la funzione.

    Originariamente inviato da esposito
    Grazie anche per avermi augurato buona programmazione con Delphi. In effetti, forse questo linguaggio rappresenta l'unica alternativa credibile al VB6, essendo decisamente più potente e supportando, contemporaneamente, applicazioni COM e .NET. Come ho fatto a vivere senza Delphi fino ad oggi?
    E' la domanda che mi faccio io stesso da anni, ma sostituendo "come ho fatto" con "come avrei fatto"...

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da mondobimbi
    se ti va di avventurarti nel mondo open source ti consegno if Free Pascal Compiler (fpc) pienamente compatibile con Delphi (non saprei dirti fino a che versione, io ho D7).
    Sul "pienamente", non ci metterei la mano sul fuoco. Più che altro, il compilatore Delphi di Borland è una macchina molto particolare, decisamente performante oltre al fatto che il linguaggio vanta nuove caratteristiche ad ogni versione.

    Originariamente inviato da mondobimbi
    Come IDE puoi scaricarti lazarus (sempre dal sito fpc), RAD e clone quasi perfetto di Delphi, e per alcuni aspetti superiore.
    L'unico aspetto che può intendersi come "realmente superiore" in Lazarus è dato dal supporto multipiattaforma del compilatore, benché questo richieda alcuni accorgimenti e pratiche differenti rispetto a Delphi che, se si sviluppa in Windows, possono risultare alquanto limitanti, oltre al fatto che gli eseguibili generati, almeno da prove che ho fatto tempo addietro, sono piuttosto voluminosi in quanto includono la parte runtime dell'ambiente e, considerando la caratteristica multipiattaforma, essa si ingrandisce notevolmente (da 4MB a 200/300 Kb, c'è una bella differenza).

    A parte questo fattore, Delphi, specialmente l'ultima versione (con buone speranze per quelle in cantiere che si sviluppano in seno alla nuova società DevCo) possiede molte funzionalità in più, sia a livello di IDE, di librerie e di strumenti "enterprise".

    Insomma, nonostante la somiglianza di Lazarus, Delphi è visibilmente improntato ad un tipo differente di applicazioni e di sviluppo delle stesse.

    Occorre ricordare - per chi ne fa uso - che Lazarus non supporta la piattaforma .NET (dal gruppo di FPC, il supporto è stato giudicato "impossibile", mentre Delphi incorpora tale compilatore, quindi evidentemente così impossibile da realizzare non era, ma probabilmente la restrizione è data dal target dei due compilatori e ambienti).

    In ogni caso, è sempre un'opportunità sfruttabile e un'ottima segnalazione, non si può mai sapere...

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    A proposito di freeware (non di open source), forse non sapete che la versione PERSONAL di Delphi 2005 (quella che uso io) è completamente gratuita e può essere utilizzata anche per fini commerciali, contrariamente alle edizioni Personal delle precedenti versioni di Delphi, che consentivano di distribuire solo prodotti freeware.

    Per le mie esigenze, Delphi 2005 Personal è più che sufficiente. Tuttavia, qualora dovessero sorgere necessità particolari, provvederò ad acquistare la versione Professional.
    http://www.espositosoftware.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.