* * * *

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.
Maggio 05, 2024, 11:37:39 pm

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

504 Visitatori, 0 Utenti

Autore Topic: Classe con riferimeto ad altra classe  (Letto 4070 volte)

Kayla

  • Newbie
  • *
  • Post: 14
  • Karma: +0/-0
Classe con riferimeto ad altra classe
« il: Novembre 27, 2014, 11:26:20 pm »
Vorrei creare una struttura che permetta di accedere ai valori inseritiin un'altra classe

ipotesi Materiali generici e vano Cucina
ad es. creo dei materiali Legno, Granito, Marmo in foma generica

quando vado nella Cucina vorrei leggere i materiali creati nella classe Materiali,
a quanto pare mi manca qualcosa, per ottenere il risultato cercato.

spero in qualche indicazione, anche se nell'ultimo post, nella sezione Databases, ho fatto confusione con gli apici.

Codice: [Seleziona]
 type TMateriali = class(TObject)
   private
     FMateriale: TStringList;
     FUnMisura: string;

   public
     function SetMateriali: TStringList;
 end;

 type TCucina = class(TObject)
   private
    FLunghezza: integer;
    FTipo: TStringList;
    FMateriali:TMateriali;  //qui dovrei avere il riferimento a TMateriali

   public
    procedure SetCucina;
 end;

function TMateriali.SetMateriali: TStringList;
//var FMatesElenco: TStringList;
begin
  FMateriale:= TStringList.Create;
  FMateriale.Add('Legno');
  FMateriale.Add('Granito');
  FMateriale.Add('Marmo');

  Result := FMateriale;
end;

{ TCucina }

function TCucina.SetCucina: TStringList;
begin
 FTipo := TStringList.Create;
 FTipo := FMateriali.FMateriale;  //qui ovviamente FMateriali è=nil e non posso leggere FMateriale
end;

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2874
  • Karma: +20/-4
Re:Classe con riferimeto ad altra classe
« Risposta #1 il: Novembre 29, 2014, 11:22:43 am »
ciao scusa la risposta in ritardo, non so se ho ben interpretato ma intanto ora funziona e si può ragionarci sopra

ho messo le tue dichiarazioni in una unit chiamata Unit2
Codice: [Seleziona]
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type
  TMateriali = class(TObject)
  private
    FUnMisura: string;
  public
    FMateriale: TStringList; // spostata sotto public, prima era pirvate
    function SetMateriali: TStringList;
  end;

  TCucina = class(TObject)
  private
    FLunghezza: integer;
    FTipo: TStringList;
  public
    FMateriali: TMateriali;  //qui dovrei avere il riferimento a TMateriali
    procedure SetCucina;
  end;



implementation

{ TCucina }

procedure TCucina.SetCucina;
begin
  FTipo := TStringList.Create;
  FTipo.AddStrings(FMateriali.FMateriale);
end;

{ TMateriali }

function TMateriali.SetMateriali: TStringList;
begin
  FMateriale := TStringList.Create;
  FMateriale.Add('Legno');
  FMateriale.Add('Granito');
  FMateriale.Add('Marmo');

  Result := FMateriale;
end;


end.


poi in una form ho messo un bottone ed un memo (Memo1), nell'onclick del bottone ho messo il seguente codice:

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var m: TMateriali;
    c: TCucina;
begin
   m := TMateriali.Create;

   c := TCucina.Create;
   m.SetMateriali;
   c.FMateriali := m;
   c.SetCucina;

   memo1.Lines.AddStrings(c.FMateriali.FMateriale);
end;

« Ultima modifica: Novembre 29, 2014, 11:25:59 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

Kayla

  • Newbie
  • *
  • Post: 14
  • Karma: +0/-0
Re:Classe con riferimeto ad altra classe
« Risposta #2 il: Novembre 29, 2014, 10:47:04 pm »
Grazie per la disponibilita', cerchero' di modificare per avere delle property.
fermo restando che la tua modifica funziona.

