xsharp.eu • Nuova grafica
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