Einzelnen Beitrag anzeigen

I.A

Registriert seit: 14. Jan 2007
83 Beiträge
 
#1

Softwaredesign - Modularisierung

  Alt 8. Mai 2009, 11:30
Hallo,

ich habe folgenden Entwurf für einen Quelltexteditor:

Delphi-Quellcode:
  TEditorPage = class(TTabSheet)
  private
    FEditor: TSynEdit;
    FExtension: ShortString;
    FFilename: ShortString; //Name der Editordatei
    FHighlighter: TSynCustomHighlighter;
    FHighlighters: THighlighters;
    FEmptyFileNames: TStringList;
    FHighlighterIX: Integer;
    {$ifdef fpc}
    FProcess: TProcess; //nur FPC Version
    {$endif}
    function HighlighterEquivalentToFileExt(AFileExt: ShortString): Integer;
    function GetHighlighter: Integer;
    procedure SetFilename(AFilename: ShortString);
    procedure SetHighlighter(AHighlighter: Integer);
  public
    //Compiler ist individuell für die Editordatei
    procedure Compile;
    procedure CompileSource(AFilename: ShortString);
    constructor Create(AOwner: TComponent);
    destructor Destroy; override;
    procedure LoadFromFile(AFilename: ShortString);
    procedure Save;
    procedure SaveAs(AFilename: ShortString);

    property Editor: TSynEdit read FEditor;
    property FileExt: ShortString read FExtension write FExtension;
    property Filename: ShortString read FFilename write SetFilename;
    property Highlighter: Integer read GetHighlighter write SetHighlighter;
  end;

  TEditorsList = class(TObjectList)
  private
    function GetEditors(Index: Integer): TEditorPage;
  public
    function AddEditor(AEditor: TEditorPage): Integer;
    property Editors[Index: Integer]: TEditorPage read GetEditors; default;
  end;

(*
  Here the Editor-PageControl follows
*)


  { TEditorPages }

  TEditorPages = class(TPageControl)
  private
    FFilename: ShortString; //Name des Projektes
    {$ifdef fpc}
    FProcess: TProcess; //nur FPC Version
    {$endif}
  public
    //Compiler ist derjenige der das Projekt überstzt
    //Compiler des einzelnen Editors kann dagegen eine andere Programmiersprache
    //übersetzen und den Bin-code in den Code des Projektes linken
    procedure Compile;
    procedure CompileProject(AProject: ShortString);
    procedure Debug;
    procedure DebugProject(AProjectName: ShortString);
  end;

  { TEditorPagesContainer }

  TEditorPagesContainer = class(TPanel)
  private
    FEditorPage: TEditorsList;
    FEditorPages: TEditorPages;
    function GetPageCount: Integer;
  public
    procedure OpenEditor(AFilename: ShortString);
    procedure CloseCurrentEditor;
    constructor Create(AOwner: TComponent);
    destructor Destroy; override;
    procedure Save;
    procedure SaveAs(AFilename: ShortString);
    procedure SaveAll;
    property Editors: TEditorPages read FEditorPages;
    property PageCount: Integer read GetPageCount;
  end;

  { TEditorWindow }

  TEditorWindow = class(TForm)
  private
    FEditor: TSynEdit;
    FExtension: ShortString;
    FFilename: ShortString;
    FHighlighter: TSynCustomHighlighter;
    FHighlighters: THighlighters;
    FEmptyFileNames: TStringList;
    FHighlighterIX: Integer;
    {$ifdef fpc}
    FProcess: TProcess; //nur FPC Version
    {$endif}
    FStatusBar: TStatusBar;
    function HighlighterEquivalentToFileExt(AFileExt: ShortString): Integer;
    function GetHighlighter: Integer;
    procedure SetFilename(AFilename: ShortString);
    procedure SetHighlighter(AHighlighter: Integer);
  public
    procedure Compile;
    procedure CompileSource(AFilename: ShortString);
    constructor Create(AOwner: TComponent);
    destructor Destroy; override;
    procedure NewFile;
    procedure LoadFromFile(AFilename: ShortString);
    procedure Save;
    procedure SaveAs(AFilename: ShortString);
    property FileExt: ShortString read FExtension write FExtension;
    property Filename: ShortString read FFilename write SetFilename;
    property Highlighter: Integer read GetHighlighter write SetHighlighter;
  end;
Das TEditorWindow dient als Editor, wenn ich eine MDI Anwendung bauen will. Soll der Editor in Registerkarten erscheinen, wie in der Delphi IDE, dann kommt die Version mit EditorPage und Co. zum Einsatz.

Den EditorPagesContainer habe ich hinzugefügt, um die Editorseiten einfacher in das PageControl, hier TEditorPages, einfügen zu können. Leider wird aber nur eine Registerseite erzeugt.

Gibt es eine Möglichkeit, das Design übersichtlicher zu gestalten?

Ich will erreichen, das alle Funktionen eines Quelltexteditors (auch mit mehrereren Editoren pro Sitzung, siehe Delphi IDE) in einem Modul Vereint sind und ich spter, wenn ich in den Tiefen des Internets einen KommandozeilenCompiler finde, für eine Programmiersprache, die ich mir aneignen will, problemlos eine IDE für diesen Compiler bauen kann.

Mir gefllt jedoch mein aktuelles Design noch nicht wirklich. Wie kann ich es übersichtlicher machen?

Außerdem wird, wie gesagt immer nur eine Registerseite erzeugt. Wenn ich eine neue Datei öffne, wird der Text in der Registerseite ersetzt, whrend Delphi dann eine neue Editorseite erzeugt, was auch ich beabsichtige.

Im Anhang ist mein gesamter Quellcode. Hier nur noch zum schnelleren Finden die Methode OpenEditor von TEditorPagesContainer:

Delphi-Quellcode:
procedure TEditorPagesContainer.OpenEditor(AFilename: ShortString);
var Editor: TEditorPage; Extension: ShortString; Index: Integer;
begin
  {
  So hatte ich es zuerst gemacht
  Editor := TEditorPage.Create(self);
  Editor.PageControl := FEditorPages;
  Editor.LoadFromFile(AFilename);
  }

  
  //FEditorPage ist eine erweiterte TObjectList. Ich habe die Methode AddEditor und eine
  //Eigenschaft Editors als Default hinzugefügt und will die einzelnen Editoren hier speichern,
  //da die obige Version immer nur einen Einzigen Editor öffnet.
  
  Index := FEditorPage.AddEditor(TEditorPage.Create(self));
  FEditorPage[Index].PageControl := FEditorPages;
  FEditorPage[Index].LoadFromFile(AFilename);
end;
Angehängte Dateien
Dateityp: tgz ideeditor_178.tgz (380,0 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat