2016-05-17 3 views
1

J'ai écrit une fonction qui utilise l'entrée utilisateur pour rechercher une valeur de placard dans l'une des colonnes d'un tableau de cellules et renvoie ses indices. J'utilise cet index pour imprimer toutes les valeurs de colonne à cet index. Ceci est ensuite affiché à l'utilisateur une boîte de message.Ajout de données à une boîte de message dans une boucle 'for' dans MatLab

prompt2 = 'Enter the Luminance value in cd/m^2'; 
linp = inputdlg (prompt2,'Input Value',1); 
luser=str2double(linp); 

for ab=1:num_files 
    files=char(fileloc(ab)); 
    dev=dlmread(files); 
    round_tmp=abs(dev(:,4)-luser); 
    [val,ind]=min(round_tmp); 
    display(ind); 
    msgbox(sprintf(' Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A',luser,forlegend{ab},dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)),'Resulting Values'); 
end 

Maintenant, je le répète le processus dans un « pour » boucle pour plusieurs fichiers et chaque fois qu'il va sortir une nouvelle « boîte de message comme » ceci: Message boxes Quelle serait la façon d'afficher plus facile tous les des données dans une seule boîte de message? J'ai essayé de stocker dans un fichier et le ré-affichage qui mess avec les titres de la boîte de message. Je veux juste toutes les données les unes sous les autres dans une seule boîte de message. Aucune suggestion?

merci pour l'aide.

+0

Pouvez-vous relier une image à ce que la boîte de message ressemblerait si vous imprimez une chaîne qui a rempli une zone plus grande que celle de la boîte de message? Par exemple, 'msgbox (sprintf ('1 \ n2 \ n3 \ n4 \ n5 ... etc'))' – TypeKazt

Répondre

0

Si vous avez beaucoup de ligne à afficher dans la boîte de message, le msgbox n'est pas la meilleure solution car il n'a pas une barre de défilement et vous ne verrez qu'un ensemble partiel de lignes.

Dans ce cas, une solution simple pourrait être de construire votre propre boîte de message par:

  • créer un figure
  • ajouter un uicontrol editbox
  • ajouter un OK pushbutton pour fermer la figure (par ce bouton-poussoir `callback

puis dans la boucle, vous pouvez:

  • générer la chaîne à chaque itération
  • ajouter à la précédente
  • définir la chaîne à la propriété string du uicontrol editbox

Vous pouvez créer une interface graphique plus sophisticaded avec guide.

Cette solution est mise en œuvre dans le code suivant:

Création de votre boîte de message onw

% Create the figure 
f=figure('unit','normalized','name','MY-_MESSAGE-_BOX','numbertitle','off'); 
% Add an edit text box 
my_msg_box=uicontrol('parent',f,'style','edit','max',3,'unit','normalized', ... 
    'HorizontalAlignment','left','position',[.1 .1 .7 .7]) 
% Add the OK button and set its callback to close the figure 
ok_bt=uicontrol('parent',f,'style','pushbutton','unit','normalized', ... 
    'string','OK','position',[.85 .5 .1 .1],'callback','delete(f);clear f') 

Créer la chaîne et l'ajouter à la editbox

EDIT rendre plus clair le code suivant le commentaire de l'OP

Dans l'exemple suivant, lors de chaque itération, la chaîne que vous souhaitez afficher est généré (je l'ai remplacé les varaibles luser,dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6) avec des « numéros » afin de tester le code)

% Generate the string in the loop 
str=''; 
for i=1:10 
    % Replace the msgbox instruction with the code to simply print the 
    % string 
    % msgbox(sprintf(' Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A',luser,forlegend{ab},dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)),'Resulting Values'); 
    str=sprintf('%s\n Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A', ... 
     str,123,'abcdef',111,222,333,444); 
% str=sprintf('%s This is:\n the STRING #%d\n\n',str,i) 
    % Add the strong to the edit box 
    set(my_msg_box,'string',str) 
end 

Fondamentalement, vous avez pour remplacer l'instruction msgbox avec simplement l'appel sprintf.

En ce qui concerne votre mise en œuvre du sprintf appel (une partie restauration des varaibles luser,dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)), vous devez:

  • ajouter %s comme un premier descripteur de format
  • ajouter str comme paramètre d'entrée premier

cela permettra "d'ajouter" les chaînes.

Si vous avez seulement quelques ligne pour afficher

enter image description here

, vous pouvez simplement générer la chaîne à chaque itération de la boucle et de l'annexer à la précédente sans appeler la fonction msgbox.

A la fin de la boucle, vous pouvez appeler le msgbox et lui fournir la chaîne "entière".

str=''; 
% Generate the string in a loop 
for i=1:10 
    str=sprintf('%sThis is:\n the STRING #%d\n\n',str,i) 
end 
% Display the final string in the msgbox 
msgbox(str,'Resulting Values') 

enter image description here

Hope this helps.

Qapla »

+0

Merci l'homme. Oui, j'ai des données qui dépassent la taille de la boîte de message normale, donc j'ai besoin de créer une figure avec une barre de défilement. J'ai essayé votre suggestion pour créer une figure et l'utiliser avec des données. Mais ma boîte de message n'affiche que la dernière instruction sprintf. Il ne s'ajoute pas vraiment comme vous le montrez dans votre exemple. J'essaie de comprendre pourquoi. Pourriez-vous penser pourquoi cela pourrait être? –

+0

J'ai testé le code que j'ai posté et cela fonctionne. S'il vous plaît, vérifiez si vous l'avez implanté de la manière suivante: pour "appliquer" les chaînes que vous avez à ajouter dans l'appel à 'sprintf': un'% s' au début et 'str' comme le premier de l'entrée (En tout cas, j'ai mis à jour le code en insérant la chaîne entière que vous voulez afficher (une partie des valeurs des variables qui ont été remplacées par des valeurs "codées"). je sais si ça marche –

+0

J'avais en effet raté le% s, je comprends maintenant comment ça marche. –