Italian community of Lazarus and Free Pascal

Presentazioni => Presentazioni nuovi utenti => Topic aperto da: gaudenzi - Marzo 14, 2012, 07:58:04 pm

Titolo: Un saluto a tutti
Inserito da: gaudenzi - Marzo 14, 2012, 07:58:04 pm
Innanzitutto saluti a tutti.

Ho appena iniziato ad usare Lazarus dopo essere passato per TurboPascal (molti anni fa) e Delphi 5,6 (sempre molti anni fa ma un pò di meno). Lazarus mi permette di passare da Linux a Windows senza problemi. Mi interesso solo di programmi di approssimazione numerica per problemi di carattere matematico. Normalmente i miei programmi consistono solo di procedure e funzioni con dati finali stampati su console.
La parte grafica è quasi sempre assente anche se il poter visualizzare alcune serie di dati in un grafico mi farebbe comodo. Delphi (al contrario di TurboPascal) e così mi pare pure Lazarus ha reso però la trattazione di grafici semplici molto noiosa e così se qualcuno mi desse una mano a creare una interfaccia grafica semplice, da inserire a fianco della finestra console, e nella quale inserire grafici plottando semplicemente le coordinate x e y delle serie di dati generati dal programma gliene sarei molto grato.
Titolo: Re:Un saluto a tutti
Inserito da: xinyiman - Marzo 14, 2012, 11:24:17 pm
Ciao e benvenuto, guarda per quanto riguarda i grafici non ne ho mai fatto uno. Aspettiamo se qualcun'altro del forum ti può aiutare.

Ciao e buon lavoro con lazarus
Titolo: Re:Un saluto a tutti
Inserito da: nomorelogic - Marzo 15, 2012, 09:12:27 am
benvenuto,
di grafica non sono esperto neanche io ma se ci spieghi un po' magari iniziamo a farci un'idea e qualcosa può venir fuori.

per grafici sempilci, cosa intendi, si tratta di rappresentare funzioni tipo: y = f(x) ?
Titolo: Re:Un saluto a tutti
Inserito da: gaudenzi - Marzo 15, 2012, 09:49:37 am
Grazie per le risposte. Si tratta proprio di disegnare un grafico del tipo y=f(x) in una finestra grafica.
Titolo: Re:Un saluto a tutti
Inserito da: nomorelogic - Marzo 15, 2012, 10:37:37 am
altra domanda sui valori:
- il range di x? (es: -1 <= x <= 1)
- il range di y? (es: -1 <= y <= 1)

che OS usi, win o linux?
te lo chiedo perché con delphi so come usare i messaggi di windows per comunicare tra applicazioni, però con lazarus ancora non ho mai provato...
l'applicazione per il grafico potrebbe accettare messaggi dai tuoi programmi a linea comando tipo:
1) apri l'applicazione per la visualizzazione dei grafici
2) il tuo programma calcola in loop diversi valori y = f(x) e, per ogni coppia di valori, nel caso l'applicazione-grafico sia aperta, manda un messaggio al grafico

il disegno sarebbe in realtime durante i calcoli, mica male no?
Titolo: Re:Un saluto a tutti
Inserito da: gaudenzi - Marzo 15, 2012, 10:43:05 am
Il range varia in base al programma scritto, uso sia windows che linux. Va benissimo anche solo
per windows.

Comunque cerco di spiegarmi meglio. Ho trovato un esempio che è vicino alle mie necessità. Si lavora su console e crea una finestra grafica TBarChart dove vengono visualizzati grafici a barre. A me però non servono grafici a barre ma a dispersione del tipo (x,y), cioè devo disegnare i punti
di coordinate (x(i),y(i)) e le rette che li congiungono. Non so come modificare la finestra grafica. Ecco l'esempio

unit frmmain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, chart;

type
  vettore=array[0..100] of extended;

