* * * *

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.
Novembre 26, 2024, 11:27:44 pm

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

90 Visitatori, 1 Utente
 

Autore Topic: Liste di Classi  (Letto 4932 volte)

AndreaM

  • Jr. Member
  • **
  • Post: 60
  • Karma: +0/-0
Liste di Classi
« il: Luglio 23, 2013, 12:52:30 pm »
Salve a tutti!
Ho creato una mia classe, e nel mio programma ho la necessita di utilizzare numerose istanze di questa classe, tenute in una lista usando TFPObjectList.
Il tutto funziona bene, ma quando devo usare la mia classe devo fare:

Codice: [Seleziona]
TMyClasse(Lista[i]).miaProprieta

Lo faccio e il tutto funziona bene!
Pero mi chiedevo, è possibile creare una classe che mi permetta di usare la mia in questo modo?

Codice: [Seleziona]
MiaClasse[i].miaProprieta

in pratica dovrei usare una lista che contiene la mia classe!

Come posso fare?
Grazie a tutti!
P.S. Sto lavorando ad un progetto per la gestione dei file GPS


nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2922
  • Karma: +20/-4
Re:Liste di Classi
« Risposta #1 il: Luglio 23, 2013, 01:13:48 pm »
ci sono molte strade per fare quello che dici

una abbastanza semplice (di sicuro non la più efficiente) è quella di fare una classe wrapper per usare TFPObjectList con tuoi metodi e proprietà

es:
Codice: [Seleziona]
TMyClasseManager = class(TObject)
private
   lista: TFPObjectList;
public
   constructor Create...
   destructor Destroy...
   function New: TMyClasse;
   procedure Add(instance: TMyClasse);

   property Items... default
end;


Imagination is more important than knowledge (A.Einstein)

AndreaM

  • Jr. Member
  • **
  • Post: 60
  • Karma: +0/-0
Re:Liste di Classi
« Risposta #2 il: Luglio 23, 2013, 06:30:51 pm »
Gerazie Nomo,
Mi hai dato lo spunto per guardare come è stato fatto TFPObjectList;
Ed ho visto che anche questa è una classe wrapper di TFPlist;
Ho creato questo codice che sembra funzionare, ma è possibile renderlo più efficiente?

Codice: [Seleziona]
unit Unit3;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,contnrs;
type
  { Tcane }
  TCane = class(TObject) // Classe base di prova
  private
    FNome:string;
  public
    Constructor Create;
    destructor Destroy; override;
    Property Nome:string read Fnome write Fnome;
  end;

  { TCani }
  TCani = class(TObject) // Classe Lista dei Cani
   Private
     Flist:TFPObjectList; // lista interna
     function GetCount: integer;
     function GetItem(Idx: integer): Tcane; // Restituisce istanza di Tcane
     procedure SetItem(Idx: integer; AValue: Tcane); // Crea istanza di Tcane
   Public
     constructor Create;
     Destructor Destroy; override;
     Function New(Aname:string):Integer; // aggiunge un cane alla lista
     Procedure Delete(Idx:Integer); // Cancella un cane dalla lista
     Property Items [Idx:integer]: Tcane read GetItem write SetItem; default;
     Property Count:integer read GetCount;
  end;

implementation

{ TCani }

function TCani.GetItem(Idx: integer): Tcane;
begin // restituisce istanza di Tcane alla posizione Idx
  Result:=Tcane(FList[Idx]);
end;

function TCani.GetCount: integer;
begin  // Totale dei cani presenti
  Result:=Flist.Count;
end;

procedure TCani.SetItem(Idx: integer; AValue: Tcane);
begin // Imposta proprieta del cane Idx
  Flist[Idx]:=AValue;
end;

constructor TCani.Create;
begin // creo il componente
  inherited Create;
  FList := TFPObjectList.Create;
end;

destructor TCani.Destroy;
begin // Distruggo il componente
  if (FList <> nil) then
  begin
    Flist.Clear;
    FList.Destroy;
  end;
  inherited Destroy;
end;

function TCani.New(Aname: string): Integer;
var cane:Tcane;
begin // Creo una nuova istanza del cane e lo aggiungo alla lista
cane:=TCane.Create;
cane.Nome:=Aname;
Result:=Flist.Add(cane);
end;

procedure TCani.Delete(Idx: Integer);
begin // cancello il cane
  flist.Delete(idx);  // cancello istanza sulla lista
end;

{ Tcane }

constructor TCane.Create;
begin
  inherited Create;
end;

destructor Tcane.Destroy;
begin
  inherited Destroy;
end;

end.           

Ovviamente ho iserito solo le cose di base per provare se tutto funziona!
Grazie


xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3281
  • Karma: +12/-0
Re:Liste di Classi
« Risposta #3 il: Luglio 23, 2013, 07:48:13 pm »
prova a seguire una di queste due guide

http://www.lazaruspascal.it/index.php?page=18

http://www.lazaruspascal.it/index.php?page=57

dovrebbero fare al caso tuo e ogni nodo della lista lo istanzi con la tua classe
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2922
  • Karma: +20/-4
Re:Liste di Classi
« Risposta #4 il: Luglio 24, 2013, 09:23:34 am »
Ho creato questo codice che sembra funzionare, ma è possibile renderlo più efficiente?

l'efficienza dipende da come devi usare la lista, dipende dal numero di elementi che deve contenere, se il numero è sempre quello o no, quanti cast ci sono e quanto spesso, se servono degli ordinamenti o no, dal metodo di ricerca, ecc...

in generale se non hai necessità specifiche (es: numero enorme di elementi da gestire), sei già a buon punto ;)
se invece devi limare i tempi, le guide segnalate da xini ti possono dare uno spunto sicuramente.
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Liste di Classi
« Risposta #5 il: Luglio 24, 2013, 11:39:39 am »
Se vuoi, al posto di "wrappare" la lista, puoi sempre estenderla.
Quindi hai una lista "specializzata".
I cast vengono fatti all'interno. Da "fuori" puoi sempre accedere anche ai vecchi metodi.

Per efficente cosa intendi?
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

AndreaM

  • Jr. Member
  • **
  • Post: 60
  • Karma: +0/-0
Re:Liste di Classi
« Risposta #6 il: Luglio 25, 2013, 09:28:26 am »
Grazie a tutti!
Ora ho capito cosa si intende per efficienza! Il numero degli elementi può variare ma cmq rimane nell'ordine delle centinaia, ho fatto delle prove con grosse q.tà e sono osoddisfatto!
Per Stilgar: Io in effetti ho una lista di oggetti creati da me! Cosa intendi per lista specializzata? Puoi farmi un esempio?
 

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Liste di Classi
« Risposta #7 il: Luglio 25, 2013, 03:18:39 pm »
Codice: [Seleziona]

TListaSpecializzata = class(TList)
public
  property Items[index : integer] : <lamiaclasse> read getItem write setItem;  default;
end;

In questo modo l'accesso ai dati è "nascosto" dentro il metodo get e set. Qui esegui il cast nel get e non devi più farlo da fuori.

con la keyword "default" indichi al compilatore di fare riferimento a quella proprietà quando trova una costruzione sintattica del tipo:

Codice: [Seleziona]
 istanzaDellaMiaLista[indice] := istanza;
 istanza := istanzaDellaMiaClasse[indice];

Spero di essere stato chiaro e di non aver creato più confusione di prima ... ;)

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

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19208
  • Topic in totale: 2289
  • Online Today: 98
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 90
Total: 91

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.