Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: darione - Novembre 04, 2020, 05:16:53 pm

Titolo: Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: darione - Novembre 04, 2020, 05:16:53 pm
Salve, avrei una domanda.

Dentro un pannello scrollabile, ho creato N volte una serie di oggetti,
cioè un visualizzatore html, una label, un bottone. A volte ne creo a centinaia, dipende ...
se son pochi tutto ok, ma se sono tanti, diventa lentissimo.

Questo che ho evidenziato in celeste, insomma, lo creo molte volte in verticale nello scrol,
a runtime;

https://pasteboard.co/JyOYNK7.png

A parte che ho scoperto che il pannello di scroll in verticale non arriva oltre i 32mila punti , per cui a volte quando crea il componente ennesimo, si blocca dando errore. Bel problema, non lo sapevo proprio, la proprietà .top di un componente grafico ha il tipo intero corto ... non ci sarà modo di bypassre questo problema, simulando insomma una pagina web di lunghezza infinita?

Va beh, a parte questo difetto, ho il problema che diventa lento quando creo centinaia di oggetti ripetuti a questo modo.

Qualcuno di voi ha avuto problemi di creazione a runtime di centinaia di oggetti grafici e verificato che diventa lento? probabilmente il componente TIpHtmlPanel è troppo pesante, oppure sbaglio qualcosa? che dite? io sto facendo così, dove "scrollboxRisultati" è il componente TscrollBox dove vado a generare dinamicamente gli oggetti:


         riquadriRisultati := TIpHtmlPanel.Create(self);
         riquadriRisultati.DataProvider := riquadriRisultatiProvider;
        // riquadriRisultati.Anchors := riquadriRisultati.Anchors + [akRight];
         riquadriRisultati.parent := scrollboxRisultati;
         riquadriRisultati.left := 0;
         riquadriRisultati.top := posV;
         riquadriRisultati.width := scrollboxRisultati.width - 150;
         riquadriRisultati.height := 200;
         riquadriRisultati.DefaultFontSize:=strToInt(cbSize.items.strings[cbSize.ItemIndex]);

         riquadriRisultatiLabel := Tlabel.Create(self);
         riquadriRisultatiLabel.left := riquadriRisultati.left + riquadriRisultati.width + 10;
         riquadriRisultatiLabel.width := 60;
         riquadriRisultatiLabel.height := 30;
         riquadriRisultatiLabel.top := posV - 1;
         riquadriRisultatiLabel.caption := 'Risultato ' + intToStr(i+1);
         riquadriRisultatiLabel.tag := i;
         riquadriRisultatiLabel.parent := scrollboxRisultati;


         riquadriRisultatiBtnLeggi := TBitBtn.Create(self);
         riquadriRisultatiBtnLeggi.left := riquadriRisultati.left + riquadriRisultati.width + 10;
         riquadriRisultatiBtnLeggi.width := 80;
         riquadriRisultatiBtnLeggi.height := 30;
         riquadriRisultatiBtnLeggi.top := posV - 1 + 20;
         riquadriRisultatiBtnLeggi.caption := 'Apri';
         riquadriRisultatiBtnLeggi.tag := i;
         riquadriRisultatiBtnLeggi.parent := scrollboxRisultati;
         riquadriRisultatiBtnLeggi.OnClick := @clickBottoneRisultato;   


Grazie per le dritte eventuali ... se non trovo un altro modo, devo cambiare metodo. Se il componente web è troppo pesante forse posso provare con altri, ma quale scelgo dovendo visualizzare del testo con parole anche colorate? tempo fa provai i componenti SynEdit ma alla fine mi ero perso ... mi basterebbe evidenziare, che so, la terza, la quarta, la dodicesima parola di rosso, mentre le altre di nero ...  conoscete qualche tutorial chiaro? ne avevo trovati ma mi ci persi ...




Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: nomorelogic - Novembre 04, 2020, 05:38:48 pm
ciao
hai pensato se è possibile fare un approccio tipo VirtualTreeView?

