Italian community of Lazarus and Free Pascal

Presentazioni => Presentazioni nuovi utenti => Topic aperto da: panfra - Aprile 09, 2021, 08:25:57 am

Titolo: errore di posizione delle dichiarazioni fra funzioni
Inserito da: panfra - Aprile 09, 2021, 08:25:57 am
Salve sono nuovo di Lazarus. Il mio problema e' uno di quelli che si dovrebbero ragionevolmente risolvere, ma io non ci sono riuscito: Mi appare..

frmprincipale.pas(87,14) Error: Forward declaration not solved "ResizeImage(TPicture;var TPicture;var LongInt;var LongInt);"

il codice è il seguente e sono sicuro di aver messo prima la funzione chiamata e dopo quella chiamante... fo' qualche errore?
.
Codice: [Seleziona]
 
private
   procedure ResizeImage(WrkPicInp:TPicture; var WrkPicOut:TPicture; var aWidth:integer; var aHeight:Integer);
   procedure ResizeAL(var percentuale: integer; var Larghezza: integer; var Altezza: integer);
   procedure SalvaImmagine(var Tipo:string);
   procedure ApriImmagine();
   procedure NuovoFile();

   public
   procedure resizefree(var Altezza:integer;var Larghezza : integer);
   

Grazie
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: xinyiman - Aprile 09, 2021, 08:37:59 am
Ciao panfra e benvenuto. Vado a memoria, quindi potrebbe non essere la soluzione, ma vale la pena di tentare.

Prova a cambiare

procedure ResizeImage(WrkPicInp:TPicture; var WrkPicOut:TPicture; var aWidth:integer; var aHeight:Integer);

con

procedure ResizeImage(WrkPicInp:TPicture; WrkPicOut:TPicture; var aWidth:integer; var aHeight:Integer);

Perchè se non ricordo male TPicture è un puntatore, quindi puoi cambiarne il contenuto senza dichiararlo come dici tu. Però ribadisco, ora non posso provare e vado a memoria.
Se non risolvesse, postaci anche la parte di codice che usi per richiamare la procedura. Così escludiamo errori li.
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: DragoRosso - Aprile 09, 2021, 10:40:08 am
Ho ricreato la funzione così come è definita, nessun tipo di errore.

Verifica che la definizione dopo la implementation sia IDENTICA alla definizione nella classe TForm1;

Saluti

Codice: [Seleziona]

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }   

 TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
     procedure ResizeImage(WrkPicInp:TPicture; var WrkPicOut:TPicture; var aWidth:integer; var aHeight:Integer);

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.ResizeImage(WrkPicInp:TPicture; var WrkPicOut:TPicture; var aWidth:integer; var aHeight:Integer);
begin
  ShowMessage(aWidth.toString);
end;

procedure TForm1.Button1Click(Sender: TObject);
var pippo1, pippo2: TPicture;
    aw1, ah1: integer;
begin
  ResizeImage(pippo1, pippo2, aw1, ah1);
end;                                   

end.

Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: panfra - Aprile 09, 2021, 11:36:20 am
Si la chiamante ( routine ) sta' dopo la chiamata (routine Resize ).
Grazie :)
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: DragoRosso - Aprile 09, 2021, 11:48:04 am
Guarda che hai definito in TForm1:

Codice: [Seleziona]
 private
     procedure ResizeImage(WrkPicInp:TPicture; var WrkPicOut:TPicture; var aWidth:integer; var aHeight:Integer);

MA NELLA  IMPLEMENTAZIONE (cioè dove scrivi il corpo della routine) VA' SCRITTO:

     procedure TForm1.ResizeImage(WrkPicInp:TPicture; var WrkPicOut:TPicture; var aWidth:integer; var aHeight:Integer);
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: panfra - Aprile 09, 2021, 07:59:14 pm
Si l'ho fatto per tutte e due le routine e quella chiamata sta' prima di quella chiamante.
E' per questo che non riesco a capire l'errore. Altri errori non me li da'.
Grazie. >:(
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: DragoRosso - Aprile 09, 2021, 08:27:26 pm
Quell'errore viene generato se la "routine", meglio chiamarla procedura o funzione, non è "pre definita".

Se ti accade ciò, è molto probabile che tu definisci la procedura come membro della classe TFormxxxxx, ma la implementi senza TFormxxx....

TFormxxxxx = Class(TForm)
private
  procedure Pippo(.....);   //DEFINIZIONE della procedura Pippo
end;

procedure Pippo (....);  <--------- IMPLEMENTAZIONE ERRATA (Pippo non appartiene alla TFormxxxxx)
begin
    //Fai qualcosa...
end;

procedure TFormxxxxx.Pippo (....);  <--------- IMPLEMENTAZIONE CORRETTA (Pippo appartiene alla TFormxxxxx)
begin
    //Fai qualcosa...
end;

Se così non risolvi postaci il codice.

Saluti
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: Stilgar - Aprile 10, 2021, 10:27:31 am
Ciao.
Prova a sfruttare meglio l'ide.

Controlla in:

Strumenti -> Opzioni
, si apre una finestra con le opzioni di Lazarus.

Opzioni IDE -> Editor -> Mappatura tasti -> Comandi dei Code Tool ->Completa Codice)

