Il Preprocessore di Delphi

di il
13 risposte

Il Preprocessore di Delphi

Premetto che ogni volta che apro un nuovo post lo faccio quasi a malincuore perchè mi sembra di “spammare” il forum.

Spero diventi un qualcosa di utile non solo a me,ma anche a chi si imbatte in simili problemi.

Tiro fuori l'argomento Preprocessore,perchè imbattendomi in una simile direttiva,mi è venuto in mente il fatto che lo stesso Preprocessore possa risolvere l'odioso problema dell'ambiguità delle librerie;

se io sto lavorando ad un'applicazione Android,mi servo della libreria Firemonkey(FMX).Quindi utilizzo un oggetto come TImageList cui esiste sia nella libreria FMX ma anche nella libreria VCL se non in una versione differente.

Spesso mi capita che mi viene segnalato un errore perchè Delphi collega il mio oggetto TImageList alla liberia VCL e non a quella FMX,caricando le rispettive units in automatico ed in maniera quasi coatta.

Non so se la direttiva sotto è in grado di informare l'IDE sull'appartenenza degli oggetti impiegata alla libreria Firemonkey.

{$R *.fmx}

13 Risposte

  • Re: Il Preprocessore di Delphi

    25/09/2024 - GrandfatherCoder ha scritto:


    Spesso mi capita che mi viene segnalato un errore perchè Delphi collega il mio oggetto TImageList alla liberia VCL e non a quella FMX,caricando le rispettive units in automatico ed in maniera quasi coatta.

    Mi chiedo come sia possibile questo: se stai lavorando a un progetto basato su FMX, i componenti selezionabili devono essere quelli compatibili con le piattaforme FMX, per cui inserendoli in un Form ti verranno aggiunte le unit della libreria FireMonkey.

    MAI - sino a oggi - mi è capitato che Delphi inserisse in un progetto basato su una libreria (es. FMX) le unit dell'altra (es. VCL).

    Deve esserci qualcosa che non va nella modalità con cui è stato creato o impostato il progetto, o qualcosa che non ci hai detto dell'iter seguito.

    Non ho mai visto segnalare da nessuno un problema simile.

    25/09/2024 - GrandfatherCoder ha scritto:


    Non so se la direttiva sotto è in grado di informare l'IDE sull'appartenenza degli oggetti impiegata alla libreria Firemonkey.

    No, la direttiva {$R *.fmx} servirebbe solo per dire a Delphi che deve includere il file con lo stesso nome della unit corrente, ma con estensione .fmx, all'interno dell'eseguibile, includendolo tra le cosiddette “risorse”, che entrano a far parte dell'eseguibile stesso.

    Si usa quindi per includere una risorsa nell'eseguibile; in genere, è usata per integrare il DFM con la definizione di Form, Frame e Data Module, ecc. all'interno dell'eseguibile, poiché è la risorsa da caricare e leggere per poter ripristinare la finestra, il frame o il modulo e i suoi componenti.

    Per distinguere il codice in base alla piattaforma di riferimento (es. Windows, Linux, Android, ecc.) si usano le costanti di compilazione condizionale. Il codice delle librerie Delphi ne sono piene (ma nella Community non c'è il sorgente, purtroppo).

    25/09/2024 - GrandfatherCoder ha scritto:


    Premetto che ogni volta che apro un nuovo post lo faccio quasi a malincuore perchè mi sembra di “spammare” il forum.

    Se la discussione pone un problema o una domanda reale che può essere utile a chiunque (anche potenzialmente), direi che non c'è alcuno “spam”. Anzi, quantomeno si discute di qualcosa. :)

  • Re: Il Preprocessore di Delphi

    25/09/2024 - Alka ha scritto:


    MAI - sino a oggi - mi è capitato che Delphi inserisse in un progetto basato su una libreria (es. FMX) le unit dell'altra (es. VCL).

    Purtoppo mi capitava con il progetto demo OnlineOrderingTemplate fornito da Embarcadero.

    Ma modificavo i metodi,mai interagito con gli oggetti sulla finestra.

    Ti ringrazio della delucidazione come sempre ed approfitto per una domanda O.T.

    Se tra i tuoi video pubblicati hai anche un tutorial base per lo sviluppo mobile su Delphi.

    Per quanto riguarda il template fornito da Embarcadero,nulla da eccepire anche se il codice non è commentato.

    Solo sto avendo difficoltà a capirlo.

  • Re: Il Preprocessore di Delphi

    26/09/2024 - GrandfatherCoder ha scritto:


    Se tra i tuoi video pubblicati hai anche un tutorial base per lo sviluppo mobile su Delphi.

    Ho fatto diverse live di coding in cui veniva sviluppato un gioco o un'applicazione semplice che funzionasse sia su desktop sia su mobile, principalmente Android (per forza di cose). Puoi trovare qualcosa nel mio profilo e facendo una ricerca sui miei canali.

    26/09/2024 - GrandfatherCoder ha scritto:


    Per quanto riguarda il template fornito da Embarcadero,nulla da eccepire anche se il codice non è commentato.

    Solo sto avendo difficoltà a capirlo.

    Bisogna vedere di cosa si tratta, ad ogni modo potresti aprire discussioni mirate per le cose che non ti sono chiare: gli esempi sono una risorsa pubblica quindi, mettendo il pezzo di codice dubbio, è sempre possibile dare un'occhiata e cercare di spiegare lo scopo.

    Aiutati anche con la documentazione ufficiale: quella a volte è lacunosa, ma per la maggior parte delle informazioni procedurali di massima, non è così male. :)

  • Re: Il Preprocessore di Delphi

    26/09/2024 - Alka ha scritto:


    Bisogna vedere di cosa si tratta, ad ogni modo potresti aprire discussioni mirate per le cose che non ti sono chiare: gli esempi sono una risorsa pubblica quindi, mettendo il pezzo di codice dubbio, è sempre possibile dare un'occhiata e cercare di spiegare lo scopo.

    Purtroppo non è un pezzo di codice il mio problema ma la panoramica generale di tutto il progetto.

    26/09/2024 - Alka ha scritto:


    Aiutati anche con la documentazione ufficiale: quella a volte è lacunosa, ma per la maggior parte delle informazioni procedurali di massima, non è così male. :)

    Lacunosa per alcune librerie non sviluppate da Embarcadero.Ma come per C#,quando dietro lo sviluppo di un ambiente software con annesse librerie c'è una società come Embarcadero o Microsoft,mi sento in una botte di ferro.

    Diversamente in Python dove vi si usano spesso librerie amatoriali,ottime per carità,ma spesso scarsamente documentate o peggio ancora ,la cui durata dello sviluppo può finire da un momento all'altro.

  • Re: Il Preprocessore di Delphi

    27/09/2024 - GrandfatherCoder ha scritto:


    Purtroppo non è un pezzo di codice il mio problema ma la panoramica generale di tutto il progetto.

    Se non è un progetto che devi portare avanti per lavoro, ma per puro hobby, hai tutto il tempo di guardarti documentazione, video del canale di Embarcadero, blog post e libri che ti spiegano tutto.

    Ad esempio, c'è l'ottimo Delphi GUI Programming with FireMonkey di Andrea Magni, se vuoi approfondire il discorso mobile e FMX.

    27/09/2024 - GrandfatherCoder ha scritto:


    Lacunosa per alcune librerie non sviluppate da Embarcadero.Ma come per C#,quando dietro lo sviluppo di un ambiente software con annesse librerie c'è una società come Embarcadero o Microsoft,mi sento in una botte di ferro.

    Mai essere troppo fiduciosi! :)

    27/09/2024 - GrandfatherCoder ha scritto:


    Diversamente in Python dove vi si usano spesso librerie amatoriali,ottime per carità,ma spesso scarsamente documentate o peggio ancora ,la cui durata dello sviluppo può finire da un momento all'altro.

    In realtà questo vale un po' per tutti, anzi forse l'open source - se è una libreria molto utilizzata, ovvio - è una garanzia maggiore di continuità.

    L'aspetto da curare è il rendersi il più possibile indipendenti, ossia fare in modo che ogni componente di terze parti sia un “tassello” intercambiabile al momento.

    Poi, col passare del tempo, è normale che le tecnologie “vengano e vadano”. In questo senso, Delphi è senz'altro uno dei tool, se non forse uno degli unici e rari, che mantiene una elevatissima compatibilità all'indietro, consentendoti di migrare progetti anche molto vecchi pur introducendo nuove funzionalità.

  • Re: Il Preprocessore di Delphi

    27/09/2024 - Alka ha scritto:


    Se non è un progetto che devi portare avanti per lavoro, ma per puro hobby, hai tutto il tempo di guardarti documentazione, video del canale di Embarcadero, blog post e libri che ti spiegano tutto.

    Non esiste programmare per hobby alla mia età: bisogna solo fatturare…il tempo impiegato è una ruga in più per me. :(

    Se sviluppo progetti,saranno solo materiale che farà parte di quella mia ventiquattrore da proporre.

    27/09/2024 - Alka ha scritto:


    Mai essere troppo fiduciosi! :)

    Non mi casca il mondo se un girono decidessero di punto in bianco di deprecare una utilizzatissima libreria.

    27/09/2024 - Alka ha scritto:


    Delphi è senz'altro uno dei tool, se non forse uno degli unici e rari, che mantiene una elevatissima compatibilità all'indietro, consentendoti di migrare progetti anche molto vecchi pur introducendo nuove funzionalità.

    Questa caratteristica mi pare principalmente apprezzata dalle aziende IT italiane.

  • Re: Il Preprocessore di Delphi

    Tornando al problaema,posto una parte del codice della DMUnit nella cartella ORM che fa parte del progetto OnlineOrderingTemplate sperando sia sufficiente.

    In pratica,gli oggetti che danno errore sono i tre oggetti che ho segnato con una sorta di freccia.Nel progetto originale,questi oggetti derivano dalle librerie FMX.

    Invece ora discendono dalle librerie Vcl.

    Io credo sarà per il fatto che uso al momento,compilare l'applicazione in Windows32…

    unit uDMUnit;
    interface
    uses
      System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FireDAC.Stan.Intf,
      FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
      FireDAC.Phys.Intf, FireDAC.DApt.Intf, Data.DB, System.ImageList, FMX.ImgList,
      FireDAC.Comp.DataSet, FireDAC.Comp.Client, System.DateUtils,
      {Units nuove}JSON,Rest.Client,Rest.Types,FMX.Dialogs,System.RegularExpressions,
      Vcl.ImgList, Vcl.Controls;   //Queste due librerie vengono forzatamente caricate da Delphi
    const
      cSalesTax = 20; // In percent
      cEmailUs = 'help.email.com';
      cPhoneNumber = '0(800)111-22-33';
    type
      TCartItemType = (citItem, citModificator);
      TCartList = Array of record
        ID: int64;
        OwnerID: int64;
        Name: string;
        CartItemType: TCartItemType;
        Quantity: Extended;
        Price: Extended;
        Index: Integer;
        OwnerIndex: Integer;
      end;
      TDMUnit = class(TDataModule)
        FDMemTable1: TFDMemTable;
        FDMemTable1ID: TIntegerField;
        FDMemTable1Image: TBlobField;
        ImageListContactsExample: TImageList;  <----
        FDMemTable1LinkTo: TIntegerField;
        FDMemTable1Name: TStringField;
        FDMemTable1Description: TStringField;
        FDMemTable1Opacity: TFloatField;
        FDMemTable1Price: TFloatField;
        FDMemTable2: TFDMemTable;
        IntegerField1: TIntegerField;
        BlobField1: TBlobField;
        StringField1: TStringField;
        FDMemTable2Discount: TIntegerField;
        FDMemTable2ExpiresDate: TDateField;
        FDMemTable2GMTPlus: TIntegerField;
        ilCoupons: TImageList;  <----
        FDMemTable3: TFDMemTable;
        IntegerField2: TIntegerField;
        BlobField2: TBlobField;
        StringField2: TStringField;
        FDMemTable1LageImage: TBlobField;
        ilMenuBigImgs: TImageList; <---
        FDMemTable4: TFDMemTable;
        IntegerField3: TIntegerField;
        StringField3: TStringField;
        FDMemTable4Price: TFloatField;
        FDMemTable4OwnerItemID: TIntegerField;
        FDMemTable4IsSelected: TBooleanField;
        FDMemTable5: TFDMemTable;
        IntegerField4: TIntegerField;
        BlobField3: TBlobField;
        FDMemTable5Name: TStringField;
        FDMemTable6: TFDMemTable;
        IntegerField5: TIntegerField;
        StringField4: TStringField;
        StringField9: TStringField;
        ItemListMemTable: TFDMemTable;
        ItemListMemTableId: TIntegerField;
        ItemListMemTableprodotto: TStringField;
        ItemListMemTabledescrizione: TStringField;
        ItemListMemTableprezzo: TFloatField;
        ItemListMemTablemarca: TStringField;
        ItemListMemTablesupporto: TStringField;
        ItemListMemTablefoto_blob: TBlobField;
        procedure DataModuleCreate(Sender: TObject);
      private
        FCloseFormClass: TClass;
        FCartList: TCartList;
        FOffersPercValue: Integer;
        FSalesTax: Extended;
        FEmailUs: string;
        FPhoneNumber: string;
        procedure InsertTestDataForTheMenu();
        procedure InsertTestDataForTheCoupons();
        procedure InsertTestDataForTheGallery();
        procedure InsertTestDataForTheOptions();
        procedure InsertTestDataForAboutUs();
        procedure InsertTestDataForContactInfo();
        //Procedure inserite da me
        procedure InsertDataForItemList();
        procedure ADDDataToItemList(aID: Integer; const aProdotto: string;
                                          const aDescrizione: string;
                                          const aPrezzo: Real; const aMarca: string;
                                          const aMacchina: string; const aFotoFileName: string);
        procedure AddDataToFDMT1(aID: Integer; aLinkTo: Integer; aOpacity: Extended; const aName: string; const aDescription: string; aPrice: Extended);
        procedure AddDataToFDMT3(aID: Integer; const aName: string);
        function GetCartCount(): Integer;
        function GetOffersAmount(): Extended;
        function GetSalesAmount(): Extended;
        function GetDeliveryFeeAmount(): Extended;
        //Modifiche mie
        function GetDataFromServer(): TJSONArray;
      public
        function AddItemToCart(aItemId: int64 = 0; aOwnerID: int64 = 0; const aItemName: string = ''; aItemType: TCartItemType = citItem; aQuantity: Extended = 1; aItemPrice: Extended = 0; aOwnerIndex: Integer = -1): Integer;
        procedure DelItemFromCart(aItemIndex: Integer = 0);
        procedure ClearCart();
        function GetCartTotalAmount(): Extended;
        (* PROPERTIES *)
        property CloseFormClass: TClass read FCloseFormClass write FCloseFormClass;
        property CartList: TCartList read FCartList write FCartList;
        property CartCount: Integer read GetCartCount;
        property OffersPerValue: Integer read FOffersPercValue write FOffersPercValue;
        property SalesTax: Extended read FSalesTax write FSalesTax;
        property OffersAmount: Extended read GetOffersAmount;
        property SalesAmount: Extended read GetSalesAmount;
        property DeliveryFeeAmount: Extended read GetDeliveryFeeAmount;
        property EmailUs: string read FEmailUs write FEmailUs;
        property PhoneNumber: string read FPhoneNumber write FPhoneNumber;
      end;
  • Re: Il Preprocessore di Delphi

    27/09/2024 - GrandfatherCoder ha scritto:


    In pratica,gli oggetti che danno errore sono i tre oggetti che ho segnato con una sorta di freccia.Nel progetto originale,questi oggetti derivano dalle librerie FMX.

    Dal codice vedo che si tratta di un TDataModule, che è un modulo usabile in entrambi gli scenari, VCL e FMX.

    Sei sicuro di aver scelto la giusta “classe” di controlli da considerare nel Data Module?

    Dai un'occhiata all'impostazione della proprietà ClassGroup:

  • Re: Il Preprocessore di Delphi

    L'impostazione iniziale era così da demo. Non ho scelto io il data modulo. 

    Ho risolto il problema andando a ruspa, ho eliminato gli oggetti che causavano il problema e che non mi servivano, in quanto utili al backend di esempio.

  • Re: Il Preprocessore di Delphi

    27/09/2024 - Alka ha scritto:


    Dai un'occhiata all'impostazione della proprietà ClassGroup:

    Questa parte la salverò negli appunti.

    Prima o poi mi tornerà utile.

    Scusate l'O.T.

    Riguardo la parte backend,vorrei che l'app salvasse la lista del carrello in un locale database SQLite.

    Dopo questa premessa l'applicazione fornita da Embbarcadero utilizza la TFDMemTable per salvare il singolo record al momento della selezione dell'articolo ,ma per la lista degli articoli nel carrello viene impiegato un array di records.

    TCartList = Array of record
        ID: int64;
        OwnerID: int64;
        Name: string;
        CartItemType: TCartItemType;
        Quantity: Extended;
        Price: Extended;
        Index: Integer;
        OwnerIndex: Integer;
      end;
  • Re: Il Preprocessore di Delphi

    Potrei usare una TFDMen al posto dell'array di record per poi travasare il recordset nel database

  • Re: Il Preprocessore di Delphi

    01/10/2024 - GrandfatherCoder ha scritto:


    Potrei usare una TFDMen al posto dell'array di record per poi travasare il recordset nel database

    Non capisco se c'è una domanda a cui rispondere, oppure cosa…

    01/10/2024 - GrandfatherCoder ha scritto:


    Scusate l'O.T.

    Effettivamente un pochino siamo andati OT. :)

  • Re: Il Preprocessore di Delphi

    01/10/2024 - Alka ha scritto:


    01/10/2024 - GrandfatherCoder ha scritto:


    Potrei usare una TFDMen al posto dell'array di record per poi travasare il recordset nel database

    Non capisco se c'è una domanda a cui rispondere, oppure cosa…

    01/10/2024 - GrandfatherCoder ha scritto:


    Scusate l'O.T.

    Effettivamente un pochino siamo andati OT. :)

    01/10/2024 - Alka ha scritto:


    Non capisco se c'è una domanda a cui rispondere, oppure cosa…

    Ho dimenticato il punto interrogativo.:)

    Però apro un altro post.

Devi accedere o registrarti per scrivere nel forum
13 risposte