listdlg obscures longer prompts
8 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Bruno
am 21 Apr. 2013
Kommentiert: Damien Watson
am 4 Jan. 2024
I'm using a listdlg to get information from users, but the prompt for my dialog is too long to fit on one line. Unfortunately the second line is obscured by the top of the list box. Is there a way to fix this other than making my dialog window unnecessarily wide?
1 Kommentar
Image Analyst
am 21 Apr. 2013
I'd send that in as a bug, or at the very least, a request for enhancement. I mean, you should be able to have more than one short line as a prompt!
Akzeptierte Antwort
Weitere Antworten (2)
Jan
am 21 Apr. 2013
Create a copy of LISTDLG in a user-defined folder and modify it accordingly: You need a modification of the 4th argument of the position in:
listsize = listsize - [0, 32];
listbox = uicontrol('style','listbox', ...
'position', [ffs+fus, ffs+uh+4*fus+(smode==2)*(fus+uh) listsize],...
A smart idea would to perform this dynamically depending on the extent of the prompt:
ext = get(prompt_text, 'Extent');
listsize = listsize - [0, ext(4) + 30];
Marcel
am 7 Nov. 2022
Bearbeitet: Marcel
am 7 Nov. 2022
Despite the issue being old and already having a answer, i wanted to post my solution as well. By using the following code, those empty {''} values are added automatically for every 32 characters in the string. I at least use this function myself so i can have an easier time calling it etc and since im working on my github repo for matlab hacks, this might be a good thing to post.
Tested in Matlab R2021a.
answer = msgList(["Live", "Statisch"], ...
"This is a lot of text it is amazing the char limit for one line seems" + ...
" to be 32 characters. its amazing to be able to work around it tho", ...
"An interesting title");
function results = msgList(list, prompt, title)
lineBreaks = [];
counter = 1;
for i = 1:strlength(prompt)
if counter == 32
lineBreaks = [{''}, lineBreaks];
counter = 1;
end
counter = counter + 1;
end
[index,tf] = listdlg('PromptString',[{prompt}, lineBreaks], 'ListString',list, "SelectionMode", "single", "Name", title);
results = list{index};
end
1 Kommentar
Damien Watson
am 4 Jan. 2024
Another optimisation could be to calculate lineBreaks using:
numLineBreaks = floor(strlength(prompt) ./ 32);
% For strings
lineBreaks = strings([numLineBreaks, 1]);
% Or for chars
lineBreaks = repmat({''}, [numLineBreaks, 1]);
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!