Newsgroup: it.comp.lang.delphi
Titolo: Quale componente usare (se c'è)

In una finestra, l'utente deve riempire una riga di dati (una registrazione 
contabile). In alcuni casi, per dettagliarla maggiormente, vorrebbe avere la 
possibilità di aggiungerne una o più righe, ognuna con la sua descrizione, 
il suo conto e il suo importo.
Mi era venuta l'dea di usare una scrollBox, per non limitare il numero di 
righe aggiungibili, ma mi sono arenato a pensare a quale componente usare 
per ciascuna riga.
Nella normale transazione singola, oggi uso degli edits, ma non posso creare 
altre righe di edits quando l'utente vuole aggiungere righe (come faccio a 
dargli altri nomi e a riferirmi a ciascun edit?).
Forse la soluzione potrebbe essere una StringGrid ? Però i dati 
apparirebbero molto diversi dalla normale transazione singola, dove sono 
immessi in normali edit, ben spaziati tra di loro e distribuiti come si deve 
nel pannello..
Eppure vedo in giro molti casi in cui altre righe di immissione dati vengono 
create man mano che servono. Avete dei consigli ? Uso Delphi 2007. Grazie 
 

 Avete dei consigli ? Uso Delphi 2007. Grazie
Una volta proprio Marco mi suggerì di usare un controllo che e' composto 
da una lista dinamica di controlli.
Io gli misi dentro tanti tedit, mi sembrava che fosse proprio la scrollbox.
Fai così anche tu e vai tranquillo.
ciao
 
-- 
morde
QT 4.7
Delphi (5,6,7.. expired)
Firebird Database
 

 (come faccio a dargli altri nomi e a riferirmi a ciascun edit?)
Usa semplicemente un array di edits, mettine dentro 50 e vedi che bastano..


Io userei un frame con dentro gli edit che servono.
I frame sarebbero contenuti in una tlist ed etichettati con un nome
del tipo "framerow00".
I frame avrebbero come parent (ma non come owner!) la scrollbox.
 
 
Sulla scrollbox metti una toolbar per fare add e remove
Sull'add, calcoli la posizione verticale dell'ultimo frame presente
nella scrollbox.
Gli aggiungi l'altezza del frame + qualcosina tipo 10 pixel.
Crei il nuovo frame, lo aggiungi alla lista e lo appioppi alla
scrollbox alla posizione appena calcolata.
Sulla remove, scali di un frame il contenuto del frame successio a
quello da rimuovere.
Poi, l'ultimo frame che resta vuoto lo cancelli.
 
Usando un frame hai una blcakbox che incapsula le logiche di
inserimento dei dati.
La gestione dei vari eventi sui vari edit la tieni una tantum.
 
A.

HO PIU' VOLTE DETTO CHE MI FA VERAMENET INCAZZARE QUANDO MI SI
RISPONDE IN PRIVATO PER I POST DEL NG.
FORSE SONO UN IDEALISTA A BASARMI SULLA NETIQUETTE.
DOVREI SMETTERLA E FARE COME TUTTI COLORO CHE METTONO UNA MAIL FINTA?
 
 
GRAZIE.
 

 ha scritto nel messaggio 
news:54d483f8-1442-4033...@f29g2000yqa.googlegroups.com...

Cazzo, ho sbagliato bottone !!!! 
 

 ha scritto nel messaggio 
news:4ebac603$0$1382$4faf...@reader2.news.tin.it...

L'idea di Alberto Salvati mi pareva una buona idea, ma non ero certo di 
averla capita appieno. Quindi ho mandato il seguente messaggio, ma per 
errore ho premuto "Rispondi" invece di "Rispondi al newsgroup facendolo 
incazzare di brutto. Mi scuso e risottometto il testo del mio messaggio:
 
...... A prima vista mi pare di capire che dovrei caricare la TList, metti 
con 10 frames, di nome 01, 02 etc., che poi mostrerei nela ScrollBox mano 
mano che servono.
Gli edits contenuti nel frame (o nella ?!) avrebbero un nome distinto dallo 
stesso edit del successivo frame dal nome del frame.
E' così ?
Adesso ci penso un pò ...
 

 create man mano che servono. Avete dei consigli ? Uso Delphi 2007. Grazie
 
