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:
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
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è?
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:
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. :-[
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
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
Form2.Width:= qualsiasi_valore;
si manifesta l'eccezione External.
Ok, allora il problema è che quando vai ad usate Form2, non hai ancora creato Form2.
Nel Form1, dovresti fare qualcosa del genere:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
FreeAndNil(Form2);
...
begin
Self.Width:= 1350;
Self.Height:= 700;
....
...
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:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
FreeAndNil(Form2);
Si, io ho utilizzato in questo programma:
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.
Finalmente credo di aver capito.
Perciò, alla fine ho seguito il consiglio di Stilgar:
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.