* * * *

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.
Aprile 27, 2024, 10:17:46 am

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

329 Visitatori, 0 Utenti

Autore Topic: errore di posizione delle dichiarazioni fra funzioni  (Letto 2236 volte)

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
errore di posizione delle dichiarazioni fra funzioni
« il: 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

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #1 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #2 il: 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.

« Ultima modifica: Aprile 09, 2021, 10:46:36 am da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #3 il: Aprile 09, 2021, 11:36:20 am »
Si la chiamante ( routine ) sta' dopo la chiamata (routine Resize ).
Grazie :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #4 il: 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);
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #5 il: 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. >:(

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #6 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #7 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #8 il: 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.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #9 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #10 il: 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;     

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #11 il: 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(
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #12 il: 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
Imagination is more important than knowledge (A.Einstein)

bonmario

  • Hero Member
  • *****
  • Post: 1302
  • Karma: +10/-1
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #13 il: 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

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:errore di posizione delle dichiarazioni fra funzioni
« Risposta #14 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18776
  • Topic in totale: 2234
  • Online Today: 327
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 329
Total: 329

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.