Newsgroup: it.comp.lang.delphi
Titolo: come mantenere una lista di nomi di oggetti creati?

Salve,
nel mio programma permetto all'utente di definire delle variabili 
partendo da dei tipi predefiniti.
Cliccare sul nome del tipo causa la creazione di una variabile di quel tipo.
Devo assegnare alla variabile un nome iniziale, un po' come fa Delphi 
quando si crea un nuovo oggetto.
Es. da TEdit crea un oggetto chiamato Edit1.
Vorrei usare un meccanismo simile a quello di Delphi per enumerare le 
nuove variabili.
Come implementare gli indici per queste variabili?
Enrico


Credo che Delphi internamente tenga gli oggetti creati e depositati nel 
form in una lista, una TList, TOBjectList ecc.. Anche tu potresti fare 
la stessa cosa, usare una di queste classi per aggiungere o togliere i 
vari oggetti che crei in base al tipo scelto dall'utente.
Non puoi usare la stessa variabile d'istanza per creare n oggetti, 
altrimenti per i successivi n-1 perderesti il riferimento ed avresti, di 
conseguenza, dei memory leaks.
Antonio

 
Avevo pensato all' utilizzo di vari contatori (uno per ogni tipo di 
oggetto), il problema e` che cosi non so quale "indice" si libera quando 
l'utente rinomina un oggetto.
Es. se creo 3 tedit, Edit1, Edit2 e Edit3 sono i nomi assegnati per 
default da Delphi. Se cambio Edit2 in MioEdit e creo un quarto edit, 
quest'ultimo viene chiamato Edit2. Quindi Delphi tiene conto degli 
indici liberi.
Con la mia soluzione (un contatore per ogni tipo di variablie) non 
riesco ad ottenere questo effetto, il quarto componente avrebbe il nome 
Edit4.
Enrico

 Edit4.
Ho frainteso ciò che volevi ottenere. Imho, meglio che spulciare nei
sorgenti della ide di Lazarus non c'è nulla ;).
Prova a dare un'occhiata al metodo:
function TCustomFormEditor.CreateUniqueComponentName(const AClassName:
string;  OwnerComponent: TComponent): string;
nella unit /home/tuo_nome_utente/lazarus/ide/customformdesigner.pp
ti riporto anche qui il codice:
function TCustomFormEditor.CreateUniqueComponentName(const AClassName:
string;
  OwnerComponent: TComponent): string;
var
  i, j: integer;
begin
  Result:=AClassName;
  if (OwnerComponent=nil) or (Result='') then exit;
  i:=1;
  while true do begin
    j:=OwnerComponent.ComponentCount-1;
    Result:=AClassName;
    if (length(Result)>1) and (Result[1]='T') then
      Result:=RightStr(Result,length(Result)-1);
    if Result[length(Result)] in ['0'..'9'] then
      Result:=Result+'_';
    Result:=Result+IntToStr(i);
    while (j>=0)
    and (CompareText(Result,OwnerComponent.Components[j].Name)<>0) do
      dec(j);
    if j<0 then exit;
    inc(i);
  end;
end;
Antonio

guastatore pisze:

Grande!! Grazie. Soluzione B  :)  senza lista di elementi creati, ma 
creazione di un nome e ricerca nelle variabli se il nome gia` esiste.
Anche con qualche centinaio di variabili e un algoritmo di ricerca 
sequenziale (le variabili non sono ordinate alfabeticamente) non 
dovrebbe richiedere troppo tempo...
Grazie per l'aiuto
Enrico

 Grazie per l'aiuto
Non vorrei ricordare male ma se il componente lo crei usando una form 
come owner l'array dei componenti esiste già. Prova a dare un'occhiata a 
lla proprietà Components di TForm.
Probabilmente non capisco ancora molto bene il problema e per quale 
motivo tendi ad usare centinaia di variabili piuttosto che un array, 
comunque sono contento che stai risolvendo in qualche modo ;)
Antonio

 creazione di un nome e ricerca nelle variabli se il nome gia` esiste.
Una domanda: a cosa ti serve tutto questo?
Ciao
-- 
Morde

guastatore pisze:

Per chiarire :)
sto scrivendo un programma in cui a partire da tipo definiti nel 
programma (string, integer, date, time, ecc) l'utente puo` creare i 
propri "tipi", ad es. Indirizzo (tipo string), CAP (string con 
maschera), ecc.
Da questi tipi puo` poi costruire dei template di variabili in cui 
raccoglie varie informazioni. Variabile=tipo+valore.
Ad esempio
Mittente contiene gli stessi campi di Destinatario e con drag & drop puo 
velocemente costruire un template di variabili contenenti i valori per 
Mittente e Destinatario.
Con queste informazioni l'utente puo` produrre rapporti, fare mailmerge 
con template di Word, riempire formulari, ecc.
A tutto cio` vorrei ancora aggiungere un qualcosa tipo expert system e 
permettere all'utente di costruire regole da applicare alle variabili.
Ad esempio if Data_Scadenza<Today then Message("Scaduto");
Le variabili sono degli oggetti che gestisco in una TObjectList. La 
faccenda dei nomi unici serve per assegnare un nome alla variabile al 
momento della creazione.
Per farla breve sto creando una micro versione dell' IDE compreso di 
object inspector per editare le proprieta` dei tipi e delle variabili,
dove l'attenzione e` centrata su dati necessari a generare/riempire 
formulari e documenti.
Spero di essere stato abbastanza chiaro. Anche per me e` ancora un po' 
confuso :) e molte cose le scopro sviluppando il programma...
Grazie ancora
Enrico

 formulari e documenti.
Allora può esserti davvero utile il sorgente di Lazarus, anche la unit 
dell'object inspector per capire le loro soluzioni. Potresti 
riutilizzare molto di quel codice.
Alternativamente puoi dare un'occhiata anche al progetto fpGUI, in 
particolare a uidesigner che implementa un designer grafico delle form 
molto semplice, ma con un piccolo editor delle proprietà degli oggetti 
selezionati.
Antonio