Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Febbraio 07, 2021, 04:42:47 pm

Titolo: [Risolto] Dimensioni Form alterate
Inserito da: petrusic - Febbraio 07, 2021, 04:42:47 pm
Non so spiegarmi come mai trovo le dimensioni del Form2 impostate a valori diversi da quelle segnate nelle rispettive proprietà Height e Width.
Le mie impostazioni, in fase di disegno, sono Height: 700; Width:1350.
Mi capita spesso che, dopo una modifica del programma, avviando la compilazione e l'esecuzione, si apre una form con dimensioni ridotte rispetto a quelle impostate. Verificando poi il contenuto della finestra delle proprietà, trovo i seguenti valori: Height: 518; Width:1024.

Bene, allora ho pensato di impostare le mie dimensioni ad ogni avvio del programma con:
Codice: [Seleziona]
Form2.Width:= 1350;
Form2.Height:= 700;
Il programma si avvia senza errori nella compilazione, ma al momento dell'apertura finestra della Form, compare il seguente errore
Citazione
Il progetto ContDomInDomusRatioha sollevato una
eccezione di classe 'Exterbal: SIGSEGV'
nel file 'include/control.inc' alla riga 4259

Se, invece scrivo lo stesso tipo di istruzione per un qualsiasi controllo, interno alla Form2, il programma non dà alcun tipo di errore e la Form2 si apre benissimo con l'assoluta accettazione delle modifiche eseguite attravero l'istruzione Controllo.width:= 123

Ma perchè?
Titolo: Re:Dimensioni Form alterate
Inserito da: bonmario - Febbraio 07, 2021, 07:38:44 pm
Sarebbe interessante capire su quale istruzione ti si blocca quando ti da quell'errore ... la mia sfera di cristallo non funziona così bene !!!

Scherzi a parte, mi ricordo di un vecchio bug, che memorizzava altezza e larghezza del form sbagliate, ma era di parecchi anni fa' ... che versione hai di Lazarus?

Titolo: Re:Dimensioni Form alterate
Inserito da: Stilgar - Febbraio 08, 2021, 12:25:59 pm
Ma la form è istaziata o hai forzato le dimensioni prima che venga creata?

Stilgar
Titolo: Re:Dimensioni Form alterate
Inserito da: petrusic - Febbraio 09, 2021, 10:09:51 pm
mi ricordo di un vecchio bug, che memorizzava altezza e larghezza del form sbagliate, ma era di parecchi anni fa' ... che versione hai di Lazarus?
[/quote]
Lazarus. v2.0.10
Titolo: Re:Dimensioni Form alterate
Inserito da: petrusic - Febbraio 09, 2021, 10:36:43 pm
Ma la form è istaziata o hai forzato le dimensioni prima che venga creata?
Tutte le istruzioni che agiscono sulle proprietà dei controlli contenuti nella Form, quindi anche quelle proprie della Form, sono scritte dentro la procedura "TForm2.FormCreate"
Ne riporto un piccolo estratto:
Codice: [Seleziona]
procedure TForm2.FormCreate(Sender: TObject);
var
  i, n: Integer;
  schermOrizz, schermVert: Integer;
  prima: String = '';
  sLun, striMia: String;
  Col1Stile: TTextStyle;
begin
//----------------------------------------------------------------------------------------------------------------------------
  Form2.Width:= 1350;     //  da ERRORE per eccezione di classe 'Exterbal: SIGSEGV'
  Form2.Height:= 700;     //  da ERRORE per eccezione di classe 'Exterbal: SIGSEGV'
//----------------------------------------------------------------------------------------------------------------------------
  PulsAnnulla.width:= 150;     // Questa FUNZIONA perfettamente

  PulsAggiDB.Caption:='AGGIUNGI' + chr(10) + '    AL DB';
  GRmovv.ColWidths[0]:= 25;
  n:= GRmovv.RowCount - 1;
  for i:= 1 to n do
  begin
    sLun:= IntToStr(i);
    case Length(sLun) of
      1:
        begin
          sLun:= '0' + sLun;
        end;
    end;
    GRmovv.Cells[0,i]:= sLun;  // [0, i] -> [orizzontale, verticale]
    GRmovv.Cells[1,i]:= 'Descrizione relativa alla riga' + IntToStr(i) + ', nella griglia'; 
   . . .

