2015-07-02 3 views
0

Итак, у меня есть m. который содержит 2 функции.
Первый (который загружается при запуске скрипта) и второй.
Каждый из них имеет различные настройки графического интерфейса и другой текст в текстовых полях (извините за тавтологию).Переключение между несколькими функциями MATLAB

Моя программа посвящена вычислению материалов с использованием экономических формул, и окончательная версия программы будет содержать около 50 формул. И я не хочу составлять 50 отдельных скриптов для каждой формулы. Я хочу, чтобы иметь возможность переключаться между формулами внутри одного скрипта.
Таким образом, я сделал конкретную кнопку для этой цели (код ниже), но когда я нажимаю ее, ничего не происходит.

Может ли кто-то, кто достаточно опытен, сказать мне, что я сделал не так? (Я новичок в MATLAB).
Дайте мне знать, если вам нужна дополнительная информация, или вопрос недостаточно ясен. Заранее спасибо!

uicontrol('Style','pushbutton','Position',[136,88,194,27],'String','Next formula','FontSize',10,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685],'CallBack',@SecondScript); 

Вот весь сценарий:

function FirstScript 

clc 
clear 
close all 

global ZatratyNaSozdanieProgProdukta hEditZzpspp hEditZmvspp hEditZobsh 

ScreenSize = get(0,'ScreenSize'); 
set (0, 'DefaultFigureColor', [0.23137255012989 0.443137258291245 0.337254911661148]) 

hFig = figure('Visible','off','Position',[ScreenSize(3)/2,ScreenSize(4)/2,550,450]); 

uicontrol('Style','Pushbutton','Position',[371,136,98,27],'String','Рассчитать','FontSize',10,'FontName','MS Reference Sans Serif','Callback',@CalculateCallback,'BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 

uicontrol('Style','pushbutton','Position',[136,88,194,27],'String','Next formula','FontSize',10,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685],'CallBack',@SecondScript); 

