adobe air with flex,file new,open和save for Desktop软件程序

时间:2012-09-01 11:48:59

标签: flex air adobe desktop-application

我从所有的搜索中都已经头疼了。我无法相信这是一个令人困惑的话题,因为我们创建的每个软件程序都必须能够保存用户输入。

问题在于: 新颖的编写软件程序主窗口有tabnavigator,有四个navigatorcontent页面1.字符,2。worlds,3。对象,4。编辑器

每个navigatorcontent页面都有textinput组件,textarea组件,richtexteditor组件等形式的用户输入字段。

问题1: 用户需要能够打开一个新项目并为其命名并说明必须保存的位置。小说编写软件程序中的所有用户输入必须附加到用户指定的文件名 - 不能提供示例代码,因为我甚至不知道从哪里开始查找。

问题2: 如果用户现在已经定义了新的项目名称,则必须将来自不同输入组件的所有输入编译为可以保存的单个文件。 (Dan Pichelman在使用file.borwseforsave函数时给了我一个满意的答案。)这是有道理的,但我首先需要将所有用户输入都放到该单个文件中。我确信它必须是一个xml文件,并且会有关于如何执行此操作的指南但是......

问题3: 这让我想到了另一个问题。到目前为止,我研究过的所有页面都告诉我如何将数据从xml文件加载到组件中,而不是如何将组件中的文本写入xml文件。并且这个xml文件不能是存储目录中的prefs文件,它必须由用户命名,然后在软件的不同选项卡中填写所有文本后,必须保存在此xml文件中并保存到用户所在的位置选择。

问题4: 既然用户输入了他的文本并将其写入了他已命名并设置路径的xml文件,他就去度假,并在两周内打开他保存的文件再次处理他的项目。现在必须将存储在xml中的所有数据写回到不同的用户输入组件中,以便他可以继续处理他的项目,事实上,有关于此主题的一些samles和教程,但同样来自一个页面透视图不是多标签透视图。

问题5: 现在,用户已经删除和/或更改了他在开始时输入的文本,他在textareas和texteditor中写了更多文本,然后单击文件 - 保存按钮。必须更新xml文件或需要使用的任何文件,并保存所有更改以覆盖旧文件。

问题6: 用户输入的数据最终将成为400页的书。这些数据显然主要位于richtexteditor组件中,因此无论使用哪种保存方法,数据库或xml等都需要能够包含所有这些数据。

想想,如果你正在使用微软powerpoint,它有多个页面都包含不同的用户输入,当你点击文件 - 保存时,它会将所有输入保存到一个文件中。当我作为用户打开保存的文件时,它将所有内容加载回其位置,我可以更改和操作输入并再次保存。我认为这将是adobe或任何其他软件将要教授的第一件事,因为这是软件程序的全部内容。但是,有关adobe air for Desktop应用程序的这个主题的教程是非常罕见的。

我的承诺是,如果有人可以帮我解决这个问题,或者有一个适当的教程,我将为其他新手写一篇关于这个的教程,一步一步地进行。

1 个答案:

答案 0 :(得分:1)

我认为您面临的主要问题是从UI输入到XML数据(以及后面)的转换。这更像是一个架构问题,而不是纯粹的技术问题,这可以解释为什么你很难找到信息。

演示模型

有很多方法可以解决您的用例,但最重要的是您需要一个Presentation Model。这是一个与特定视图同时使用的模型类。您可以在各种演示模型和真实数据模型之间来回转换(在此特定情况下表示为XML数据结构)。这有点抽象,但我会粗略地试着通过它来引导你。要意识到我要向你展示的只是众多可能的方法之一。我相信这是传达这个想法最简单的方法。

PM课程

首先,我们需要为每个视图创建一个表示模型,即1. characters,2。worlds,3。objects,4。editor。我们将它们命名为我们知道这些是模型并将它们放在自己的包装中; e.g。

  • my.app.pm.CharactersModel
  • my.app.pm.WorldsModel
  • my.app.pm.ObjectsModel
  • my.app.pm.EditorModel

('pm'表示此处的演示模型)
然后,这些类中的每一个都接收与视图中的输入和/或显示匹配的属性。这些可以是简单的或复杂的。例如,假设'characters'视图有'title'文本输入和可选字符列表,你会得到这样的类:

public class CharactersModel {
    [Bindable] public var title:String;
    [Bindable] public var characters:IList; //list of Character model instances
    [Bindable] public var selectedCharacter:Character;
}

并且该IList中的每个字符都是:

的实例
public class Character {
    [Bindable] public var firstname:String;
    [Bindable] public var lastname:String;
}

注意属性如何标记为Bindable:我们将在下一段中看到原因。

查看班级

您现在可以创建一个看起来像这样的视图类:

<fx:declarations>
    <pm:CharactersModel id="pm" />
</fx:declarations>

<s:FormItem label="Title">
    <s:TextInput text="@{pm.title}" />
</s:FormItem>

<s:FormItem label="Edit character">
    <s:DropdownList dataProvider="{pm.characters}" 
                    selectedItem="@{pm.selectedCharacter}" />
</s:FormItem>

<s:FormItem label="First name">
    <s:TextInput text="@{pm.selectedCharacter.firstName}" />
</s:FormItem>

<s:FormItem label="Last name">
    <s:TextInput text="@{pm.selectedCharacter.lastName}" />
</s:FormItem>

(警告:这是伪代码;我写了我头脑中的那个) 看看我们如何使用双向绑定来读取和写入UI的值到Presentation Model?

转换

现在剩下要做的就是编写一个将PM转换为XML数据结构的类,反之亦然。这是一个技术问题,所以我相信你可以找到相关的信息,但基本上是

当用户点击“保存”按钮时,您应该可以调用类似

的内容
var xmlToSave:XML = Convertor.pmToXml(
    charactersView.pm, worldsView.pm, objectsView.pm, editorsView.pm
);

当用户点击“加载”按钮时:

charactersView.pm = Convertor.xmlToCharactersPm(loadedXML);
worldsView.pm     = Convertor.xmlToWorldsPm(loadedXML);
objectsView.pm    = Convertor.xmlToObjectsPm(loadedXML);
editorView.pm     = Convertor.xmlToEditorPm(loadedXML);

写入磁盘

阅读我之前写的这个答案:
Storing/Saving XML in local asset folder in AIR