Purtroppo non sono in grado di capire se quando viene eseguita la prima istruzione della proc. Form.Create, la Form sia stata già istanziata. o, se, invece, venga istanziata dopo l'ultima istruzione della procedura.
Capisci perciò che non so rispondere alla tua domanda.  :-[
Titolo: Re:Dimensioni Form alterate
Inserito da: bonmario - Febbraio 10, 2021, 08:05:24 am
Se vai in Progetto ==> Opzioni progetto ==> Form Hai 2 colonne: "form creati automaticamente" e "form disponibili"

Form2 in che colonna si trova?
Titolo: Re:Dimensioni Form alterate
Inserito da: Stilgar - Febbraio 10, 2021, 12:30:28 pm
Ciao.
Prova a togliere form2 dal form create.
Stai facendo riferimento ad una variabile globale quando la variabile non è stata valorizzata. Il puntatore dovrebbe essere ancora nello stack e non assegnato alla form2 globale.
Al massimo usa self nei casi dubbi.

Prova e fammi sapere.

Stilgar
Titolo: Re:Dimensioni Form alterate
Inserito da: petrusic - Febbraio 10, 2021, 05:30:27 pm
Nei miei programmi, pochini fino ad ora, ho sempre lasciato come:
 "form creati automaticamente" , soltanto la Form1 (cioè la FormMain)
 "form disponibili", tutte le altre.
Quindi, anche nel programma corrente, la Form2, dove si presenta per il problema che ho esposto, è ben posizionata nella sezione "form disponibili".
Stai facendo riferimento ad una variabile globale quando la variabile non è stata valorizzata. Il puntatore dovrebbe essere ancora nello stack e non assegnato alla form2 globale.
Al massimo usa self nei casi dubbi.
Mi dispiace, ma sono ancora un principiante:
Non capisco come dovrei usare self

Ho però provato  a spostare le istruzioni
Codice: [Seleziona]
Form2.Width:= 1350;
Form2.Height:= 700;
dalla procedura TForm2.FormCreate alla TForm2.FormActivate, in modo da trovare la form già istanziata, ma già all'esecuzione della
Codice: [Seleziona]
  Form2.Width:= qualsiasi_valore;
 
si manifesta l'eccezione External.
Titolo: Re:Dimensioni Form alterate
Inserito da: bonmario - Febbraio 10, 2021, 06:11:29 pm
Ok, allora il problema è che quando vai ad usate Form2, non hai ancora creato Form2.

Nel Form1, dovresti fare qualcosa del genere:
Codice: [Seleziona]
            Application.CreateForm(TForm2, Form2);
              Form2.ShowModal;
            FreeAndNil(Form2);
Titolo: Re:Dimensioni Form alterate
Inserito da: Stilgar - Febbraio 10, 2021, 06:37:13 pm
Codice: [Seleziona]
...
begin
Self.Width:= 1350;
Self.Height:= 700;
....
Titolo: Re:Dimensioni Form alterate
Inserito da: petrusic - Febbraio 10, 2021, 11:16:14 pm
Codice: [Seleziona]
...
begin
Self.Width:= 1350;
Self.Height:= 700;
....
Scusa, ma non avevo capito.
Modificando il codice come mi hai indicato tu, l'ERRORE non si manifesta più, anche eseguendolo nella procedura " TForm2.FormCreate".
Ok, allora il problema è che quando vai ad usate Form2, non hai ancora creato Form2.

Nel Form1, dovresti fare qualcosa del genere:
Codice: [Seleziona]
            Application.CreateForm(TForm2, Form2);
              Form2.ShowModal;
            FreeAndNil(Form2);
Si, io ho utilizzato in questo programma:
Codice: [Seleziona]
 frm2:= TForm2.Create(Application);
   frm2.Showmodal;
   frm2.Close;           

di cui la prima è la stessa che mi suggerisci tu, anche se scritta in altro modo, mentre l'ultima dovrebbe agire come distruttore della Form2. Comunque ci lavorerò, per capire bene.
Titolo: Re:Dimensioni Form alterate
Inserito da: bonmario - Febbraio 11, 2021, 07:59:38 am
O segui la strada che ti ha indicato Stilgar, che secondo me è la più corretta, oppure potrai notare che la variabile con cui crei il form l'hai chiamata "frm2", quella con cui ne cambi le dimensioni, l'hai chiamata invece "Form2". Questo non va bene: i 2 nomi devono essere uguali.

Ciao, Mario
Titolo: Re:Dimensioni Form alterate
Inserito da: Stilgar - Febbraio 11, 2021, 08:40:42 am
L'errore nella FormCreate è un errore dovuto al fatto che il puntatore Form2 non è ancora stato valorizzato con l'indirizzo in memoria della form che stai creando.
Self, è un "riferimento" che dice di lavorare con il puntatore dell'istanza attuale (quindi la form che stai instanziando).
La OnCreate è una callback che viene invocata durante la creazione, quindi non sei ancora uscito dal processo di creazione. Di conseguenza l'uso di Form2 non è corretto in quel punto.

Il fatto di usare direttamente la TForm2.Create, potrebbe portati ad incontrare altri problemi nel tempo.
TApplication.CreateForm non esegue solo la creazione delle TForm/TDataModule, fa altre operazioni nel mezzo. (Se la cosa ti incuriosisce basta un ctrl+click sul metodo e i sorgenti sono disponibili)


Stilgar
Titolo: Re:Dimensioni Form alterate
Inserito da: Stilgar - Febbraio 11, 2021, 08:42:29 am
Per la distruzione automatica, prova a controllare OnClose.
Dovrebbe permetterti di indicare la distruzione della memoria dopo la chiusura.




Stilgar
Titolo: Re:Dimensioni Form alterate
Inserito da: petrusic - Febbraio 11, 2021, 11:56:13 am
Finalmente credo di aver capito.
Perciò, alla fine ho seguito il consiglio di  Stilgar:
Codice: [Seleziona]
procedure TForm2.FormCreate(Sender: TObject);
var
  begin
     Self.Width:= 1350;
     Self.Height:= 700;
... bla ... bla ...
e possiamo così concludere.

Per il problema del distruttore della Form modale, credo sia corretto aprire un'altra discussione, dove riporto i post da cui è cominciata, non volendolo, la questione.