Newsgroup: it.comp.lang.delphi
Titolo: Come posizionare su piu' righe degli oggetti

Sto utilizzando una scrollbox che contiene dei frame che vengono aggiunti
dinamicamente.
Ogni singolo frame ha l'allineamento alLeft, per far si' che tutti i frame si
affianchino l'uno all'altro.
Il mio problema giunge quando voglio "andare a capo", dal sesto frame in poi,
riempiendo un'altra riga.
[frame1][frame2][frame3][frame4][frame5]
[frame6]........................[frame10]
[frame11] ....eccetera.
Come posso fare ad "andare a capo"?
scusate ma non ho proprio idee oggi... :-//
-- 
Morde. 
(morde at programmer dot net)

 Come posso fare ad "andare a capo"?
Prima di tutto dovresti inglobare ogni "riga" di 5 frame in un Panel
allineato con alTop;
poi potresti assegnare al tag di ogni nuovo frame creato un contatore, in
modo che, alla creazione del nuovo frame, controlli se
if (newFrame.Tag mod 5) = 0 then
// crea un nuovo pannello con alTop contenente il nuovo frame
else
// crea il nuovo frame nel pannello con numerazione corrispondente a
(newFrame.Tag div 5)
Ovviamente devi smacchinare un po' con i tag e i nomi dei pannelli, perň non
č impossibile. E probabilmente ci sono altre vie piů pulite che usare i tag.
Spero di essere stato chiaro nella mia sintesi ^___^;; ma se hai ancora
bisogno di consigli...
--
Jax
Journeying Artificial Xenomorph

 ha scritto nel messaggio

ciao
Magari non e un buon modo di lavorare il mio(non só)
io ho provato ho fatto cosí:
 Form1: TForm1;
   i,k:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var Frm:Tframe;
begin
Frm:=Tframe.Create(self);
Frm.Parent:=Form1.ScrollBox1;
Frm.Color:=clRed;
Frm.Height:=20;
Frm.Width:=10;
Frm.Left:=i;
inc(i,10);
inc(k);
case i of
50:i:=0;
100:i:=0;
150:i:=0;
end;
case k of
0..5:Frm.Top:=0;
6..10:frm.Top:=20;
11..15:frm.Top:=40;
end;
end;
spero di aver capito bene
ciao
erik

 Come posso fare ad "andare a capo"?
Credo che tu debba mettere dei container con allineamento alTop: o usi
direttamente N scrollbox oppure nella scrollbox metti N pannelli o
simili destinati a contenere ciascuno una riga di frame.
Saluti
Paolo Arosio
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare"

 ha scritto nel messaggio
news:k7lmqvkh2nm8mcbpt...@4ax.com...


 wrote in message
news:k7lmqvkh2nm8mcbpt...@4ax.com...

Per evitare l'utilizzo dei TPanel e se i TFrame hanno tutti la stessa
dimensione, puoi usare un sistema del genere.
Dove:
    iFrame = indice del frame da posizionare (in base 0)
    wFrame = larghezza del frame
    hFrame = altezza del frame
    cFrame = numero di colonne (nel tuo caso sono 5 mi pare)
troverai che, per il frame iFrame, le coordinate di posizionamento sono:
    Left := (iFrame mod 5) * wFrame;
    Top := (iFrame div 5) * hFrame;
Ovviamente non devi impostare nessun allineamento.
Ciao,
Stefano

 wrote:
Grazie, grazie a tutti quanti per le idee che mi avete dato!
Vi riporto come ho risolto, ho generalizzato la procedura per chi dovesse
utilizzarla un domani.
Va precisato che TMacchina e' una classe creata da me per modellizzare i
macchinari con cui il programma si interfaccia, mentre TfrmFrameMacchina e' il
frame che si occupa dell'interfaccia grafica della macchina.
Nella dichiarazione della TMacchina ho incluso il riferimento alla sua stessa
interfaccia (il frame) per gestirne il disegno.
Ho messo su un form uno ScrollBox e un bottone e compilato l'evento onclick
del bottone.
public
    Left,Top, NumFrames, FramesPerRiga : integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
   Left := 0;
   Top := 0;
   NumFrames := 0;
   FramesPerRiga := 5; // numero di colonne
end;
procedure TForm1.Button1Click(Sender: TObject);
var MioFrame : TfrmFrameMacchina;
    macchina : TMacchina;
begin
   macchina := TMacchina.Create(self);
   MioFrame := TfrmFrameMacchina.Create(macchina);
   MioFrame.Parent:=Form1.ScrollBox1;
   inc(numframes);
   if (numframes <> 1) and ((numframes mod FramesPerRiga) = 1) then begin 
      left := 0;
      inc(top,MioFrame.Height);
   end;
   MioFrame.Top := top;
   MioFrame.Left:=left;
   inc(left,MioFrame.Width);
end;
Grazie ancora a tutti, di cuore!


 sua stessa interfaccia (il frame) per gestirne il disegno.
Dal codice che usi sembra che sia il contrario: al frame passi un
riferimento all'istanza di TMacchina (il che ha anche piu' senso:
possono esserci piu' viste di una macchina, ma ciascuna vista puo'
corrispondere ad una sola macchina).
Per l'aggiornamento della vista non usi un Observer?


Per l'aggiornamento della vista non usi un Observer?
Ehm... purtroppo non so cosa intendi per observer, non sono cosi' ferrato in
materia. Al momento registro gli eventi che mi arrivano dal PLC (acquisiti
tramite TApdComPort dell tp asyncpro) con un metodo "aggiornaregistro" che
passa alla macchina le informazioni campionate.


 campionate.
Cioe'? passi a TMacchina la stringa ricevuta da TapdComPort e lasci che
sia TMacchina a parsarla e aggiornare il suo stato o hai uno strato TPLC
che TMacchina interroga o che?
Scusa la curiosita', e' un po' il genere di cose che ho fatto per un po'
di tempo e vorrei vedere come altri hanno affrontato le stesse
situazioni.
Se preferisci si puo' passare in pvt (il reply-to dovrebbe essere
valido: quello su despammed)


valido: quello su despammed)
Ok, ho creato un account anche io su despammed continuiamo li' sopra. 
(Il mio email nell'header from: 
fake...@libero.it
 rimarra' sempre lo stesso
per comodita' di archiviazione/ricerca so google groups)
-- 
Morde. 
(
mo...@despammed.com
)

materia. 
E` uno dei tanti design patterns.  Consente di avere una relazione di
dipendenza tra gli oggetti, in modo che il cambiamento di stato di uno
di essi viene notificato a tutti gli altri oggetti.