* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 21, 2024, 09:33:52 pm

Inserisci il nome utente, la password e la durata della sessione.

106 Visitatori, 1 Utente

Autore Topic: rxdbgrid  (Letto 2069 volte)

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
rxdbgrid
« il: Dicembre 21, 2021, 10:55:25 pm »
Ho installato la mitica libreria RxLib

https://wiki.lazarus.freepascal.org/RXfpc

Il componente che uso per la maggiore è la RxDbGrid, che permette di fare cose carine, tipo le righe multilinee, la possibilità di avere l' hint sui titoli delle colonne etc .

RxDbgrid ha sempre funzionato egregiamente , fin dai tempi del buon vecchio delphi 5

Ora stavo aggiornando un sw per delle carte di controllo e una rxdbgrid (ne uso 3, relazioni master-detail in cascata) , la prima,  ad un certo punto non mostra piu' il testo, le celle restano a run time bianche - il testo compare a design time -, vedasi allegato .

L' ho disinstallata e reinstallata, ma niente il bug si ripresenta sempre sulla stessa ztable (uso zeos e slqlie)

Qualcuno ha un' idea di cosa possa mai succedere che scompare il testo della rxdbgrid a runtime?

Ho cercato sul web ma non ho trovato segnalazioni di casi simili.

Dovro' tornare alla buona vecchia dbgrid di lazarus,  ma come si fa allagare le righe in maniera dinamica in funzione della lunghezza del testo ?  Le dbgrid con le righe tutte larghe sono visivamente orribili

Alternativamente: c'è un'altra  dbgrid performante in un qualche pkg ?

« Ultima modifica: Dicembre 21, 2021, 11:05:11 pm da Avogadro »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:rxdbgrid
« Risposta #1 il: Dicembre 22, 2021, 12:02:10 am »
Non conosco quei componenti.

Ma dalle immagini, noto che la prima riga della prima tabella in design mostra nel primo campo data e ora. La seconda riga invece no.

Non è che hai qualche definizione incongruente nella griglia / database ? O il contenuto del DB non collima (si, sò che stò probabilmente dicendo una ca..ata, ma nel passato mi è capitato proprio con data e ora) ?

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

bonmario

  • Hero Member
  • *****
  • Post: 1358
  • Karma: +11/-1
Re:rxdbgrid
« Risposta #2 il: Dicembre 22, 2021, 08:11:02 am »
Ciao,
non conosco quel componente, in passato mi è successo che se nel testo c'erano lettere accentate o caratteri particolari, nascondesse il tutto.
Prova a vedere se ti fa lo stesso scherzo con dati che contengono solo lettere e numeri.

Per quanto riguarda le celle su più righe, io uso questa da anni, sia in Windows che in Linux:

