* * * *

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.
Marzo 25, 2025, 10:39:41 pm

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

169 Visitatori, 0 Utenti

Autore Topic: Problema con BitMap  (Letto 663 volte)

marrosso

  • Newbie
  • *
  • Post: 4
  • Karma: +0/-0
Problema con BitMap
« il: Marzo 22, 2025, 03:47:59 pm »
Se faccio degli errori riprendetemi pure perché sono inesperto, vorrei sottoporvi un problema, ho disegnato sul form dei cerchi con le canvas del form ma siccome non ero soddisfatto della qualità li ho disegnati pixel-pixel e poi ho applicato l'algoritmo di Bresenham per ottimizzare le transizioni affette da aliasing con buon successo, ma il problema è che il form non presenta la proprità Autoredraw e i cerchi si cancellano al resize e in altri momenti, quindi ho pensato di utilizare BitMap per renderlo stabile ma quando cerco di acccedere alla calvas di BitMap il programma si blocca e x uscire devo usare Esc. potete suggerirmi come risolvere? vorrei che il disegno dei cerchi fatto col metodo pixels fosse permanente sul form, grazie della comprensione

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1534
  • Karma: +46/-0
  • Prima ascoltare, poi decidere
Re:Problema con BitMap
« Risposta #1 il: Marzo 22, 2025, 04:39:38 pm »
Ciao, non posso aiutarti specificatamente perchè non ho Lazarus in questo momento però ti accenno due indicazioni presupponendo che tu stia lavorando in Windows.

In generale tutto cio che è un componente grafico derivato dai controlli di Windows per essere "sovrascritto" rispetto al design time deve essere continuamente "rinfrescato" ossia ridisegnato (e non sempre ciò funziona, vedi i controlli TCheckBox e simili o il TButton). Si usa l'evento OnPaint per disegnare o scrivere nel controllo qualsiasi cosa tu voglia disegnare a runtime (compreso il testo per alcune tipologie di controlli quali le griglie).

Per ovviare a ciò ci sono dei specifici componenti che possono essere usati a runtime per consentire di disegnare forme basi come cerchi rettangoli stondati o no, lo TShape è uno di questi che può essere usato sia a design time che a runtime.

Se vuoi disegnare sulla form, usa il metodo OnPaint e dentro li ci scrivi la tua routine.

Nell'esempio che ti propongo vedrai che scrivendo una sola volta appare il quadrato permanente, ma per alcuni controlli ciò và fatto in continuo quindi togliendo l"IF"

La FORM DEVE ESSERE ALMENO DI 301 x 301 PIXEL affinchè il codice sotto riportato funzioni.

Codice: [Seleziona]
var tip: integer = 0; //và dichiarata nella sezione "interface"

procedure TForm1.FormPaint(Sender: TObject);
begin
  if tip = 0 then  //con questo scrive solo una volta
    begin
      self.Canvas.Rectangle(100, 100, 300, 300);
      inc(tip);
    end;
end;

P.S.: fai attenzione al codice che inserisci nell'evento, stai occupando il thread principale e quindi "la pompa" dei messaggi di Windows. Se la tua routine impiega molto tempo l'applicazione diventerà instabile (diciamo "not responsive") fino al limite estremo del crash.
« Ultima modifica: Marzo 22, 2025, 04:43:08 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1534
  • Karma: +46/-0
  • Prima ascoltare, poi decidere
