L'argomento che andiamo a trattare è il caricamento e la visualizzazione di un immagine.
Un caso frequente di utilizzo sono, ad esempio, dei listini articoli con l'immagine dell'articolo dentro AX.
Per prima cosa dovremo creare sulla nostra tabella un nuovo campo di tipo Container,
e impostare le proprietà del campo come segue:
le modifiche a livello di tabella finisco qui, vediamo ora come fare per visualizzare e modificare l'immagine da un form.
Sul form avremo bisogno di due controlli, un campo di tipo Windows e Button.
impostiamo le proprietà dei controlli come segue:
Adesso ci mancano solo i metodi per gestire il tutto.
Iniziamo con l'override del metodo clicked del bottone appena creato.
void clicked()
{
FilenameFilter filter = ['Image Files','*.bmp;*.jpg;*.gif;*.jpeg'];
BinData binData = new BinData();
str extention, path, nameOfFile;
super();
imageFilePathName = WinAPI::getOpenFileName(element.hWnd(),filter,'', "@SYS53008", '','');
if (imageFilePathname && WinAPI::fileExists(imageFilePathName))
{
[path, nameOfFile, extention] = fileNameSplit(imageFilePathName);
if (extention == '.bmp' ||
extention == '.jpg' ||
extention == '.gif' ||
extention == '.jpeg')
{
binData.loadFile(imageFilePathName);
imageContainer = binData.getData();
element.showImage();
element.insert();
}
else
{
throw error("@SYS89176");
}
}
}
In seguito dobbimo realizzare i due metodi 'showImage' e 'insert' che abbiamo appena utilizzato. Questi andranno creati a livello dei metodi globali del form. Il metodo 'showImage' serve a visualizzare l'immagine appena caricata mentre il metodo 'insert' ad inserirla e salvarla sul database.
void showImage()
{
Image logoImage;
;
try
{
element.lock();
if (imageContainer)
{
logoImage = new Image();
logoImage.setData(imageContainer);
Image.image(logoImage);
}
else
{
Image.imageResource(0);
Image.widthValue(32);
Image.heightValue(32);
}
element.resetSize();
element.unLock();
}
catch (Exception::Warning)
{
throw error(strfmt("@SYS19312", imageFilePathName));
}
}
void insert() { ; ttsbegin; line = MyTable::find(MyTable_
ds.
KeyField, true); if(line) { line.Image = imageContainer; line.update(); } ttscommit; }
E' buona norma non mettere l'immagine nella griglia della panoramica principale ma inserirla in uno degli altri tab del nostro form in modo da non appesantire lo scorrimento del dataSource, dovremo allora aver cura anche di effettuare l'override del metodo 'pageActivated', del tab dove inseriremo l'immagine, come segue:
public void pageActivated()
{
;
super();
element.loadImage();
}
void loadImage() { Image img; MyTable table; ;
table
= MyTable::find(MyTable_ds.K
eyField)
; if (table.Image) { img = new Image(); img.setData(table.Image); Image.image(img); } else { Image.image(null); } }
Il risultato che otterremo sarà qualcosa di simile al seguente... :)
Nessun commento:
Posta un commento