type
  TForm1 = class(TForm)
    BarChart1: TBarChart;
    procedure Form1Show(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Form1Show(Sender: TObject);
var
i:integer;
x,y :vettore;
begin
  BarChart1.AddBar('1999',200,clGreen);
  BarChart1.AddBar('2000',100,clred);
  BarChart1.AddBar('2001',300,clred);
  BarChart1.AddBar('2003',400,clGreen);
  for i:=0 to 10 do begin
      x:=0.1*i;
      y:=sin(x);
      writeln('x=',x:5:6,'   y=',y:5:6);
      end;
end;

initialization
  {$I frmmain.lrs}

end. 
Titolo: Re:Un saluto a tutti
Inserito da: nomorelogic - Marzo 15, 2012, 11:08:09 am
vediamo se ho capito...

apri un progetto nuovo, metti un TButton ed un TImage
metti come codice dell'OnClick del bottone:

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
const ASSEX = 200;
      ASSEY = 100;

      function ConvertX(Value: integer): integer;
      begin
          result := ASSEX + Value;
      end;

      function ConvertY(Value: integer): integer;
      begin
          result := ASSEY + Value;
      end;

begin
   Image1.Width:= 400;
   Image1.Height:= 200;
   Image1.Canvas.FillRect(0, 0, Image1.Width, Image1.Height);
   Image1.Canvas.Line(ASSEX, 0, ASSEX, Image1.Width);
   Image1.Canvas.Line(0, ASSEY, Image1.Width, ASSEY);

   Image1.Canvas.MoveTo(ConvertX(-10), ConvertY(-10));
   Image1.Canvas.LineTo(ConvertX(-30), ConvertY(40));
   Image1.Canvas.LineTo(ConvertX(90), ConvertY(40));
   Image1.Canvas.LineTo(ConvertX(130), ConvertY(-80));

end;

in ConvertX e ConvertY ci va il codice per proporzionare i risultati delle funzioni ai pixel.
ovviamente è solo uno spunto per la partenza, può andare?
Titolo: Re:Un saluto a tutti
Inserito da: gaudenzi - Marzo 15, 2012, 11:36:23 am
Grazie mille nomorelogic,
dovrebbe essere la soluzione giusta, però sono molto inesperto con l'uso delle form e quindi devo lavorarci un pò per riuscire a far partire il programma. Mi sembra comunque un ottimo punto di partenza.
Titolo: Re:Un saluto a tutti
Inserito da: nomorelogic - Marzo 15, 2012, 03:02:15 pm
di solito l'appetito vien mangiando ;)
Titolo: Re:Un saluto a tutti
Inserito da: gaudenzi - Marzo 16, 2012, 05:52:35 pm
Tutto ok con i grafici, ora la Unit funziona come volevo. La base di lavoro inviatami da nomorelogic era ottima. Ora per completare mi manca ancora un passo che per me non è immediato.
Devo creare un programma dove inserire tutte le mie procedure già scritte. I risultati del programma, che sono solo numeri, vengono stampati su video e salvati su un file di dati. Poi allego al programma la unit grafica già scritta, il programma invia alla unit una serie di dati numerici e la unit mi mostra i grafici che mi servono.

Problemi:
1) come programma scelgo Console Application? Per i miei scopi che prevedono la massima velocità di esecuzione (alcuni programmi numerici richiedono molte ore di calcolo) meglio strutture della massima semplicità;
2) come faccio ad agganciare al programma una unit? Ho provato semplicemente ad aprirla ma poi
parte la Unit e non il programma;
3) come faccio ad inviare alla unit come input alcuni dati numerici e delle array di dati generati dal programma console? Basta inserire delle memorie globali nella Console Application e poi utilizzare queste nella Unit?
Grazie ancora per l'aiuto.
Titolo: Re:Un saluto a tutti
Inserito da: nomorelogic - Marzo 16, 2012, 08:14:33 pm
Tutto ok con i grafici, ora la Unit funziona come volevo. La base di lavoro inviatami da nomorelogic era ottima. Ora per completare mi manca ancora un passo che per me non è immediato.
Devo creare un programma dove inserire tutte le mie procedure già scritte. I risultati del programma, che sono solo numeri, vengono stampati su video e salvati su un file di dati. Poi allego al programma la unit grafica già scritta, il programma invia alla unit una serie di dati numerici e la unit mi mostra i grafici che mi servono.

Problemi:
1) come programma scelgo Console Application? Per i miei scopi che prevedono la massima velocità di esecuzione (alcuni programmi numerici richiedono molte ore di calcolo) meglio strutture della massima semplicità;
2) come faccio ad agganciare al programma una unit? Ho provato semplicemente ad aprirla ma poi
parte la Unit e non il programma;
3) come faccio ad inviare alla unit come input alcuni dati numerici e delle array di dati generati dal programma console? Basta inserire delle memorie globali nella Console Application e poi utilizzare queste nella Unit?
Grazie ancora per l'aiuto.


1) Console Application:
nonostante io non abbia molta esperienza in questo campo non credo che cambi molto in termini di tempi di esecuzione: una volta nel loop di calcolo è il calcolo stesso (e come è stato implementato) che può pesare sui tempi.
Lasciare il tutto in una applicazione grafica ti semplifica la vita nel passaggio dei parametri per il disegn odei grafici. Valuta bene.
Ti consiglio di incapsulare il calcolo in una classe in modo da poterla utilizzare sia in una applicazione console che grafica. A questo punto puoi avere i tempi nelle due modalità e decidere se ne vale veramente la pena.

2) guardati la clausola "uses"

3) Se salvi il risultato su disco, l'applicazione plotter, potrebbe ricaricare il tutto da li: così puoi rifare i grafici anche di calcoli fatti in passato.
Titolo: Re:Un saluto a tutti
Inserito da: gaudenzi - Marzo 20, 2012, 10:07:08 pm
Ok. Ora ci siamo. Ho usato come consigliato una sola unit. Ho inserito oltre che vari bottoni un TpageControl con vari TabSheets. Alcuni sono usati con memo per visualizzare i risultati numerici, in altri ho inserito una TImage dove disegnare i grafici. I dati grafici sono contenuti in array globali e ora il programma si comporta come volevo. Indubbiamente la struttura era molto semplice, il problema è trovare i comandi giusti. Grazie ancora a nomorelogic per l'aiuto.