Codice: [Seleziona]
{Permette di scrivere una cella su più righe tramite l'utilizzo del LineEnding.
Aggiungere il richiamo della presente "procedure" all'interno della "DrawCell"}
procedure ScriviCellaSuPiuRighe(Sender:TObject; aCol, aRow:Integer; aRect:TRect; VFSistemaColori:Boolean = True; Allineamento:TAlignment = taLeftJustify);
var WrkStr:String;
    DrawRect:TRect;
    WrkAltRiga:Longint;

  function PreparaFlags(Flags: Cardinal): Cardinal;
  begin
    case Allineamento of
      taLeftJustify : Result:=Flags or DT_LEFT  ;
      taRightJustify: Result:=Flags or DT_RIGHT ;
      taCenter      : Result:=Flags or DT_CENTER;
    else
      Result:=Flags;
    end;
  end;

begin
  with (Sender as tStringGrid), Canvas do begin
    { erase earlier contents from default drawing }
    if VFSistemaColori then begin
      if (aRow >= FixedRows) and (aCol >= FixedCols) then begin
        //Se la riga è selezionata, e tra le opzioni della tabella
        //c'è la selezione per riga, cambio il colore dello sfondo
        if (aRow = Row) and (goRowSelect in Options) then begin
          Brush.Color:=SelectedColor;
          Font.Color:=clWhite;
        end else begin
          Brush.Color:=Color;
          Font.Color:=clWindowText;
        end;
      end else begin
        Brush.Color:=FixedColor;
        Font.Color:=clWindowText;
      end;
    end;
    FillRect(aRect);

    { get cell contents }
    WrkStr:=Cells[aCol, aRow];
    if Length(WrkStr) > 0 then begin
      { copy of cell rectangle for text sizing }
      DrawRect:=aRect;

      if (Pos(LineEnding, WrkStr) > 0) then begin
        //Se la riga da emettere contiene "LineEnding", riformatto la cella
        {$IFDEF LINUX}
          //Dopo aver aggiornato Ubuntu alla 20.04, se la cella era su più righe, l'ultima riga veniva
          //tagliata.
          //Questo è l'unico modo "empirico" con cui sono riuscito a risolvere
          WrkStr:=WrkStr + LineEnding + LineEnding + LineEnding + LineEnding;
        {$ENDIF}

        { get size of text rectangle in DrawRect, with word wrap }
        DrawText(Handle, PChar(WrkStr), Length(WrkStr), DrawRect, PreparaFlags(DT_CALCRECT or DT_WORDBREAK));
        WrkAltRiga:=DrawRect.Bottom - DrawRect.Top;
        if (WrkAltRiga > RowHeights[aRow]) then begin
          //L'altezza della cella deve essere variata perché la cella ridisegnata è più alta o più bassa
          //N.B. La cella potrebbe essere più bassa quando, ad esempio diminuisco l'altezza del
          //     font a runtime, passando ad esempio da 20 a 12
          { cell word-wraps; increase row height }
          RowHeights[aRow]:=WrkAltRiga;
          {$IFDEF LINUX}
            //Su Linux, senza l'istruzione qui sotto, la cosa funzionerebbe solo
            //dopo aver cliccato su una cella qualsiasi della riga
            (Sender as TStringGrid).Repaint;
          {$ENDIF}
        end else begin
          { cell doesn't word-wrap }
          DrawRect.Right:=aRect.Right;
          FillRect(DrawRect);
          DrawText(Handle, PChar(WrkStr), Length(WrkStr), DrawRect, PreparaFlags(DT_WORDBREAK));
        end;
      end else begin
        //La cella da emettere non contiene "LineEnding": scrivo direttamente
        DrawText(Handle, PChar(WrkStr), Length(WrkStr), DrawRect, PreparaFlags(DT_SINGLELINE or DT_VCENTER));
      end;
    end;
  end;
end;

La devi richiamare nella "OnDrawCell", qui un esempio:
Codice: [Seleziona]
procedure TForm1.TabellaNoteDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
  ScriviCellaSuPiuRighe(Sender, aCol, aRow, aRect, False);
end;

La parte del codice che riguarda l'allineamento, magari non ti interessa, toglila pure.
Probabilmente ti servirà qualche definizione per farla funzionare, se c'è qualcosa che non ti quadra, chiedi pure, ma di sicuro non ti risponderò mai a mezzanotte !!! (mentre rispondevo ho notato l'ora in cui hai postato !!!)

Ciao, Mario

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
Re:rxdbgrid
« Risposta #3 il: Dicembre 22, 2021, 09:56:57 am »
Grazie per i suggerimenti.

Fortuna che avevo una copia di backup su una chiavetta usb , solo che adesso non so che fare : proseguo con la rxdbgrid o torno alla dbgrid con i suggerimenti di cui sopra ?

Anche secondo me c'è una qualche inconguenza da qualche parte, il problema è trovarla , si c'è il debug, ma il problema è trovare il tempo per scorrere il codice.

Come diceva il buon Mario il tempo vola e in un attimo si fanno le 11 di sera e a quell' ora stare li a leggere il codice sorgente  ...

Aggiungo altre informazioni, magari il problema è qui, proprio nelle informazioni .

Mi spiego meglio:

per le carte di controllo ci sono una serie di variabili che hanno un loro ruolo: la media, il range, la tolleranza, le misure etc;

quel che stavo cercando di fare era spiegare nell' hint dei titoli della rxbgrid cosa erano le variabili e quali erano i valori che dovevano avere (alias quale era il loro dominio) ;

il problema della scomparsa delle scritte (valori numerici compresi) si è presentato dopo che ho fatto gli hint della maggior parte dei titoli delle colonne della dbgrid; è come se il "sistema rxdbgrid" non reggesse piu' di tante informazioni; succedeva qualcosa di simile con le prime versioni di delphi su windows: se si metteva qualche icona in piu' o qualche hint in piu' l' eseguibile andava in crash  per mancanza di "hand" ;

si , c'è da qualche parte l' help contestuale,  devo provarlo ad implentarlo, solo che no trovato granché in merito sul web

ciao a tutti e grazie ancora e soprattutto buone feste


 









« Ultima modifica: Dicembre 22, 2021, 10:07:23 am da Avogadro »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:rxdbgrid
« Risposta #4 il: Dicembre 22, 2021, 10:13:08 am »
Purtroppo è il lavoro del programmatore.
Scrivere codice nuovo per gestire la DBGrid classica è comunque un impegno, magari relativo se l'hai già fatto, ma comunque un impegno. Tra l'altro non ti mantiene al riparo da futuri aggiornamenti della DBGrid stessa che rendano incompatibile il tuo codice.

Cercare di capire cosa c'è che non và forse è la strada preferibile e meno impegnativa, almeno secondo il mio punto di vista.

Apporfitto per linkare una canzonicina ........ sentitela che è divertente, si addice alla situazione e rispecchia un pò tutti noi.

http://www.donadeo.net/wp-content/uploads/2008/01/ballata_del_programmatore.mp3

Il testo di questa opera è di Enrico Colombini, arrangiamenti di Marco Di Francesco, voce Domenico Agostino, musica da "Il pescatore" di Fabrizio De Andrè.

Ciao
« Ultima modifica: Dicembre 22, 2021, 10:18:44 am da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:rxdbgrid
« Risposta #5 il: Dicembre 22, 2021, 10:26:32 am »
il problema della scomparsa delle scritte (valori numerici compresi) si è presentato dopo che ho fatto gli hint della maggior parte dei titoli delle colonne della dbgrid; è come se il "sistema rxdbgrid" non reggesse piu' di tante informazioni; succedeva qualcosa di simile con le prime versioni di delphi su windows: se si metteva qualche icona in piu' o qualche hint in piu' l' eseguibile andava in crash  per mancanza di "hand" ;

Per gli Hint, quello che ti consiglio è gestire l'HINT dinamico, ossia quando il mouse si muove su un zona del componente (colonna ad esempio) inserire nell'HINT del componente la stringa abbinata a quella colonna (ad esempio da un banale array di stringhe).

In questo caso hai un solo handle per l'HINT (quello di default del componente).

Contraccambio gli Auguri.

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
Re:rxdbgrid
« Risposta #6 il: Dicembre 23, 2021, 05:53:54 pm »
Il bug sembra collegato all' evento "onDrawColomnCell" che mi serve per mostare i decimali giusti *

Si rifarrano le 11 stasera per sanare questo bug

Pazienza, youtube con un po' di musica in sottofondo aiuterà ...



*
in pratica i decimali delle misure variano in funzione della misura, una corretta formattazione dei numeri rende leggibili (ed utili) le tabelle

ora la cosa funziona sulla classica dbgrid di lazarus, ma non sulla rxdbgrid - vai a capire il perchè - ; in ogni caso  mi pare che questo evento fosse deprecato

questo era il semplcie frammento di codice ,  levandolo dall' ipesttore degli oggetti tutto torna normale

var
      fs: string;
begin
   fs:=ztable2format.AsString;
   if (isemptystr(fs,[' '])=true) then
      fs:='0.000' ;
   if ((column.FieldName='XM') or (column.FieldName='R') or (column.FieldName='RM')) then
      column.DisplayFormat:=fs ; 

end;

ma pensa te

« Ultima modifica: Dicembre 23, 2021, 06:05:14 pm da Avogadro »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:rxdbgrid
« Risposta #7 il: Dicembre 23, 2021, 06:14:44 pm »
Questo è un esempio di cosa faccio io per disegnare in modo proprietario su una griglia:

Codice: [Seleziona]
procedure TFMain.SG_RisultatiDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var recttemp: TRect;
    tempMisura: TMisura;
    s1,s2: string;
begin
  if ARow > Elenco_Misure.Count then
    exit;
  if (ACol = 0) and (ARow > 0) then
    (Sender as TStringGrid).Canvas.TextOut(Rect.Left + 2, Rect.Top + (Rect.Height div 3), ARow.ToString);
  if (ACol = 2) and (ARow >= 1) then
    begin
      tempMisura := Elenco_Misure.Element[Arow-1];
      if Tarocco and (ARow = TaroccoMis) then
        begin
          s1 := '+0.000';
          s2 := '-0.000';
        end
      else
        begin
          if fControlloCampioneVISU then
            begin
              var ntp := abs(tempMisura.nTollPositiva / 10);
              if ntp < 0.015 then
                begin
                  ntp := 0.015;
                end;
              var ntn := abs(tempMisura.nTollNegativa / 10);
              if ntn < 0.015 then
                begin
                  ntn := 0.015;
                end;
              s1 := Format('+%.3f', [ntp], LocalFormat);
              s2 := Format('-%.3f', [ntn], LocalFormat);
            end
          else
            begin
              s1 := Format('+%.3f', [tempMisura.nTollPositiva], LocalFormat);
              s2 := Format('-%.3f', [abs(tempMisura.nTollNegativa)], LocalFormat);
            end;
        end;
      recttemp := Rect.SplitRect(srTop, 0.50);
      if (not tempMisura.bRisultato_Measure_P) and tempMisura.bDatiValidi then
        begin
          (Sender as TStringGrid).Canvas.Brush.Color := clRed;
        end
      else
        begin
          if (not tempMisura.bRisultato_Measure_N) and tempMisura.bDatiValidi then
            (Sender as TStringGrid).Canvas.Brush.Color := clWebLightPink;
        end;
      (Sender as TStringGrid).Canvas.FillRect(Recttemp);
      (Sender as TStringGrid).Canvas.TextOut(Recttemp.Left + 2, Recttemp.Top + 2, s1);
      recttemp := Rect.SplitRect(srBottom, 0.50);
      if (not tempMisura.bRisultato_Measure_N) and tempMisura.bDatiValidi then
        begin
          (Sender as TStringGrid).Canvas.Brush.Color := clRed;
        end
      else
        begin
          if (not tempMisura.bRisultato_Measure_P) and tempMisura.bDatiValidi then
            (Sender as TStringGrid).Canvas.Brush.Color := clWebLightPink;
        end;
      (Sender as TStringGrid).Canvas.FillRect(Recttemp);
      (Sender as TStringGrid).Canvas.TextOut(Recttemp.Left + 2, Recttemp.Top + 2, s2);
      exit;
    end;
  if (ACol >= 1) and (ARow >= 1) then
    begin
      tempMisura := Elenco_Misure.Element[Arow-1];
      if Tarocco and (ARow = TaroccoMis) then
        begin
        case ACol of
          1: begin
               s1 := '0.000';
             end;
          3: begin
               (Sender as TStringGrid).Canvas.Font.Style := [fsBold];
               if tempMisura.bDatiValidi then
                 s1 := '0.000'
               else
                 s1 := 'n.a.';
             end;
          4: begin
               (Sender as TStringGrid).Canvas.Font.Style := [fsBold];
               if tempMisura.bDatiValidi then
                 s1 := '0.000'
               else
                 s1 := 'n.a.';
             end;
        end;
        end
      else
        case ACol of
          1: begin
              if fControlloCampioneVISU then
                begin
                  s1 := Format('%.3f', [tempMisura.nMisura_Camp], LocalFormat);
                end
              else
                begin
                  s1 := Format('%.3f', [tempMisura.nRiferimento], LocalFormat);
                end;
             end;
          3: begin
               (Sender as TStringGrid).Canvas.Font.Style := [fsBold];
               if tempMisura.bDatiValidi then
                 s1 := Format('%.3f', [tempMisura.nMisura], LocalFormat)
               else
                 s1 := 'n.a.';
             end;
          4: begin
               (Sender as TStringGrid).Canvas.Font.Style := [fsBold];
               if tempMisura.bDatiValidi then
                 s1 := Format('%.3f', [tempMisura.nDiff], LocalFormat)
               else
                 s1 := 'n.a.';
             end;
        end;
      if ((not tempMisura.bRisultato_Measure_P) OR (not tempMisura.bRisultato_Measure_N)) and tempMisura.bDatiValidi then
        (Sender as TStringGrid).Canvas.Brush.Color := clWebLightPink;
      (Sender as TStringGrid).Canvas.FillRect(Rect);
      (Sender as TStringGrid).Canvas.TextOut(Rect.Left + 2, Rect.Top + (Rect.Height div 3), s1);
    end;
end;

Il codice scrive dei dati preelaborati e presenti un array (sotto forma di record).

Magari il codice è un pò criptico, ma non è complesso da capire.

EDIT: Come appare la griglia in allegato.

Ciao
« Ultima modifica: Dicembre 23, 2021, 06:19:38 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Avogadro

  • Full Member
  • ***
  • Post: 217
  • Karma: +0/-0
Re:rxdbgrid
« Risposta #8 il: Dicembre 23, 2021, 06:26:40 pm »
Ho risolto:

è bastato usare l'evento "onPrepareCanvas"

Ciao e grazie




 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19169
  • Topic in totale: 2286
  • Online Today: 123
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 106
Total: 107

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.