Un'implementazione dell'idea di Alberto:
 frame con 3 edit e un pulsantino per cancellare la riga (codice
dell'on click del pulsante: "Free;"
 
Sulla form la riga iniziale, 2 pulsanti: "add row" "clear rows".
Ovviamente è tutto molto rozzo, ma è giusto per dare l'idea.
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  firstRow.SpeedButton1.Enabled := false;
  firstRow.SpeedButton1.OnClick := nil; // just to be safe :-)
  initIt;
end;
 
procedure TForm1.initIt;
begin
  lastRow := firstRow; // lastRow: property della form (puntatore
all'ultima riga)
  numRows := 1; // property della form
end;
 
procedure TForm1.btnAddRowClick(Sender: TObject);
var newRow: TfrmEdit;
begin
  newRow := TfrmEdit.Create(Self);
  inc(numRows);
  newRow.Top := lastRow.Top + lastRow.Height;
  newRow.Left := lastRow.Left;
  newRow.Name := 'Row' + inttostr(numRows);
  newRow.Parent := Self;
  lastRow := newRow;
end;
 
procedure TForm1.btnClearRowsClick(Sender: TObject);
var i: integer;
begin
  for i := ComponentCount-1 downto 0 do begin
    if Copy(Components[i].Name, 1, 3) = 'Row' then begin
      Components[i].Free;
    end;
  end;
  initIt;
end;
 

 stesso edit del successivo frame dal nome del frame.
 
No. Esiste UNA SOLA CLASSE FRAME che contiene i controlli che ti
servono.
Poi, di questa classe crei n istanze diverse.
Avere i nomi diversi a cosa potrebbe servirti? Pre-risposta: a niente.
 
A.

      Components[i].Free;
 
 
..ma cosi chi dice a Components di "scalare" di una posizione xche un
qualcosa e stato distrutto?
Non resta un elemento assegnato a nil che potrebbe mandare tutto ai
festini del nano?
Io farei una cosa diversa:
 
 procedure TForm1.btnClearRowsClick(Sender: TObject);
 var
     i: integer;
     CurrentControl: TControl;
 begin
   for i := ComtrolCount-1 downto 0 do
    begin
       if (Control[i] is TFrameForRow) then
       begin
          CurrentControl := Control[i];
          SELF.REMOVECONTROL(CURRENTCONTROL);
          fREEANDNIL(CURRENTCONTROL);
       end;
   END;
 
   initIt;
 end;
 
 
L'unico dubbio e' se la removecontrol fa anche la free o no...
 
 
A.

 create man mano che servono. Avete dei consigli ? Uso Delphi 2007. Grazie
 
Un'implementazione dell'idea di Alberto:
 frame con 3 edit e un pulsantino per cancellare la riga (codice
dell'on click del pulsante: "Free;"
 
Sulla form la riga iniziale, 2 pulsanti: "add row" "clear rows".
Ovviamente č tutto molto rozzo, ma č giusto per dare l'idea.

Ma come faccio ad acquisire i dati immessi negli edits non sapendo a priori 
quanti ne ho nel pannello? Penso che dovrň prima individuare quante righe 
sono state create e poi indirizzare ciascun edit con il nome nello stesso 
modo in cui č stato creato. Scusate, ragiono ad alta voce. Confermate ? 
 

 modo in cui è stato creato. Scusate, ragiono ad alta voce. Confermate ?
 
Gli edit dovrebbero popolare una qualche struttura dati, tipo una
collection di oggetti "riga".
 
A.

 create man mano che servono. Avete dei consigli ? Uso Delphi 2007. Grazie
 
Un'implementazione dell'idea di Alberto:
 frame con 3 edit e un pulsantino per cancellare la riga (codice
dell'on click del pulsante: "Free;"
 
Sulla form la riga iniziale, 2 pulsanti: "add row" "clear rows".
Ovviamente č tutto molto rozzo, ma č giusto per dare l'idea.

Mi sono messo subito a provare, ma mi accorgo che non so niente. Non ho mai 
lavorato con le frames,. Ho creato per prova una frame con due edit e uno 
speedButton.
Ma la frame come faccio a farla conoscere alla form principale ? La devo 
registrare in qualche modo come un componente in modo da poterla mettere nel 
form nella posizione che voglio? (Ho provato a referenziarla nel form, ma 
non la vede).
FirstRow č una property del form su cui va posizionata la frame immagino. Ma 
come si dichiara come property del form ? Mi puoi fare un esempio ?
 

Ho fatto qualche progresso, nel senso che ho scoperto che devo mettere la 
mia frame (TMyFrame) nella palette e poi posso prelevarla e posizionarla sul 
mio mainForm.
Rimangono le domande su FirstRow (ma è una var di tipo TMyFrame?). 
 

 Io farei una cosa diversa: [...]
 
Yep, ma così elimini anche FirstRow :-)
 
Cia'
Paolo


FirstRow è un'istanza del frame, messa sul form a design time, e
rinominata, così come si fa con qualunque altro componente (ho
supposto che non si voglia eliminare la prima riga). Non è
*strettamente* una property in senso Delphi, anche se la puoi editare
tramite l'obj inspector.
 
Comunque l'esempio è *molto* rozzo.
Se vuoi qualcosa di anche solo un po' più gestibile puoi mettere le
reference ai tuoi frame in una lista (TList), così quando ne cancelli
uno puoi re-disporre gli altri che rimangono:
 
procedure TForm1.btnAddRowClick(Sender: TObject);
var newRow: TfrmEdit;
begin
  newRow := TfrmEdit.Create(Self);
  inc(numRows);
  rowList.Add(newRow);          // <<===
  newRow.Top := lastRow.Top + lastRow.Height;
  newRow.Left := lastRow.Left;
  newRow.Name := 'Row' + inttostr(numRows);
  newRow.Parent := Self;
  lastRow := newRow;
end;
 
procedure DoSomethingWithDetailData(...)
begin
  numItems := rowList.Count;
  for i := 0 to rowList.Count -1 do begin
    curRow := (TfrmEdit)(rowList[i]);
    totCol_1 := totCol_1 + curRow.valueOfCol_1;
  end;
  ShowMessage('Il totale della colonna 1 è ' + inttostr(totCol_1));
end;
 

 frame viene eliminato).
 
non sapevo... :-D
 
 
A.

 Cazzo, ho sbagliato bottone !!!!
 
 
Dovremmo chiedere al NG di eliminare il bottone per evitare ad alcune
persone di incazzarsi inutilmente...
Viva il non egocentrismo di chi crede di essere letto sempre e da
tutti "nello stesso" posto come se fosse ......
 
viva il pensiero libero di questo NG!!! :)