Warum funktionert das nicht ?

Ich habe ein einfachen Texteditor gebaut,
der dynm. in einem PageControl TabSheets und Editoren anlegt.
(zur Laufzeit)

Dafür habe ich ein Array von einem Record verwendet,
das Programm funktioniert solange gut,
wie ich nicht versuche auf dieses Array zuzugreifen.

Daraufhin viel mir auf, das es leer war.

Meine Frage … Wo sind die Komponenten (wo werden Sie verwaltet),
und wie kann ich drauf zugreifen.

Bitte mal anschauen:


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, SynEdit, ComCtrls;

type
 TForm1 = class(TForm)
 PageControl1: TPageControl;
 MainMenu1: TMainMenu;
 Datei1: TMenuItem;
 ffnen1: TMenuItem;
 schlieen1: TMenuItem;
 beenden1: TMenuItem;
 OpenDialog1: TOpenDialog;
 test1: TMenuItem;
 HalloWelt1: TMenuItem;
 procedure ffnen1Click(Sender: TObject);
 procedure schlieen1Click(Sender: TObject);
 procedure HalloWelt1Click(Sender: TObject);
 private
 { Private-Deklarationen }
 public
 { Public-Deklarationen }
 end;

var
 Form1: TForm1;

implementation

{$R \*.dfm}

type TEditorfenster = record
 nr: integer;
 dateiname: string;
 changed: boolean;
 Editor: TSynEdit;
 tabsheet: TTabsheet;
 end;

var Editorfenster: array [1..100] of TEditorfenster;
 Editorfenster\_count: integer = 0;

procedure neues\_fenster(editfenster: TEditorfenster);
begin
 inc( Editorfenster\_count );

 with editfenster do
 begin
 tabsheet := TTabSheet.Create(Form1.PageControl1);
 tabsheet.PageControl := Form1.PageControl1;
 tabsheet.caption := form1.opendialog1.filename;
 nr := Editorfenster\_count;
 dateiname := form1.opendialog1.filename;
 changed := false;
 Editor := TSynEdit.Create( nil );
 Editor.Parent := tabsheet;
 editor.align := alClient;
 editor.lines.LoadFromFile( form1.opendialog1.filename );
 editor.Show;
 end;

end;

procedure TForm1.ffnen1Click(Sender: TObject);
begin

 if not opendialog1.execute then exit;
 neues\_fenster(Editorfenster[Editorfenster\_count]);

end;


procedure TForm1.schlieen1Click(Sender: TObject);
var current\_page: TTabSheet;
 i: integer;
begin
 pagecontrol1.ActivePage.destroy;
end;

procedure TForm1.HalloWelt1Click(Sender: TObject);
begin

// Hier entsteht der Fehler
 Editorfenster[1].Editor.lines.add('Hallo Welt');

end;

end.#

Hallo,

setz einmal in die folgende Prozedurdeklaration ein „var“:

procedure neues\_fenster( **var** editfenster: TEditorfenster);

wenn ich mich recht entsinne, werden Records als Wertparameter übergeben. Deine aufrufende Funktion übergibt also nur den Inhalt der Array-Variablen, nicht die Variable selbst.

Und überleg dir mal, ob du den Editor nicht lieber als abgeleitete Klasse (von TObject oder evtl von TTabSheet) deklarierst. Dann könntest du die ganzen Initialisierungen in das OnCreate-Ereignis der abgeleiteten Klasse schreiben. Das würde den eigentlichen Code übersichtlicher und den Editor universeller machen.

Gruss, Niels