Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: alexarmato66 - Maggio 24, 2023, 01:23:09 pm

Titolo: RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Maggio 24, 2023, 01:23:09 pm
Mettendo ColumnClickSorts TRUE è possibile ordinare le righe della stringgrid
agendo sull'intestazione della colonna.Però non riesco a capire perchè l'ordinamento
crescente (decerescente) è di questo tipo:
ad esempio partendo da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Facendo un sorting ottengo
1
10
11
12
13
14
15
2
3
4
5
6
7
8
9


Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Maggio 24, 2023, 01:43:13 pm
Ho parzialmente risolto il problema modificando la seguente funzione:
Codice: [Seleziona]
function TCustomStringGrid.DoCompareCells(Acol, ARow, Bcol, BRow: Integer): Integer;
begin
  if Assigned(OnCompareCells) then
    Result:=inherited DoCompareCells(Acol, ARow, Bcol, BRow)
  else begin
   // Result:=UTF8CompareLatinTextFast(Cells[ACol,ARow], Cells[BCol,BRow]);

    //--------------------------    Modificato x ordinare stringgrid
   try
     result := CompareValue(StrTofloat(Cells[ACol,ARow]), StrTofloat(Cells[BCol,BRow]));
   Except
     result := AnsiCompareText(Cells[ACol,ARow], Cells[BCol,BRow]);
   end;

    //-------------------------------------------
    if SortOrder=soDescending then
      result:=-result;
  end;
end;                             
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: Avogadro - Maggio 24, 2023, 01:51:40 pm
Perchè il "bianco" (chr32) "pesa"

Se metti dei bianchi e allinei numeri a destra l' ordinamento funziona

Ci sono le funzioni "pad"  che si possono usare : https://www.freepascal.org/docs-html/rtl/strutils/padleft.html
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: bonmario - Maggio 24, 2023, 02:58:57 pm
Però non riesco a capire perchè l'ordinamento crescente (decerescente) è di questo tipo:

Perché lui fa un ordinamento di stringhe, non lo sa che quelli sono numeri, e quello che fa, dal suo punto di vista è corretto !
Nella tua "DoCompareCells" dovresti fare questo per ognuna delle 2 celle su cui fa il confronto:
- mettere il valore della cella in una variabile di tipo stringa
- fare la trim di questa variabile
- convertire la variabile in una numerica, ed usare questa numerica per fare il confronto

naturalmente lo puoi ottimizzare facendo tutto in un colpo solo, ho preferito scrivere i singoli passaggi per provare a spiegarmi meglio !
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Maggio 24, 2023, 03:07:48 pm
In realtà nella stringgrid ho i numeri centrati nella cella.
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: bonmario - Maggio 24, 2023, 03:11:39 pm
lo sai tu che sono numeri, ma il compilatore no !!!
P.S. Li hai centrati mettendo degli spazi prima e/o dopo?
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Maggio 24, 2023, 03:34:21 pm
in PrepareCanvas  :

Codice: [Seleziona]
ts.Alignment := taCenter;
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Maggio 24, 2023, 03:36:18 pm
ho fatto alcune verifiche e sembrerebbe che la funzione di cui sopra funzioni.
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Maggio 25, 2023, 08:09:41 pm
orpo ....ho ricompilato il programma su un altro computer ed il problema iniziale si è riconfermato.
Avevate ragione ma non capisco perchè funzioni sul computer di partenza.Indagherò..... :(
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Maggio 26, 2023, 08:04:38 pm
Scusate non avero ricopiato il file Grids.pas. Funziona perfettamente con
la seguente modifica alla funzione TCustomStringGrid.DoCompareCells:
Codice: [Seleziona]
function TCustomStringGrid.DoCompareCells(Acol, ARow, Bcol, BRow: Integer): Integer;
begin
  if Assigned(OnCompareCells) then
    Result:=inherited DoCompareCells(Acol, ARow, Bcol, BRow)
  else begin
   // Result:=UTF8CompareLatinTextFast(Cells[ACol,ARow], Cells[BCol,BRow]);

    //--------------------------    Modificato x ordinare stringgrid
   try
     result := CompareValue(StrTofloat(Cells[ACol,ARow]), StrTofloat(Cells[BCol,BRow]));
   Except
     result := AnsiCompareText(Cells[ACol,ARow], Cells[BCol,BRow]);
   end;

    //-------------------------------------------
    if SortOrder=soDescending then
      result:=-result;
  end;
end;                   
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: Avogadro - Maggio 26, 2023, 08:39:49 pm
"CompareValue("

 ::)

https://www.freepascal.org/docs-html/rtl/math/comparevalue.html

