Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [delphi]galleria miniature

    Ciao!
    Devo realizzare una galleria di miniature di immagini prelevate da un database. A fianco di ciascuna miniatura dovrò mettere il nome dell'immagine ed una didascalia di una ventina di righe circa.
    Ho già provato ad utilizzare una dbctrlgrid ma esteticamente non mi piace molto.
    E' possibile, invece, usare in alternativa dei componenti dbimage, dbtext e dbmemo che permettano, tramite ciclo ricorsivo, di visualizzare tutte le miniature?
    In caso affermativo sapete indicarmi dove trovare un esempio di codice?

    Grazie in anticipo!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Il controllo TDBCtrlGrid non è altro che un "ripetitore" di altri controlli, quindi esteticamente non ha un proprio valore, a parte un colore di sfondo impostabile.

    I controlli che hai citato (TDBImage, TDBText, ecc.) sono tutti ospitabili in una TDBCtrlGrid.

    Che cos'ha questo controllo di "antiestetico" che non possa essere configurato a piacimento?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Intanto non riesco a farlo funzionare. Non capisco se il datasource lo devo assegnare solo al dbctrlgrid o anche al dbimage, dbtext e dbmemo. E se sia sempre lo stesso per tutti e quattro i componenti. Se è lo stesso e va settato per tutti i componenti, compreso il dbctrlgrid, osservo che non riesco a stabilire a runtime il campo della tabella del database che deve essere visualizzato.
    codice:
    es.:  DBMemo1.DataField := 'Mappa_didascalia';
    L'unica possibilità è farlo a design time, ma non mi è possibile per l'immagine in quanto il database memorizza solo una parte del percorso dell'immagine e quindi il percorso completo va determinato a runtime.
    codice:
    es.:  
    procedure TformGalleria.DBCtrlGrid1PaintPanel(DBCtrlGrid: TDBCtrlGrid;
      Index: Integer);
    var ImageFileName: string;
    begin
    ImageFileName:= simpledataset1.FieldByName('Mappa_file').AsString;
      DBImage1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+
      'IMG\miniature\' + ImageFileName + '.jpg');
    end;
    Poi mi piacerebbe che lo scorrimento delle immagini avvenisse come in una scrollbox : cioè in maniera "fluida" e non a scatti come nel dbctrlgrid.
    Da come mi descrivi questo "ripetitore di controlli" forse hai ragione a dire che sia la soluzione migliore e che gli aspetti estetici possono essere affrontati in molti modi (per esempio mi serve un margine esterno maggiore e delle miniature più vicine fra di loro): l'essenziale però è il corretto funzionamento del controllo che tuttora non riesco ad ottenere.

    Grazie

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da vicky
    Non capisco se il datasource lo devo assegnare solo al dbctrlgrid o anche al dbimage, dbtext e dbmemo.
    Dev'essere assegnato a tutti i controlli. Al TDBCtrlGrid va assegnato poiché in questo modo è in grado di sfogliare i record da visualizzare e creare un "tassello" per ciascuno di essi.

    Al suo interno, vengono mostrati i valori del record di riferimento all'interno degli altri eventuali "data control" inseriti, per i quali è necessario impostare DataSource e DataField.

    Originariamente inviato da vicky
    E se sia sempre lo stesso per tutti e quattro i componenti.
    Sì, è lo stesso.

    Originariamente inviato da vicky
    Se è lo stesso e va settato per tutti i componenti, compreso il dbctrlgrid, osservo che non riesco a stabilire a runtime il campo della tabella del database che deve essere visualizzato.
    Il valore della proprietà può essere assegnato anche a runtime, prima di aprire il DataSet a cui il controllo TDBCtrlGrid è collegato tramite il TDataSource.

    Originariamente inviato da vicky
    L'unica possibilità è farlo a design time, ma non mi è possibile per l'immagine in quanto il database memorizza solo una parte del percorso dell'immagine e quindi il percorso completo va determinato a runtime.
    In quel caso, un TDBImage non è necessario, visto che i dati dell'immagine non si trovano nel record: basta un TImage.

    Originariamente inviato da vicky
    Poi mi piacerebbe che lo scorrimento delle immagini avvenisse come in una scrollbox : cioè in maniera "fluida" e non a scatti come nel dbctrlgrid.
    Nulla vieta di rendere massime le dimensioni del TDBCtrlGrid, e poi di metterlo in una TScrollBox per scorrere la visuale con questo controllo.

    Originariamente inviato da vicky
    Da come mi descrivi questo "ripetitore di controlli" forse hai ragione a dire che sia la soluzione migliore e che gli aspetti estetici possono essere affrontati in molti modi (per esempio mi serve un margine esterno maggiore e delle miniature più vicine fra di loro): l'essenziale però è il corretto funzionamento del controllo che tuttora non riesco ad ottenere.
    Prova ad applicare tutti i suggerimenti forniti, e dimmi poi com'è andata.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Ti ringrazio per le risposte che mi hanno chiarito il funzionamento del dbctrlgrid.
    Per quanto riguarda la possibilità di scorrere le righe del medesimo tramite la scrollbar di uno scrollbox dentro cui è inserito il dbctrlgrid ci o provato: ho impostato la proprietà align del dbctrlgrid Client per renderne massime le dimensioni, come suggerivi, ma la scrollbar verticale continua a funzionare allo stesso modo, non mi sembra cioè che sia quella della scrollbox. La dbctrlgrid non viene trascinata contemporaneamente allo spostamento laterale della scrollbar, ma solo quando questa viene rilasciata dalla pressione del mouse (quindi "a scatti").

    Secondo problema: se porto la scrollbar verticale fino alla fine per scorrere tutte le righe ottengo un errore dopo l'ultimo record come se fosse nullo e quindi il percorso dell'immagine da un valore simile a questo:

    ../images/.jpg

    Ho verificato nel database e non ho un record nullo alla fine.
    C'è qualcosa che posso fare?

    E' possibile inserire il contenuto del controllo dbmemo nell'Hint corrispondente all'immagine, in modo che venga visualizzato solo passando con il mouse sopra l'immagine? Mi sembra di essere già riuscita a farlo in passato così:
    codice:
    image.hint=dbmemo1.text
    o qualcosa del genere, non ricordo bene e poi impostavo showhint a true, ma l'hint veniva mostrato solo per l'immagine della prima riga e non per le successive.
    Inoltre siccome ho dei campi memo anche abbastanza lunghi avrei avuto bisogno di un tempo di visualizzazione dell'hint personalizzabile (cioè maggiore di quello di default). E' possibile?

    Grazie

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Per le domande che hai posto, ci vorrebbe una trattazione completa in una discussione separata per ciascuna di queste, per cui si potrebbe parlare per ore.

    Brevemente, se hai impostato il controllo TDBCtrlGrid con proprietà Align ad alClient, è chiaro che il controllo assume la dimensione del controllo contenitore e compaiono le barre di scorrimento al suo interno.

    Il controllo TDBCtrlGrid non deve essere allineato, ma dev'essere sempre grande a sufficienza per visualizzare tutti i record che sono all'interno, senza scorrere.
    Ci pensera la TScrollBox esterna a farlo. Ed è la TScrollBox, tutt'al più, a dover essere allineata al controllo client.

    Ovvio poi che le soluzioni fornite sono un palliativo: con i Frame, allineandoli appositamente, si possono creare controlli analoghi di cui si personalizza però qualsiasi cosa; è chiaro però che, per queste esigenze, serve dimestichezza con la VCL e con la creazione di controlli grafici personalizzati.

    Per quanto riguarda il valore nullo, il problema potrebbe essere dovuto ad un controllo mancante del record corrente prima di leggere il dato...si dovrebbe vedere il codice per questo, e verificare come correggerlo.

    Per la visualizzazione del suggerimento, l'uso di Hint è corretto, ma andrebbe impostato per il controllo TImage ogni volta che viene definita l'immagine, e non una volta sola in un evento esterno a quello che inizializza il singolo elemento della TDBCtrlGrid.

    Infine, parlando della durata e delle altre caratteristiche del "tooltip", usando l'oggetto Application (Forms.pas) si possono definire colore, tempo di attesa prima della visualizzazione e dopo, e tanti altri aspetti dell'Hint. Leggi eventualmente anche la Guida in linea a riguardo.

    Ciao,
    Marco.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Il controllo TDBCtrlGrid non deve essere allineato, ma dev'essere sempre grande a sufficienza per visualizzare tutti i record che sono all'interno, senza scorrere.
    Forse non ho capito bene quanto dici: ma se la tdbCtrlGrid è tanto grande da contenere tutti i record non serve più che scorra, il mio problema è che io ho molti record che non possono essere visualizzati tutti in una schermata, per questo adopero la scrollbar verticale.

    Per la visualizzazione del suggerimento, l'uso di Hint è corretto, ma andrebbe impostato per il controllo TImage ogni volta che viene definita l'immagine, e non una volta sola in un evento esterno a quello che inizializza il singolo elemento della TDBCtrlGrid.
    Ne deduco che per un TDBCtrlGrid non è possibile impostare l'Hint per ogni TImage contenuto?

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da vicky
    Forse non ho capito bene quanto dici: ma se la tdbCtrlGrid è tanto grande da contenere tutti i record non serve più che scorra, il mio problema è che io ho molti record che non possono essere visualizzati tutti in una schermata, per questo adopero la scrollbar verticale.
    Il TDBCtrlGrid dev'essere grande a sufficienza per mostrare tutti i record, poiché usi una TScrollBox per scorrerlo. Quindi, il controllo TDBCtrlGrid avrà la lunghezza massima possibile per poter ospitare i record, senza doverli scorrere, e inserito nella TScrollBox sarà quest'ultima a fornire le barre di scorrimento per navigare il controllo in tutta la sua lunghezza complessiva. In caso contrario, non avrebbe senso usare la TScrollBox, no?

    Originariamente inviato da vicky
    Ne deduco che per un TDBCtrlGrid non è possibile impostare l'Hint per ogni TImage contenuto?
    No, presumo sia possibile, inizializzando la proprietà Hint così come carichi l'immagine al suo interno.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Il TDBCtrlGrid dev'essere grande a sufficienza per mostrare tutti i record, poiché usi una TScrollBox per scorrerlo. Quindi, il controllo TDBCtrlGrid avrà la lunghezza massima possibile per poter ospitare i record, senza doverli scorrere, e inserito nella TScrollBox sarà quest'ultima a fornire le barre di scorrimento per navigare il controllo in tutta la sua lunghezza complessiva. In caso contrario, non avrebbe senso usare la TScrollBox, no?
    Giustissimo. Ma se io non so quanti record verranno estratti dal database e quindi non posso definire a priori la lunghezza della TDBCtrlGrid c'è un modo di farlo da codice oppure è un'impresa impossibile?


  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da vicky
    Giustissimo. Ma se io non so quanti record verranno estratti dal database e quindi non posso definire a priori la lunghezza della TDBCtrlGrid c'è un modo di farlo da codice oppure è un'impresa impossibile?
    Sì che puoi determinare a priori il numero di record, al massimo con una query del tipo
    SELECT COUNT....
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.