Ctrl+Shift+C è lo short cut per la generazione del codice.
Ti completa il codice. Se non parte, di solito ci sono degli errori nel codice.

Ctrl+D è lo short cut per la formattazione del codice.
Qui, in caso di errori nel codice, ti avvisa che qualche cosa non gli piace. Non molto intuitivo, ma ci sono le informazioni del Parser che ti manda a quel paese.
A volte il formattatore si in cazza anche per cose lecite e digerite dal compilatore (le "&" per forzare una parole chiave come nome variabili, ne è un esempio, le usi raramente, ma quando capite è una rottura di scatole doversi formattare il codice a manella).

Forse ti eviti delle ore di frustrazione.


Stilgar
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: panfra - Aprile 10, 2021, 02:54:48 pm
Si non avevo messo Tform1. ma ora l'errore mi da = frmprincipale.pas(112,1) Fatal: Syntax error, "BEGIN" expected but "identifier TFORM1" found.
Per quanto riguarda l'ide... mappatura tasti ecc. non l'ho trovato.
Bisogna tenere conto che uso lazarus 1.8.2 32bits su linux.
Grazie.
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: Stilgar - Aprile 10, 2021, 11:01:28 pm
A questo punto resta solo il postare l'intera unit per capire cosa ti sta dando noia.

Stilgar
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: panfra - Aprile 11, 2021, 12:46:33 pm
ecco l'intera procedura :
Codice: [Seleziona]
private

   procedure ResizeImage(WrkPicInp:TPicture; var WrkPicOut:TPicture; var aWidth:integer; var aHeight:Integer);
   procedure ResizeAL(var percentuale: integer; var Larghezza: integer; var Altezza: integer);
   procedure SalvaImmagine(var Tipo:string);
   procedure ApriImmagine();
   procedure NuovoFile();

   public
   procedure resizefree(var Altezza:integer;var Larghezza : integer);

  end;

var
  Form1: TForm1;
  ImmagineDirectory : string;
  Salvata : boolean;
  TipoDiImmagine : string;
  DimensioniRid :integer;

implementation

{$R *.lfm}

{ TForm1 }

Tform1.procedure ResizeImage(WrkPicInp:TPicture; var WrkPicOut:TPicture; aWidth, aHeight:Integer);
var Bmp:TBitmap;
    RectPart, RectDest, RectResized:TRect;
    WrkPropWidth, WrkPropHeight:Integer;
begin
  showmessage('1');
  //Calcolo i valori che serviranno per ridimensionare l'immagine in larghezza
  if (WrkPicInp.Bitmap.Width > aWidth) then begin
    //Se l'immagine deve essere rimpicciolita ...
    WrkPicOut.Bitmap.Width:=WrkPicInp.Bitmap.Width;
    WrkPropWidth:=Round(WrkPicInp.Bitmap.Width * WrkPicInp.Bitmap.Width / aWidth);
  end else begin
    //Se l'immagine deve essere ingrandita ...
    WrkPicOut.Bitmap.Width:=aWidth;
    WrkPropWidth:=Round(WrkPicInp.Bitmap.Width);
  end;

  //Calcolo i valori che serviranno per ridimensionare l'immagine in altezza
  if (WrkPicInp.Bitmap.Height > aHeight) then begin
    //Se l'immagine deve essere rimpicciolita ...
    WrkPicOut.Bitmap.Height:=WrkPicInp.Bitmap.Height;
    WrkPropHeight:=Round(WrkPicInp.Bitmap.Height * WrkPicInp.Bitmap.Height / aHeight);
  end else begin
      //Se l'immagine deve essere ingrandita ...
    WrkPicOut.Bitmap.Height:=aHeight;
    WrkPropHeight:=Round(WrkPicInp.Bitmap.Height);
  end;

  //Ora che ho tutto ciò che mi serve, posso fare il ridimensionamento vero e proprio
  Bmp:=TBitmap.Create;
  try
    Bmp.Width:=WrkPropWidth;
    Bmp.Height:=WrkPropHeight;
    RectPart:=Rect(0, 0, WrkPicInp.Bitmap.Width, WrkPicInp.Bitmap.Height);
    RectDest:=Rect(0, 0, WrkPicInp.Bitmap.Width, WrkPicInp.Bitmap.Height);
    Bmp.Canvas.CopyRect(RectPart, WrkPicInp.Bitmap.Canvas, RectDest);

    WrkPicOut.Bitmap.SetSize(WrkPicOut.Bitmap.Width, WrkPicOut.Bitmap.Height);
    RectResized:=Rect(0, 0, WrkPicOut.Bitmap.Width, WrkPicOut.Bitmap.Height);
    WrkPicOut.Bitmap.Canvas.StretchDraw(RectResized, Bmp);

    //Se l'immagine è stata rimpicciolita, la parte che eccede le dimensioni finali è tutta nera.
    //Esempio: immagine originale 200 * 200, io ho scelto di farla diventare
    //         50 * 50. A questo punto ho un'immagine di dimensione 200 * 200,
    //         con l'immagine rimpicciolita che occupa i primi 50 * 50 pixel. Il
    //         resto dell'immagine è tutto nero.
    //Faccio in modo di salvare solo la porzione di immagine che serve a me (Nell'esempio
    //qui sopra, 50 * 50)
    RectPart:=Rect(0, 0, aWidth, aHeight);
    RectDest:=RectPart;
    Bmp.Width:=aWidth;
    Bmp.Height:=aHeight;
    Bmp.Canvas.CopyRect(RectPart, WrkPicOut.Bitmap.Canvas, RectDest);
    WrkPicOut.Bitmap.SetSize(aWidth, aHeight);
    showmessage('qui');
    WrkPicOut.Bitmap.Assign(Bmp);

    //Rendo trasparente lo sfondo finale dell'immagine, che altrimenti sarebbe nero
    //WrkPicOut.Bitmap.Transparent:=True;
    //WrkPicOut.Bitmap.TransparentMode:=tmFixed;
  finally
    FreeAndNil(Bmp);
  end;
