Newsgroup: it.comp.lang.delphi
Titolo: TShapeType

Ciao a tutti.
Qualcuno mi sa spiegare come posso fare il casting a runtime di un
TShapeType su Delphi .NET?
Mi spiego meglio:
Faccio il parsing da un fil xml sul quale leggo prima una stringa che mi
indica il "tipo", come "TShapeType". 
Successivamente leggo un "valore", del tipo "stRectangle". 
Come faccio a dichiarare a Runtime una variabile che sia di tipo
TShapeType e alla quale venga assegnata la costante stRectangle.
GNUbie.
--- posted by geoForum on 
http://www.delphiedintorni.it

 TShapeType e alla quale venga assegnata la costante stRectangle.
IMHO, la via piu' semplice e' usare un 'case':
(pseudocodice)
crei dinamicamente la figura
case <tipo di figura> of
 0: imposti il tipo stRectangle
 1: imposti il tipo stSquare
 2: ecc...
end;
 disegni la figura 
 la distruggi 
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 TShapeType e alla quale venga assegnata la costante stRectangle.
L'unico modo che hai di caricare valori "tipizzati" partendo dal file 
XML, secondo me, è usare le funzioni della RTTI (unit "TypInfo.pas") o 
la Reflection, visto che si parla di Delphi.NET.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

Ringrazio sentitamente entrambi.
Ad ACSH: non posso limitarmi ad utilizzare un case, perchè sto generando
degli oggetti grafici a runtime, quindi nessuno può assicurarmi in
partenza che l'oggetto in questione abbia una proprietà Shape di tipo
TShapeType.
A Marco Breveglieri: Naturalmente sto già utilizzando la reflection in
lungo e in largo... non riesco però a gestire questo caso particolare in
modo agevole e performante. Se ti viene qualche idea un filino più
"specifica" fammi sapere
Grazie ad entrambi
GNUbie


 "specifica" fammi sapere
Diciamo che utilizzando RTTI/Reflection, in genere ci si accontenta 
delle performance dato che agire sui dati attraverso queste funzioni 
"indirette" è senz'altro più lento.
Per quanto riguarda il "non riesco a gestire", se hai del codice 
postalo, in modo che io non debba scrivere un esempio completo (non per 
cattiveria, ma proprio per mancanza di tempo). :-)
In particolare, fai riferimento alle funzioni GetEnum* della unit "TypInfo".


cattiveria, ma proprio per mancanza di tempo). :-)
Naturalmente si, Marco.
Per il momento mi basterebbe soltanto che tu mi aiutassi a far funzionare
un brevissimo frammento di codice che mi sta dando una marea di grattacapi.
var
   tipo_forma: TShapeType; //Borland.Vcl.ExtCtrls.TshapeType
                           //enumeration contenente un insieme 
                           //di costanti che definiscono il tipo della
forma                             
                           //geometrica.
begin
...


cattiveria, ma proprio per mancanza di tempo). :-)
Naturalmente si, Marco.
Per il momento mi basterebbe soltanto che tu mi aiutassi a far funzionare
un brevissimo frammento di codice che mi sta dando una marea di grattacapi.
var
   tipo_forma: TShapeType; //Borland.Vcl.ExtCtrls.TshapeType
                           //enumeration contenente un insieme 
                           //di costanti che definiscono il tipo della   
 
                           //forma geometrica.
   typ: System.Type;
begin
...
...
...
   typ := System.&Type.GetType('Borland.Vcl.ExtCtrls.TShapeType');
   Edit1.Text := typ.toString; //SI PIANTA QUI, ToString è sempre
                               //chiamata su un valore nullo...
Naturalmente ho provato anche con le stringhe 'TShapeType',
'Borland.Vcl.TShapeType' etc. etc... nulla da fare. Esistono altri modi
per ottenere la stringa che referenzia correttamente il tipo in questione?
Grazie mille.
GNUbie


 GNUbie
Unit TypInfo : GetEnumName dovrebbe funzionare anche con .NET.
Non e' documentata: googla un poco per trovare altre informazioni.
(però rimango convinto che per quello che vuoi ottenere questo non e' il
modo migliore di farlo).


 per ottenere la stringa che referenzia correttamente il tipo in questione?
Ma non stavi cercando di impostare il valore della variabile?
A che ti serve adesso il nome del tipo?


A che ti serve adesso il nome del tipo?
Al momento sto cercando semplicemente di crearmi a runtime un riferimento
al tipo TShapeType(partendo da una stringa)che, come ci ricorda ACSH, è
per l'appunto un'Enumeration.
Tutto è effettivamente finalizzato poi ad impostare a runtime la proprietà
di un oggetto grafico. In partenza, coe vi dicevo, carico i dati partendo
dal parsing di un documento XML, il che comporta il fatto che non conosco
a priori la classe del mio oggetto, che può essere un TButton, come un
Tedit o  un TShape, soprattutto un TShape!!! ;-).
Il riferimento al tipo mi occorre perchè in tal modo posso invocare i
metodi sotto elencati. Voglio solo capire, giunti a questo punto, se
utilizzando la Reflection(vedi sotto) posso settare questi valori a runtime
typ := System.&Type.GetType('TShapeType');
...
lettura := //leggi dalla collection ricavata dopo il parsing del documento
//inserimento di un valore nell'array dei parametri da passare al metodo
//Invoke 
parShape[0] := Convert.ChangeType(lettura, typ);
...
...
obj.classinfo.getProperty(...).GetSetMethod.Invoke(obj,parShape);
Grazie a tutti.
GNUbie.
