在多个函数之间切换MATLAB

时间:2015-07-02 13:48:37

标签: matlab

所以我有一个m。包含2个函数的文件脚本 第一个(在我运行脚本时加载)和第二个。
它们中的每一个都有不同的GUI设置和文本框中的不同文本(抱歉重言式)。

我的程序是关于使用经济公式计算东西,程序的最终版本将包含大约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

2 个答案:

答案 0 :(得分:0)

我有一个技巧,虽然我自己发现它不是很好看:

假设您将所有这些功能放在文件myforms.m 中,没有任何空行。然后,在GUI的开头,打开并读取您的文件:

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

答案 1 :(得分:0)

我已将sourceeventdata直接放在函数名称后面的一组括号中,它解决了问题!我现在可以在按下按钮的同时轻松切换公式。

以下是我的函数名称之前的样子:

function SecondScript

以下是它现在的样子:

function SecondScript(source,eventdata)