axes('units','pixels','position',[20 100 200 24],'visible','off'); 
message = sprintf('Формула определения затрат на\nсоздание программного продукта:\n \nЗ^З^П_С_П_П+З^М^В_С_П_П+З_О_Б_Щ'); 
text(0,4.6,message,'interpreter','tex','Position',[1.18 8.64166666666667 0],'HorizontalAlignment','center','FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 

axes('units','pixels','position',[20 100 200 24],'visible','off'); 
hTextZzpspp = text(0,4.6,'З^З^П_С_П_П','interpreter','tex','Position',[0.55 4.14166666666666 0],'FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 
hEditZzpspp = uicontrol('Style','Edit','Position',[117,150,72,25],'String','','FontSize',10,'FontName','MS Reference Sans Serif'); 

axes('units','pixels','position',[20 100 200 24],'visible','off'); 
hTextZmvspp = text(0,4.6,'З^М^В_С_П_П','interpreter','tex','Position',[0.935 4.14166666666666 0],'FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 
hEditZmvspp = uicontrol('Style','Edit','Position',[195,150,72,25],'String','','FontSize',10,'FontName','MS Reference Sans Serif'); 

axes('units','pixels','position',[20 100 200 24],'visible','off'); 
hTextZobsh = text(0,4.6,'З_О_Б_Щ','interpreter','tex','Position',[1.32 4.05833333333332 0],'FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 
hEditZobsh = uicontrol('Style','Edit','Position',[274,150,72,25],'String','','FontSize',10,'FontName','MS Reference Sans Serif'); 

uicontrol('Style','Text','Position',[370,191,100,29],'String','Результат:','FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 
ZatratyNaSozdanieProgProdukta = uicontrol('Style','Text','Position',[370,168,100,23],'String','','FontSize',10,'FontName','MS Reference Sans Serif'); 


set(hFig,'Visible','on') 
    function CalculateCallback(~,~) 
     Zzpspp = str2double(get(hEditZzpspp,'String')); 
     Zmvspp = str2double(get(hEditZmvspp,'String')); 
     Zobsh = str2double(get(hEditZobsh,'String')); 

     Calculation = Zzpspp+Zmvspp+Zobsh; 

     set(ZatratyNaSozdanieProgProdukta,'String',sprintf('%0.2f',Calculation));  


    end 


end 
function SecondScript 

clc 
clear 
close all 

global RashodyNaOplatuTrudaRazrabotchikaProgrammy hEditZosnzp hEditZdopzp hEditZotchzp 

ScreenSize = get(0,'ScreenSize'); 
set (0, 'DefaultFigureColor', [0.23137255012989 0.443137258291245 0.337254911661148]) 

hFig = figure('Visible','off','Position',[ScreenSize(3)/2,ScreenSize(4)/2,550,450]); 

uicontrol('Style','Pushbutton','Position',[371,136,98,27],'String','Рассчитать','FontSize',10,'FontName','MS Reference Sans Serif','Callback',@CalculateCallback,'BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 

axes('units','pixels','position',[20 100 200 24],'visible','off'); 
message = sprintf('Формула определения расходов на\nоплату труда разработчика программы:\n \nЗ^З^П_С_П_П+З^М^В_С_П_П+З_О_Б_Щ'); 
text(0,4.6,message,'interpreter','tex','Position',[1.18 8.64166666666667 0],'HorizontalAlignment','center','FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 

axes('units','pixels','position',[20 100 200 24],'visible','off'); 
hTextZosnzp = text(0,4.6,'З^З^П_С_П_П','interpreter','tex','Position',[0.55 4.14166666666666 0],'FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 
hEditZosnzp = uicontrol('Style','Edit','Position',[117,150,72,25],'String','','FontSize',10,'FontName','MS Reference Sans Serif'); 

axes('units','pixels','position',[20 100 200 24],'visible','off'); 
hTextZdopzp = text(0,4.6,'З^М^В_С_П_П','interpreter','tex','Position',[0.935 4.14166666666666 0],'FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 
hEditZdopzp = uicontrol('Style','Edit','Position',[195,150,72,25],'String','','FontSize',10,'FontName','MS Reference Sans Serif'); 

axes('units','pixels','position',[20 100 200 24],'visible','off'); 
hTextZotchzp = text(0,4.6,'З_О_Б_Щ','interpreter','tex','Position',[1.32 4.05833333333332 0],'FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 
hEditZotchzp = uicontrol('Style','Edit','Position',[274,150,72,25],'String','','FontSize',10,'FontName','MS Reference Sans Serif'); 

uicontrol('Style','Text','Position',[370,191,100,29],'String','Результат:','FontSize',12,'FontName','MS Reference Sans Serif','BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); 
RashodyNaOplatuTrudaRazrabotchikaProgrammy = uicontrol('Style','Text','Position',[370,168,100,23],'String','','FontSize',10,'FontName','MS Reference Sans Serif'); 


set(hFig,'Visible','on') 
    function CalculateCallback(~,~) 
     Zosnzp = str2double(get(hEditZosnzp,'String')); 
     Zdopzp = str2double(get(hEditZdopzp,'String')); 
     Zotchzp = str2double(get(hEditZotchzp,'String')); 

     Calculation = Zosnzp+Zdopzp+Zotchzp; 

     set(RashodyNaOplatuTrudaRazrabotchikaProgrammy,'String',sprintf('%0.2f',Calculation));  


    end 


end 
+1

Одна линия, которую Вы предоставили нам выглядит прекрасно! Но что делает функция обратного вызова ('' SecondScript')? –

+0

Он загружает совершенно другую программу (калькулятор) с ее уникальным интерфейсом и десятком параметров для расчета. Но это не сработает! И что меня больше всего удивляет, MATLAB не отображает никаких сообщений об ошибках. – Johnnik

+0

Пробовал ли вы установить точку останова в код «SecondScript» и войти? Поскольку проблема возникает в этой функции, возможно, вы можете опубликовать ее. –

ответ

0

Я положил source и eventdata в набор круглых скобок непосредственно после имени функции и решил проблему! Теперь я могу легко переключаться между формулами так же быстро, как я могу нажать кнопку.

Вот как имя моей функции выглядело как раньше:

function SecondScript 

Вот как это выглядит сейчас:

function SecondScript(source,eventdata) 
0

У меня есть трюк, хотя я сам нахожу это не очень хорошо выглядящие:

Предполагая, что вы положили все эти функции в файле myforms.mбез пустой строки. Затем, в начале графического интерфейса пользователя, открыть и прочитать файл:

f1 = fopen('myforms.m'); 
alllines = textscan(f1, '%s', 'Delimiter', ''); 
fclose(f1); 

alllines{1} теперь массив ячеек, причем каждый элемент является одной линии от myforms.m.

Теперь, когда вы хотите переключиться на формулу, вы должны знать номер строки его раздела в myforms.m, например, начиная с линии 10, заканчивающийся на линии 15.

Создать новый файл, т.е. callme.m, которые должны быть вызваны вашей кнопки, и пишу эти строки в файл:

f2 = fopen('callme.m', 'w'); 
for i = 10:15 
    fprintf(f2, '%s\n', alllines{1}{i}); 
end 
fclose(f2); 

Ваша функция обратного вызова может затем быть @callme.

+0

Спасибо за ответ! Но я не понимаю, что вы подразумеваете под «... в начале вашего графического интерфейса ...» У меня всего 2 м. файлы (myforms.m и callme.m). Вы говорите о файле .fig или другом расширении MATLAB-файла, о котором я еще не знаю? Это может показаться глупым, но где именно я должен поставить этот код, который вы мне дали? – Johnnik

Смежные вопросы