Potrei usare delle variabili FTipoMateriale, etc. per il fatto che la StringList e' legata alla posizione di inserimento
cosi se Legno viene inserito non per primo elemento
Codice: [Seleziona]
  FMateriale := TStringList.Create;
  FMateriale.Add('Granito');
  FMateriale.Add('Legno');
testando FMateriale[0] cambierette tutto

potrei ricorere alla procedure che ritorna per valore , ma dovrei fare una classe per
Legno, Marmo, Granito , etc

Codice: [Seleziona]
 type TMateriali = class(TObject)
   private
     FUnMisura: string;
     FTipoMateriale: string;

   public
     FMateriale: TStringList;
     procedure SetMateriali(var FTipoLegno, FUnitaMisura: string);
 end;

e nel form

Codice: [Seleziona]
procedure SetMateriali(var FTipoLegno, FUnitaMisura: string);
begin
  FTipoMateriale := 'Legno';
  FUnitaMisura := 'Mq';
end;
questo sistema, non permette di inserire piu' di 1 elemento alla volta.

Al momento sono a corto di idee.

L'idea di base e' costruire un sistema che permette (ampliando le classi) di costruire un ambiente scegliendo
Materiale, e le altre caratteristiche, ma senza farlo direttamente nel form

es: A
Cucina-Top->Granito
Cucina-Pavimento->Cermica
Cucna-Mobili->Legno

ma la stessa cosa per B potrebbe essere
Cucina-Top->Marmo
Cucna-Mobili->Laminato

sono sulla strada corretta o e' troppo tortuosa ?

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2874
  • Karma: +20/-4
Re:Classe con riferimeto ad altra classe
« Risposta #3 il: Novembre 30, 2014, 10:43:28 am »
Visto che ci sei oltre ad usare le property dovresti usare anche i costruttori di classe ed i rispettivi distruttori (constructor e destructor).
Così facendo il tuo codice si avvicinerebbe di più a quelli che sono gli standard di codifica oop (= più facile capire le tue intenzioni).

I materiali non li devi testare con la posizione ma con il metodo IndexOf: http://www.freepascal.org/docs-html/rtl/classes/tstringlist.indexof.html
In questo modo il test prescinde dalla posizione, ad esempio:
Codice: [Seleziona]
if FMateriale.IndexOf('Legno') >= 0 then
   ShowMessage('è di legno!');


Per inserire più informazioni su una stringlist puoi usare la capacità di memorizzare coppie "nome"="valore" in una unica stringa.
In questo modo puoi fare:
FMateriale.Add('Legno=Mq');
FMateriale.Add('Granito=Kg');

in questo caso, per testare invece di indexof puoi usare IndexOfName http://www.freepascal.org/docs-html/rtl/classes/tstrings.indexofname.html
Codice: [Seleziona]
if FMateriale.IndexOfName('Legno') >= 0 then
   ShowMessage('è di legno!');

per avere l'unità di misura:
Codice: [Seleziona]
var um:string;
begin
   ...
   um := FMateriale.Values['Legno'];
   ...
end;


se hai bisogno di altri dati oltre l'UM (es: spessore, sotto categoria materiale, bordo toroidale, trattamenti vari, ecc...), allora bisogna che ci ragioniamo sopra ;)
« Ultima modifica: Novembre 30, 2014, 10:51:04 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

Kayla

  • Newbie
  • *
  • Post: 14
  • Karma: +0/-0
Re:Classe con riferimeto ad altra classe
« Risposta #4 il: Dicembre 03, 2014, 09:46:59 am »
grazie delle indicazioni, le proprieta' IndexOf e IndexOfName di una TStgingList, proprio non le conoscevo; veramente utili.

su property + constructor e distructor; ci passo un po' di tempo e poi aggiorno.

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18800
  • Topic in totale: 2239
  • Online Today: 524
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 504
Total: 504

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.