Re:Problema con BitMap
« Risposta #2 il: Marzo 22, 2025, 04:46:06 pm »
A proposito, me ne ero dimenticato, ci dovrebbe essere un componente TPaintBox che viene usato come superficie grafica proprio per questi scopi (anche ad uso diretto dell'utente).
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2977
  • Karma: +20/-4
Re:Problema con BitMap
« Risposta #3 il: Marzo 22, 2025, 04:49:28 pm »
Non so a che livello di qualità vuoi arrivare.
Vedo però che cerchi di perfezionare il risultato.

Ti vorrei segnalare questa Liberia
https://wiki.freepascal.org/BGRABitmap_tutorial

Visto che sei all' inizio vedere le varie opzioni non fa mai male 😉
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1534
  • Karma: +46/-0
  • Prima ascoltare, poi decidere
Re:Problema con BitMap
« Risposta #4 il: Marzo 22, 2025, 05:17:50 pm »
Già che ci siamo allora dai una letta anche a Skia:

https://wiki.freepascal.org/Skia

P.S.: in Delphi Skia è (dovrebbe con l'ultima release) integrata e non c'è necessità di DLL, in Lazarus se non sbaglio c'è necessità della DLL apposita a runtime. Potrei sbagliare in quanto stanno sviluppando novità su Skia praticamente ogni settimana.
« Ultima modifica: Marzo 22, 2025, 05:38:40 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

marrosso

  • Newbie
  • *
  • Post: 4
  • Karma: +0/-0
Re:Problema con BitMap
« Risposta #5 il: Marzo 23, 2025, 12:57:00 pm »
Grazie per le risposte, bgrabitmap non riconosce le TImage, probabilmente c'è qualche problema di compatibilità, mentre Skia non sono riuscito ad installarla, forse non esite per Lazarus?

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1534
  • Karma: +46/-0
  • Prima ascoltare, poi decidere
Re:Problema con BitMap
« Risposta #6 il: Marzo 23, 2025, 01:53:32 pm »
... mentre Skia non sono riuscito ad installarla, forse non esite per Lazarus?

Sei andato al link che ti ho indicato ?

Già che ci siamo allora dai una letta anche a Skia:
https://wiki.freepascal.org/Skia

Li trovi le istruzioni per installare Skia. I primi link di skia4delphi sono indicati solo per installare la dll / so (che trovi comodamente qua: https://github.com/skia4delphi/skia4delphi/tree/main/Binary/Shared )

Poi segui gli altri link per scaricare il pacchetto per Lazarus / FPC
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Mimmo

  • Jr. Member
  • **
  • Post: 89
  • Karma: +4/-0
Re:Problema con BitMap
« Risposta #7 il: Marzo 24, 2025, 08:35:52 am »
Ciao!
Io utilizzo BGRABitmap (che ti ha segnalato nomorelogic) per un po' di cose e, a parte l'iniziale difficoltà a capirne un po' la logica, non posso che parlarne bene. Se ti interessi di grafica, potrebbe essere interessante. E' tutto codice pascal per cui viene tutto compilato dentro il tuo programma. E' un'ottima soluzione ad esempio se hai bisogno di creare un programma privo delle lcl (quindi niente GUI) che deve però effettuare operazioni di grafica tipo generare immagini.
Skia non l'ho mai usato anche se ne ho letto bene perchè è potente e cross-platform, l'unica cosa però è che sul wiki dice che è compatibile con fpc 3.3.1 mentre il compilatore distribuito con l'ultima release ufficiale di Lazarus è ancora il 3.2.2. Magari funziona anche con quello però devi verificare.

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1534
  • Karma: +46/-0
  • Prima ascoltare, poi decidere
Re:Problema con BitMap
« Risposta #8 il: Marzo 24, 2025, 09:13:32 am »
....
Skia non l'ho mai usato anche se ne ho letto bene perchè è potente e cross-platform, l'unica cosa però è che sul wiki dice che è compatibile con fpc 3.3.1 mentre il compilatore distribuito con l'ultima release ufficiale di Lazarus è ancora il 3.2.2. Magari funziona anche con quello però devi verificare.
....

OOPS  :o :o :o non avevo notato quel prerequisito ..... chiedo venia.

@marrosso

Allora prosegui con le BGRABitmap.

Ciao e scusate ancora la imprecisione.

« Ultima modifica: Marzo 24, 2025, 12:04:38 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2977
  • Karma: +20/-4
Re:Problema con BitMap
« Risposta #9 il: Marzo 24, 2025, 10:07:26 am »
Grazie per le risposte, bgrabitmap non riconosce le TImage, probabilmente c'è qualche problema di compatibilità[...]

non vorrei ci fosse un malinteso:
la classe TBGRABitmap la devi usare al posto di TImage


https://wiki.freepascal.org/BGRABitmap_tutorial_2
« Ultima modifica: Marzo 24, 2025, 10:09:24 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

marrosso

  • Newbie
  • *
  • Post: 4
  • Karma: +0/-0
Re:Problema con BitMap
« Risposta #10 il: Oggi alle 03:26:11 pm »
Buon giorno, ho risolto il problema dell'autoredraw del form, facendo cosi, per prima cosa ho creato un variabile Bitmap a livello di classe del form, poi l'ho inizializzata su OnCreate del Form e quando ha finito di caricare immagini, shape e disegni fatti col metodo Pixel ho salvato l'immagine sulla Bitmap cosi:     <Form1.Bitmap.SetSize(Form1.ClientWidth, Form1.ClientHeight);
Form1.Bitmap.Canvas.CopyRect(Rect(0, 0, Form1.ClientWidth, Form1.ClientHeight),
                             Form1.Canvas,
                             Rect(0, 0, Form1.ClientWidth, Form1.ClientHeight));>
        cosi carico limmagine sulla BitMap e poi col metodo Paint la scarico sul Form cosi:
<procedure TForm1.FormPaint(Sender: TObject);
begin
  // Disegna la bitmap colorata sul form
  Form1.Canvas.Draw(0, 0, Form1.Bitmap);
end; >
con questo semplice accorgimento posso disegnare e caricare sul form qualunque cosa che rimane in memoria sullo schermo, con un unico accorgimento di non avere il form fuori dallo schermo, quindi col metodo resize lo faccio rientrare nella finestra, altrimenti la Bitmap non carica l'immagine fuori schermo:
<procedure TForm1.FormResize(Sender: TObject);
begin
  // Controllo limiti orizzontali
  if Left + Width > Screen.Width then
    Left := Screen.Width - Width - 100;
  if Left < 0 then
    Left := 0;

  // Controllo limiti verticali
  if Top + Height > Screen.Height then
    Top := Screen.Height - Height - 100;
  if Top < 0 then
    Top := 0;
end;>


           Grazie a tutti e spero che la mia idea possa servire a qualcuno.
« Ultima modifica: Oggi alle 03:34:25 pm da marrosso »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1534
  • Karma: +46/-0
  • Prima ascoltare, poi decidere
Re:Problema con BitMap
« Risposta #11 il: Oggi alle 06:42:02 pm »
C'è una soluzione molto più semplice:

a design time ci piazzi una TImage sulla Form, poi se vuoi o sempre a design time o a runtime setti la proprietà "Align" della TImage a "alClient".
Setta poi le proprietà della TImage (come "proportional", "stretch", etc ..).

Ora caricati una qualsiasi immagine nella TImage di base oppure anche a runtime, oopure crei una bitmap nella TImage direttamente a runtime.

Ora nella Canvas della TImage puoi farci quello che vuoi, disegnarci, copiarci, etc ... e vedrai che spostando la form, rimpicciolendola, posizionandola tra due schermi la tua TImage verrà sempre rinfrescata e mantenuta.

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Canvas.Brush.Color := clGreen;
  Image1.Canvas.Pen.Color := clRed;
  Image1.Canvas.Pen.Width := 5;
  Image1.Canvas.Pen.Style := psSolid;
  Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.Bitmap.Create(Image1.Width, Image1.Height);
end;
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

 

Recenti

How To

Utenti
  • Utenti in totale: 815
  • Latest: OmarB74
Stats
  • Post in totale: 19620
  • Topic in totale: 2353
  • Online Today: 193
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 169
Total: 169

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.