end;

 Tform1.procedure  ResizeAL(var Percentuale:integer; var Larghezza: integer; var Altezza: integer);
var
 A, L : integer;
 Imgout: Tpicture ;

begin

  showmessage('A');

  A := round((Altezza/100)*Percentuale);
  L := round((Larghezza/100)*Percentuale);

  ResizeImage(form1.Image1.picture,ImgOut, L, A);

  form1.image1.Picture.Clear ;

  if form1.Image1.picture.width < 605 then
  begin
  form1.Width:= 605 ;
  end;
  if form1.image1.picture.Height < 429 then
  begin
  form1.Height:= 429 ;
  end;

  form1.image1.picture := Imgout;

   if form1.Image1.picture.width > 605 then
  begin
  form1.Width := form1.Image1.picture.width +20 ;
  end;
  if form1.image1.picture.Height > 429 then
  begin
  form1.Height:= form1.Image1.picture.Height +20 ;
  end;

 end;     
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: DragoRosso - Aprile 11, 2021, 01:01:24 pm
@panfra

NON si SCRIVE così l'implementazione delle procedure
Codice: [Seleziona]
Tform1.procedure ResizeImage(

bensi cosi
Codice: [Seleziona]
procedure TForm1.ResizeImage(
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: nomorelogic - Aprile 11, 2021, 04:54:06 pm
giusto un consiglio....

una volta scritta la dichiarazione della procedure/function, premete: Ctrl+Shift + C

vi verrà creata l'implementazione in automatico (e pure scritta nella forma corretta :D)
inoltre, se cambiate i parametri ad una procedure/function esistente, con la stessa pressione di tasti, cambiate il tutto anche nell'implementazione
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: bonmario - Aprile 11, 2021, 05:19:20 pm
inoltre, se cambiate i parametri ad una procedure/function esistente, con la stessa pressione di tasti, cambiate il tutto anche nell'implementazione

Sapevo del Ctrl+Shift + C, ma questa non la sapevo proprio ... ottima !!!

Grazie, Mario
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: Stilgar - Aprile 11, 2021, 05:23:57 pm
Sì, l'ide prova a cambiare anche i parametri.


Ad esempio se metti un const nell'interfaccia, aggiunge il const all'implementazione.


Se cambi il nome della variabile la ribalta.


Vale anche il contrario. Se dall'implementazione cambi qualche cosa, prova a mettertela anche nell'interfaccia.


A seconda dell'ide, questi giochini sul codice sono più o meno riusciti meglio :) Fanno parte del CodeTool integrato con Lazarus.
Puoi usarlo anche per i tuoi editor customizzati dei componenti, volendo.


Stilgar
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: panfra - Aprile 11, 2021, 09:59:49 pm
Ho eseguito le correzioni che mi sono state date nell'altro post che è stato erroneamente scambiato per questo. Mi scuso in tanto per tenere i miei post qui...

ma comunque chreando la picture mi da' un nuovo errore simile al precedente..

Codice: [Seleziona]
frmprincipale.pas(111,18) Error: function header doesn't match the previous declaration "ResizeImage(TPicture;var TPicture;var LongInt;var LongInt);"
Titolo: Re:errore di posizione delle dichiarazioni fra funzioni
Inserito da: Stilgar - Aprile 11, 2021, 10:18:13 pm
Controlla
Nell'implementazione ResizeImage(TPicture;var TPicture;var LongInt;var LongInt);
[/size]Nell'interfaccia?
[/size]
[/size]Stilgar