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

    [Delphi] Evitare colonne bianche in TGrids

    ciao gente.

    ho notato che delphi ha la fastidiosa abitudine di creare delle TStringGrid che, invece di essere carine e precise come in altri programmi, quando le colonne superano la larghezza massima del componente ed appare la Hscrollbar, scorrendo, pur essendo finite le colonne, rimane sempre un LARGO spazio bianco seguente l'ultima colonna.

    mi sapreste suggerire come fare per vitare che si veda sto dannato spazio bianco e che la scrollata si blocchi alla fine dell'ultima colonna e non prosegua per chilometri mostrando oscenità da tenere nascoste?

    graize e

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,477
    Quello che hai denunciato non è un fastidioso bug ma un normale funzionamento della griglia.

    Lo scrolling della griglia non è uguale a quello degli altri controlli, quando ti sposti con la barra orizzontale, Delphi ha sempre cura di visualizzare la prima colonna per intero (e non "tagliata" dal bordo), pertanto se la tua griglia non ha una larghezza che sia multipla della larghezza della colonna, ovviamente sul margine destro vedrai sempre lo spazio bianco di scarto.

    Il mio suggerimento, che è anche la soluzione più rapida, è quello di dimensionare la griglia in modo che Delphi non faccia visualizzare lo scarto; intervenire su questo funzionamento predefinito potrebbe avere più effetti collaterali che altro.

    Se la griglia è stata usata come espediente per ottenere in poco tempo un controllo che in realtà dovrebbe essere più complesso, allora forse conviene cercare qualcosa di maggiormente appropriato, se esiste, o aggirare il problema.

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

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

  3. #3
    scusa l'intempestività della risposta, ma l'anit spam aveva eliminato la notifica al messsaggio.

    1) il controllo che uso è indispensabile ne una via rapida che possa essere evitata: devo gestire delle informazioni in una tabella punto e basta
    2) riguardo al fatto di dimensionarla in modo proporzionale, ci avevo provato MANUALMENTE, il problema è che su altri pc un minimo bordo bianco si vede e ciò non è possibile visto che unna procedura che agisce sulla tabella mi da un errore se si finisce "nel bianco".

    grazie e scusa ancora per il ritardo!



  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,477
    Originariamente inviato da Lyll0
    scusa l'intempestività della risposta, ma l'anit spam aveva eliminato la notifica al messsaggio.
    Beh, direi che quell'antispam funziona egregiamente.

    Originariamente inviato da Lyll0
    1) il controllo che uso è indispensabile ne una via rapida che possa essere evitata: devo gestire delle informazioni in una tabella punto e basta
    Il fatto che le informazioni debbano essere presentate in modo tabellare non significa che la StringGrid o il suo parentado di griglie sia comunque il controllo più adatto, visto i problemi che sorgono.

    Originariamente inviato da Lyll0
    2) riguardo al fatto di dimensionarla in modo proporzionale, ci avevo provato MANUALMENTE, il problema è che su altri pc un minimo bordo bianco si vede e ciò non è possibile visto che unna procedura che agisce sulla tabella mi da un errore se si finisce "nel bianco".
    Scusa, ma come può andare in errore una procedura che tiene conto del cosiddetto "bianco"? Ciascuna griglia è composta da un numero preciso di righe e colonne ed ogni operazioni sui dati che contiene o limitatamente a quelli selezionati dovrebbe tenere conto solo di queste informazioni; mi spiego meglio: non è possibile selezionare una riga/colonna che non appartiene alla griglia (se si fa clic nello spazio vuoto non accade nulla), quindi il problema vero è da ricercarsi altrove, cioè nel fatto che stai utilizzando qualche dato come le coordinate del mouse che provocano errori nel tuo codice poichè devi prescindere da simili dati e basarti solo sugli indici di riga e colonna che determinano la cella selezionata nella griglia.
    Ogni altro uso di tipo differente è un "forzare" la griglia a fare qualcosa per la quale non è stata progettata, quindi occorre saper bene dove mettere le mani se la si vuole personalizzare, ma come dicevo nel messaggio precedente è meglio, a quel punto, usare un altro tipo di controllo o pensare ad un modo differente per rappresentare lo stesso tipo di informazioni.

    Originariamente inviato da Lyll0
    grazie e scusa ancora per il ritardo!
    Per me non c'è nessun problema, io son sempre qui.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    grazie per la pazienza.
    mi diresti che ne pensi di questo codice?
    codice:
    procedure TMainForm.Griglia(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    var
      R, C: Integer;
    begin
      if (chkHint.Checked=true) then //serve per far partire o meno la procedura
        begin
          griglia.ShowHint:=true;
          griglia.MouseToCell(X, Y, C, R);
          with grigli do
            begin
              if ((Row<>R)or(Col<>C)) then
                begin
                  if (R>RowCount) or (C>ColCount) then exit;
                  If (r=0) then exit;
                  Row:=R;
                  Col:=C;
                  Application.CancelHint;
                  griglia.Hint:=griglia.Cells[c,r];
                end;
            end;
        end
      else griglia.ShowHint:=false;
    end;
    visto che le celle della griglia sono più piccole dedl contenuto delle stesse avevo pensato di trovare una procedura che mostrasse AUTOMATICAMENTE il contenuto di una cella quando il mousevi passava sopra...
    il checkbutton all'inizio cel'ho messo perchè altrimenti è scomodo inserire il testo e dunque attiva/disattiva la procedura...
    per il resto non riesco a capire cosa sia a generare l'errore...



    e grazie

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,477
    Prima di utilizzare la proprietà Cells con gli indici individuati, devi controllare che non superino i valori massimi per gli indici di riga e colonna, altrimenti l'errore più probabile che ottieni è un bel List index out of bounds.

    P.S.: il codice va copiato e incollato senza essere modificato, altrimenti rischi di introdurre degli errori che io mi scervello a correggere e, alla fine, sono solo errori di battitura (non te l'avevo già detto?)
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  7. #7
    P.S.: il codice va copiato e incollato senza essere modificato, altrimenti rischi di introdurre degli errori che io mi scervello a correggere e, alla fine, sono solo errori di battitura (non te l'avevo già detto?)
    si che lo so
    ho copiato ed incollato!

    tornando a noi,
    nel codice che ti ho proposto pensavo fossero sufficienti queste linne per interrompere la procedura ed evitare l'errore che tu giustamente hai tanato LIST INDEX OUT OF BOUNDS... che in realtà è Grid INdex out of range...
    codice:
    if (R>RowCount) or (C>ColCount) then exit;
    che altro ci devo mettere scusa?
    cioè: se il numero che stai cercando di trattare supera il numero delle righe/colonne ESCI....

    ciao e grazie!

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,477
    Originariamente inviato da Lyll0
    si che lo so
    ho copiato ed incollato!
    Allora come mai appare un pezzo di codice con "grigli" senza la "a"?
    codice:
    with grigli do
            begin
    Certo, in questo caso si capisce a cosa fa riferimento, ma come questo errore potrebbero essercene altri più subdoli e comunque individuabili sebbene inesistenti. Lascia il codice che copi e incolli così com'è

    Originariamente inviato da Lyll0
    tornando a noi,
    nel codice che ti ho proposto pensavo fossero sufficienti queste linne per interrompere la procedura ed evitare l'errore che tu giustamente hai tanato LIST INDEX OUT OF BOUNDS...
    Chissà come ho fatto...

    Originariamente inviato da Lyll0
    codice:
    if (R>RowCount) or (C>ColCount) then exit;
    che altro ci devo mettere scusa?
    cioè: se il numero che stai cercando di trattare supera il numero delle righe/colonne ESCI....
    L'indice parte sempre da 0 (zero), quindi i limiti massimi per gli indici di riga e colonna sono RowCount - 1 e ColCount - 1.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  9. #9
    non ho capito!!!!!!!!!!!

    dunque che dovrei fare secondo te???

    PS: scusa per la storia della griglia!

    dici che è sufficiente fare così:
    codice:
    if (R>RowCount) or (C>ColCount) or (R=-1) or (C=-1) then exit;
    per ora non mi da errori, ma siamo sicuri che il bug sia DEFINITVAMENTE RISOLTO??

    ciao e grazie

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,477
    Prova con
    codice:
      if (R > (RowCount - 1)) or ( C > (ColCount - 1)) then
        Exit;
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.