PDA

Visualizza la versione completa : [DELPHI] Dimensionamento del Form principale per visualizzare dati provenienti da DB


vicky
04-01-2012, 16:38
Ciao!
Se non volessi usare il componente per l'accesso ai dati DBCtrlGrid ma fare un ciclo sul dataset ed estrarre i valori dei campi pur continuando ad utilizzare il TSimpleDataset potrei fare così?


mio_dataset.open;
dbmemo1.datasource:=mio_datasource;
while not mio_dataset.eof do
begin
dbmemo1.datafield:='campo1';
mio_dataset.next;
end;

Cosa manca a questo codice?... perché non funziona per niente :confused:

alka
04-01-2012, 17:26
Il codice che hai scritto non fa altro che assegnare ripetutamente la proprietà DataSource al controllo TDBMemo, proprietà che semplicemente dice al controllo qual è il campo della tabella da cui reperire il valore da mostrare, riferito al record attuale.

Il "data source" non varia, quindi l'assegnazione non sortisce alcun effetto.

Il controllo TDBMemo è progettato per mostrare comunque sempre uno e un solo valore del record corrente.

In questo caso, scorrendo il DataSet dal primo all'ultimo record, l'effetto che si ottiene semplicemente è quello di mostrare nel controllo TDBMemo il valore del campo associato per l'ultimo record disponibile, che rimane quello corrente alla fine del ciclo, fermo restando che l'interfaccia grafica non viene aggiornata fino al termine del ciclo di scansione della tabella, e se anche lo fosse l'operazione sarebbe talmente rapida da non poterne vedere gli effetti, che comunque sarebbero riconducibili alla visualizzazione dei valori di un singolo campo.

Siccome si parla di fare un ciclo "autonomo" sui campi per mostrarli da qualche parte, non ha senso utilizzare il controllo TDBMemo, ma si può usare comunque un normalissimo TMemo, visto che i dati vanno ricopiati a mano al suo interno.

Non è ben chiaro alla fine l'effetto che si intende ottenere. Senza sfruttare il TDBCtrlGrid, occorre scrivere il codice che crea tanti controlli quanti sono i valori da mostrare, ripetendo l'operazione per ogni record.

Se si vuole intervenire nel processo di creazione di un singolo pannello del controllo TDBCtrlGrid, è sufficiente intercettare l'evento OnPaintPanel e andare a inserire all'interno la valorizzazione dei controlli dell'elemento (pannello) in corso di creazione, riferito al record corrente del DataSet che il controllo sta scandendo.

Ciao! :ciauz:

vicky
04-01-2012, 18:08
Il risultato che voglio ottenere è un controllo maggiore della pagina. Vorrei che la griglia per visualizzare i controlli che ho sempre usato anche in passato si adattasse allo screen visto che in giro ormai ci sono schermi con dimensioni sempre più grandi. Se utilizzo un DBCtrlGrid inserito in una Scrollbox mi risulta difficile fargli accettare di adattarsi al client. :dhò:
Quindi ho pensato che un'approccio più "manuale" dell'elencazione dei record del dataset mi consentisse di gestire meglio anche l'aspetto della pagina.
E' chiaro che avendo io per ogni record un'immagine, una riga di testo come titolo ed una descrizione testuale su più righe da visualizzare faccio prima ad usare DBMemo,DBText e DBImage(anzi in questo caso è solo un TImage) collegati al DBCtrlGrid...
Ma è possibile che questa griglia non si possa "spalmare" efficacemente su tutto lo schermo?

alka
05-01-2012, 15:15
Originariamente inviato da vicky
Se utilizzo un DBCtrlGrid inserito in una Scrollbox mi risulta difficile fargli accettare di adattarsi al client.
Dipende da cosa si intende: per adattare i controlli al loro contenitore, è sufficiente usare la proprietà Align impostandola ad alClient e questo automaticamente allarga il controllo per riempire il Parent che lo contiene.

Tu intendi questo o intendi altro?


Originariamente inviato da vicky
Quindi ho pensato che un'approccio più "manuale" dell'elencazione dei record del dataset mi consentisse di gestire meglio anche l'aspetto della pagina.
Alla fine, i controllo "data aware" (TDBText, TDBMemo, ...) non sono altro che versioni "specializzate" (con accesso ai dati) dei controlli standard, quindi usare i primi o questi ultimi non cambia la questione.


Originariamente inviato da vicky
Ma è possibile che questa griglia non si possa "spalmare" efficacemente su tutto lo schermo?
Come dovrebbe "spalmarsi" la griglia? Esemplifica il risultato che vuoi ottenere.

Ciao! :ciauz:

vicky
07-01-2012, 10:43
Vorrei che il mio form, che contiene:

1) in alto una scrollbox che a sua volta contiene la griglia
2) in basso un panel con dei comandi per muoversi da questo form ai successivi presenti nell'applicazione

indipendentemente dalla grandezza dello schermo di chi consulta l'applicazione vada ad occupare sempre tutto lo schermo. Invece quello che mi succede è che la griglia rimane sempre della sua dimensione originalmente impostata a design time. Lì ho impostato width pari a 1024 ma cosa dovrei metterci se non conosco la dimensione dello schermo dell'utente?
:)

alka
09-01-2012, 18:34
Originariamente inviato da vicky
Vorrei che il mio form [...]
vada ad occupare sempre tutto lo schermo.
[...]
cosa dovrei metterci se non conosco la dimensione dello schermo dell'utente?


Devi prelevare le caratteristiche dello schermo dall'oggetto Screen: vedi questo approfondimento (http://docwiki.embarcadero.com/RADStudio/XE2/en/Handling_the_Screen).

L'oggetto possiede proprietà che restituiscono la dimensione dello schermo primario che puoi impiegare per dimensionare la finestra principale della tua applicazione.

Per la distribuzione dei controlli interni, devi fare riferimento - come predetto - alla proprietà Align (http://docwiki.embarcadero.com/VCL/en/Controls.TAlign) presente in (quasi) tutti i controlli.

Ciao! :ciauz:

vicky
10-01-2012, 22:27
Ti ringrazio, Marco, sei stato davvero "illuminante"! :yuppi:

Loading