Nel senso che il pannello TIpHtmlPanel è sempre e solo uno e, quando sposti il cursore, avviene la lettura corrispondente.
In questo modo risparmi un bel po' di risorse.
Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: bonmario - Novembre 04, 2020, 06:16:38 pm
Io di solito in questi casi uso BeginUpdate ed EndUpdate.
Prova a vedere se gli oggetti che usi tu li mettono a disposizione.

Ciao, Mario
Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: darione - Novembre 04, 2020, 06:49:53 pm
ciao
hai pensato se è possibile fare un approccio tipo VirtualTreeView?

Nel senso che il pannello TIpHtmlPanel è sempre e solo uno e, quando sposti il cursore, avviene la lettura corrispondente.
In questo modo risparmi un bel po' di risorse.

Eh si, a dire il vero nella versione predente l'ho in questo modo: un listbox con tanti elementi, ne clicchi uno e vedi il risultato a destra in un pannello web, come dicevi te più o meno ....

E' che mi era venuto in mente che era più bello scorrere i risultati con la rotella del mouse facendo come di fa di solito nelle pagine web ... solo che evidentemente una pagina web non è come una gui ... non pensavo fosse pesante a questo modo ... vabbè mi sa che dovrò fare come dici tu.

Ciao, grazie mille.


Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: darione - Novembre 04, 2020, 06:52:15 pm
Io di solito in questi casi uso BeginUpdate ed EndUpdate.
Prova a vedere se gli oggetti che usi tu li mettono a disposizione.

Ciao, Mario

Mmm non li ho mai usati ... grazie, li proverò prima di tornare all'approccio treeview ...
Grazie per la dritta ...
Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: bonmario - Novembre 04, 2020, 07:59:49 pm
Io di solito li uso con le TStringList e le TMemo ... vado a memoria:
Codice: [Seleziona]
MiaStringList.BeginUpdate;
.... codice di popolamento ...
MiaStringList.EndUpdate;

MiaMemoList.Lines.BeginUpdate;
.... codice di popolamento ...
MiaMemoList.Lines.EndUpdate;

Ciao, Mario
Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: darione - Novembre 04, 2020, 10:07:20 pm
Io di solito li uso con le TStringList e le TMemo ... vado a memoria:
Codice: [Seleziona]
MiaStringList.BeginUpdate;
.... codice di popolamento ...
MiaStringList.EndUpdate;

MiaMemoList.Lines.BeginUpdate;
.... codice di popolamento ...
MiaMemoList.Lines.EndUpdate;

Ciao, Mario

Ciao Mario , scusa ma a che serve fare così sulle tstringlist? Io le uso moltissimo in delphi e non ho mai usato questi begin end, quindi mi interessa. Rendono più veloce l'accodamento di stringhe?

Darione
Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: bonmario - Novembre 05, 2020, 07:52:50 am
Hai ragione, scusa, intendevo TStringGrid ...

Ciao, Mario
Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: darione - Novembre 06, 2020, 09:27:08 am
Ah ok, allora è come .enableControls e .disableControls che faccio sempre sul TClientDataSet in Delphi.

Darione
Titolo: Re:Creare a runtime centinaia di oggetti. E' lento ... se usassi synedit?
Inserito da: bonmario - Novembre 06, 2020, 10:26:20 am
Grazie per le dritte eventuali ... se non trovo un altro modo, devo cambiare metodo. Se il componente web è troppo pesante forse posso provare con altri, ma quale scelgo dovendo visualizzare del testo con parole anche colorate? tempo fa provai i componenti SynEdit ma alla fine mi ero perso ... mi basterebbe evidenziare, che so, la terza, la quarta, la dodicesima parola di rosso, mentre le altre di nero ...  conoscete qualche tutorial chiaro? ne avevo trovati ma mi ci persi ...

Dimenticavo: se alla fine passerai a SynEdit, prima di far partire il ciclo con cui vai a popolare ed evidenziare, ricordati di mettere questa:
Codice: [Seleziona]
  SynEditTrovati.BeginUpdate(False);

con relativo "SynEditTrovati.EndUpdate;" finale.

Il "false" tra parentesi, serve a non abilitare la "Undo". Questo ti velocizzerà le operazioni di molto.


Ciao, Mario