"Description

CompareValue compares 2 integer or floating point values A and B and returns one of the following values:

-1
    if A<B
0
    if A=B
1
    if A>B "


 :)

in pratica l' "if ternario" del buon vecchio fortran


A proposito di fortran, magari questo comando puo' tornare utile nel maneggiare stringhe e numeri *

https://www.freepascal.org/docs-html/rtl/sysutils/trystrtofloat.html

Io ad ogni modo preferisco il buon vecchio parser:

https://wiki.freepascal.org/How_To_Use_TFPExpressionParser

Morale: ci sono tanti modi diversi di affrontare lo stesso problema .


*
come nel fortran è possibile usare l' input formattato per leggere i dati da un file di testo o da un memo

https://www.freepascal.org/docs-html/rtl/sysutils/sscanf.html

alias: siamo nel campo della validazione del data entry; per l' input da tasiera c'è il "mask edit ":

https://wiki.freepascal.org/TMaskEdit

L' unico problema è "tararlo" , ossia collaudarlo per le reali esigenze dell' utenza finale; magari si potrebbe fare un 3ad ad hoc sulla validazione del data entry .
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Maggio 27, 2023, 04:52:03 pm
Grazie Avogadro , mi toccherà studiare un botto!! :)
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: Avogadro - Maggio 27, 2023, 10:39:36 pm
Sono solo modi per cercare di semplificarsi la vita nel data entry.

Preferisco creare dei file testo da dare poi "in pasto"  ai sw, piuttosto che stare lì a riempire caselle .
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: Stilgar - Maggio 29, 2023, 11:10:41 am
Viva la pigrizia creativa ;)
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: Avogadro - Maggio 29, 2023, 02:31:05 pm
Nessuna pigirizia per creativa che essa sia, sto venendo da una visita medica -una tortura cinese - ed è venuto fuori che l'aver passato anni ed anni a fare data entry e a cliccare su caselle e message box su software pensati  a tutto eccetto che all' ergonomia mi ha causato dei problemi purtroppo irreversibili .

Anche queste sono cose da tenere in conto quando si progetta un software con un data entry massiccio.
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: Stilgar - Maggio 29, 2023, 03:17:08 pm
Ah, io son pigro.
Ci metto 10 giorni a farlo fare al computer.
 ;D
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: DragoRosso - Maggio 29, 2023, 04:11:14 pm
.... è venuto fuori che l'aver passato anni ed anni a fare data entry e a cliccare su caselle e message box su software pensati  a tutto eccetto che all' ergonomia mi ha causato dei problemi purtroppo irreversibili .
Anche queste sono cose da tenere in conto quando si progetta un software con un data entry massiccio.

I software hanno sicuramente una importanza sulla cosa, ma prima di tutto serve studiare la postazione di lavoro. Nella stragrande maggioranza dei casi la postazione di lavoro è fuori da tutti i "crismi" per un corretto uso.

Appoggia gomiti (quasi tutte le sedie da ufficio serie c'è l'hanno), alzo per i polsi, tastiera ergonomica, monitor regolabile e basculante (è praticamente impossibile che un supporto fisso sia adeguato per tutti), piano scrivania non lucido ne riflettente, supporto per i piedi, schienale sedia e seduta adeguati per il lavoro da svolgere.
Corretto ritmo uso PC/monitor e pause (obbligatorie per legge).

Questo è il minimo per non rimpiangere poi la salute andata ... e parla uno che alle volte si dimentica pure di mangiare passando anche 7 ore davanti al monitor senza neanche ricordarsi di respirare  :o

Comunque ormai i "dataentry" sono per lo più automatizzati e la maggior parte del lavoro è di controllo. E' vero che lavoro manuale fortunatamente c'è ne ancora, ma non dovrebbe essere così ossessionante come nel passato.

Alle volte mi capita (e oggi è stata una di quelle volte) di andare da un cliente che mi chiede (sul software che dovrei sviluppargli) i dataentry per la produzione (sviluppo sw industriali per il controllo di qualità) ... quando ha già un controller di produzione da cui si possono attingere tutti i dati in automatico. Ridendo gli dico che se non vuole la presa in automatico il software gli costa tre volte tanto per il dataentry. E guarda caso il dataentry diventa magicamente non necessario  ;)

Auguri per le magagne e alla prossima.

Ciao

Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: Avogadro - Maggio 29, 2023, 07:54:48 pm
"Poggiare i gomiti": il doc ha detto che questo è stato il mio problema , un pessima postura lì sulla scrivania, stare con i gomiti poggiati.

