Page 1 of 2
Nuova grafica
Posted: Wed Oct 20, 2021 2:24 pm
by softdevo@tiscali.it
Io sto completamente ridisegnando la grafica delle mie applicazioni Windows Form.
In allegato un esempio.
Le finestre sono CLASS DevoWindow INHERIT Form.
Le finestre sono senza bordo e la TextBar è sostituita da una Label chiamata Caption.
Come posso scrivere questo codice senza che si generi errore?
PROPERTY Text AS STRING
GET
RETURN SELF:Caption:Text
END GET
SET
SELF:Caption:Text := VALUE
END SET
END PROPERTY
Grazie
Nuova grafica
Posted: Wed Oct 20, 2021 2:32 pm
by wriedmann
Ciao Danilo,
vuoi dire che la Label che si chiama "Caption" nella classe DevoWindow non esiste?
Saluti
Wolfgang
Nuova grafica
Posted: Wed Oct 20, 2021 2:34 pm
by wriedmann
Ciao Danilo,
questo codice da me compila:
Code: Select all
class DevoWindow inherit Form
protect Caption as Label
property Text as string
get
return self:Caption:Text
end get
set
self:Caption:Text := VALUE
end set
end property
end class
In teoria puoi accorciare e scrivere la property in una riga (secondo me anche più elegante):
Code: Select all
property Text as string get self:Caption:Text set self:Caption:Text := VALUE
Saluti
Wolfgang
Nuova grafica
Posted: Wed Oct 20, 2021 2:47 pm
by softdevo@tiscali.it
Si Wolfgang grazie, anche a me compila, ma poi, agganciato ad una qualsiasi applicazione in esecuzione da questo errore:
In questo caso la finestra WLoginEnglish eredita dalla DevoWindow.
Se tolgo la property tutto torna a funzionare.
System.NullReferenceException
Riferimento a un oggetto non impostato su un'istanza di oggetto.
Callstack :
WLoginEnglish.System.Void WLoginEnglish..ctor()() : C:XIDEProjectsDll_and_SystemFilesApplicationsSQLManagerNetPrgWLoginEx.prg : 8
static System.Void SQLManagerNet.Exe.Functions.Start(System.String[] pString)() : C:XIDEProjectsDll_and_SystemFilesApplicationsSQLManagerNetPrgMain.prg : 31
Nuova grafica
Posted: Wed Oct 20, 2021 3:01 pm
by wriedmann
Ciao Danilo,
probabilemente la tua property viene chiamata prima che il label "Caption" è stato creato.
In questo caso scriverei questo codice:
Code: Select all
property Text as string
get
if self:Caption == null
return ""
else
return self:Caption:Text
endif
end get
set
if self:Caption != null
self:Caption:Text := VALUE
endif
end set
end property
Dovrebbe esistere una possibilità ancora più corta, ma devo controllare.
Wolfgang
Nuova grafica
Posted: Wed Oct 20, 2021 3:21 pm
by softdevo@tiscali.it
NO niente anche così non cambia, sembra che richiamare una istanza della form, Self:Text appunto, essendo la finestra senza bordi crei il problema. Si dovrebbe secondo me poter scrivere un qualcosa del tipo : Override Property Text as string
Danilo
Nuova grafica
Posted: Wed Oct 20, 2021 3:27 pm
by wriedmann
Ciao Danilo,
ok, capito,
In effetti la classe System.Windows.Forms.Form ha già un property che si chiama "Text":
https://docs.microsoft.com/en-us/dotnet ... .form.text
In questo caso in effetti devi aggiungere la keyword "ovveride" davanti per dire che vuoi sovvrascrivere la property della classe parente.
Wolfgang
Nuova grafica
Posted: Thu Oct 21, 2021 6:41 am
by softdevo@tiscali.it
Ciao Wolfgang, mettendo OVERRIDE l'errore non viene generato e l'applicazione parte, ma l'assegnazione non funziona,
credo che dovrò scrivere SELF:Caption:Text := "bla bla bla" per forza.
Danilo
Nuova grafica
Posted: Thu Oct 21, 2021 7:14 am
by Chris
Hi Danilo,
What is SELF:Caption? Is it an object? Are you sure this is initialized? The error message seems to say that this is NULL.
Maybe you can produce a small sample and post it here to have a look?
.
Nuova grafica
Posted: Thu Oct 21, 2021 9:04 am
by wriedmann
Ciao Danilo,
potresti darci un piccolo esempio che dimostra il problema?
Wolfgang