Inutile stare qui a piangere sul latte verstao, ormai è andata così, pazienza. Il fatto è che la scrivania era ed è un banco arrangiato alla meno peggio, la sedia una di quelle da sala d'attesa - ed era già tanto averla avuta -, il mouse ergonomico l' ho dovuto compare di tasca mia dai cinesi, così come il monitor.

Ma la parte peggiore il software: un mare di dialog box su cui cliccare, una dialog box per ogni operazione, caselle di testo striminzite - scrivere in wordpad e poi copiare all' interno - , scroll bar spesse pochi micron, da cercare con la lente e così via . Protestare ? Non è servito a nulla, il periodo è questo, non è che ci sia granché da fare  per migliorarlo.

Morale: rimpiango il vecchio fortran con i file di testo da dare in input, con monitor con i caratteri verdi e lo sfondo nero , ma erano altri tempi, forse migliori di questi, non so, c'erano tante speranze .

Proseguendo: "data entry automatizzato", è un progetto su cui mi sto applicando adesso; la ratio è far trasmettere i dati alla macchina in automatico sul gestionale;   le nuove macchine in pratica lo fanno tutte , rimane il problema di sincronizzare i formati di data e tempo delle varie postazioni pc - ossia, ci sono tante macchine che mandano i dati al gestionale,  macchine di produttori ed anni diversi, con sistemi operativi diversi,  e per evitare casini, data e tempo devono avere gli stessi formati ed essere sincronizzati.

Rimane alla fine il probelma della validazione dei dati raccolti dal gestionale:  ed è lì che si passano le giornate.
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: Avogadro - Giugno 01, 2023, 02:33:09 am
Nel data entry spesso vanno inseriti dei dati che sono il risultato di calcoli .

Nei casi piu' semplici c'è sempre a portata di click una calcolatrice e il gioco è fatto ; esistono poi varie librerie che mettono a disposizione di un box di input una calcolatrice che si attiva pigiando l'apposito tasto laterale .

Purtuttavia c'è il problema della tracciabilità, in alcuni ambiti  è di fatto una vera ossessione, alias "come hai ottenuto questo risultato? dove sono i passaggi ? "

Pertanto in tanti gestionali sono tracciati tutti i passaggi dell' utente: tutte el cose che fatto vengono registrate da qualche parte  affinché poi posso essere riviste qualora ci sia la necessità.

Questo appesantisce di molto i sistemi (software piu' hardware) ma è una prassi che ormai ha preso piede e che h auna sua ragione d'essere.; ad esempio, se un'apparecchiatura si rompe, il tecnico deve poter scorre indietro nel tempo tutte le operazioni fatte e vedere così dove si è creato il problema.

Tornando al data entry, nel caso di dati che vengono da calcoli è opportuno garantire la loro tracciabilità; questo puo' essere facilmente fatto usando come input non il dato finale, ma la formula,o meglio l'espressione matematica,  che l'ha generato; un esempio

totale=prezzo base +iva al 20 % => 100+100*0.2 =120

quindi si digita 100+100*0.2 e il software deve calcolare in automatico 120 e così ad un controllo futuro è tracciabile da dove arrivi quel 120

Si tratta quindi di fare il parsing di una stringa e poi fare i calcoli in automatico

Senza riscoprire la ruota, sia su delphi sia su lazarus ,- e ovviamente anche su altri sistemi, sono già da sempre disponibili dei parser di espressioni matematiche , basta prenderli da une qualche libreria ed usarli - un tempo se ne trovavano a iosa  sul web,  poi man mano nel tempo sono scomparsi  sepolti appunto dalla sabbia del tempo .

Cio' premesso su rosetta code vi è una paginetta che illustra come questo problema viene affrontato dai diversi linguaggi di programamzione. :

https://rosettacode.org/wiki/Arithmetic_evaluation

E c'è una paginetta dedicata a delphi:

https://rosettacode.org/wiki/Arithmetic_evaluation/Delphi

Non tutto è perduto, ancora si trovano cose interessanti sul web e non solo bolle di confirmation bias .

.
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: alexarmato66 - Giugno 04, 2023, 03:07:21 pm
WOW, grazie Avogadro!!
Titolo: Re:RISOLTO_ORDINARE UNA STRINGGRID MEDIANTE LA PROPRIETA' ColumnClickSorts
Inserito da: nomorelogic - Giugno 04, 2023, 05:31:58 pm
visto l'argomento, volevo anche segnalare questa classe

https://wiki.lazarus.freepascal.org/How_To_Use_TFPExpressionParser (https://wiki.lazarus.freepascal.org/How_To_Use_TFPExpressionParser)

dategli un'occhiata che forse risolve il problema