Multiple Editors with a list of TRTFDataCollections and Tabset

<< Click to Display Table of Contents >>

Navigation:  Programming > User Interface > Layoutmodes > Multiple Editors for the Same Text >

Multiple Editors with a list of TRTFDataCollections and Tabset

Here we create a program which uses a tabset to switch between different editors.

 

 

clip0215

 

We need this variables:

 

RTFSets : TList; // TWPRTFDataCollection

ActiveTab : Integer;

 

This code initailizes:

 

procedure TForm2.FormCreate(Sender: TObject);

begin

// RTFSets kann hier nicht erzeugt werden, da die Controls

// bereits vorher angelegt werden.

// Daher WPRichText1InitializeRTFDataObject für beide Editoren

// aufrufen lassen

 

 UpdateTabSet;

end;

 

procedure TForm2.FormDestroy(Sender: TObject);

var I : Integer;

begin

 SelectRTFSet(-1);

 

for I := 0 to RTFSets.Count-1 do

    TWPRTFDataCollection( RTFSets[I] ).Free;

 RTFSets.Free;

 

end;

 

// Do not use OnInitializedRTFData

procedure TForm2.WPRichText1InitializeRTFDataObject(Sender: TObject;

var RTFDataObject: TWPRTFDataCollection; var RTFPropsObject: TWPRTFProps);

begin

if RTFSets=nil then

begin

    RTFSets := TList.Create;

    // Hier TWPRTFDataBlockEd verwenden!

    RTFSets.Add( TWPRTFDataCollection.Create( TWPRTFDataBlockEd ) );

end;

 RTFDataObject := TWPRTFDataCollection( RTFSets[0] );

 RTFDataObject.MakeRTFProps;

end;

 

 

Add and remove RTFData objects

 

procedure TForm2.FreeRTFSet(index: Integer);

begin

 TWPRTFDataCollection( RTFSets[index] ).Free;

 RTFSets.Delete(index);

while index>=RTFSets.Count do dec(index);

 SelectRTFSet( index );

end;

 

procedure TForm2.SelectRTFSet(index: Integer);

begin

 WPRichText1.RemoveRTFData;

 WPRichText2.RemoveRTFData;

if (index>=0) and (index<RTFSets.Count) then

begin

     WPRichText1.SetRTFData(TWPRTFDataCollection( RTFSets[index] ));

     WPRichText2.SetRTFData(TWPRTFDataCollection( RTFSets[index] ));

     ActiveTab := index;

end

else ActiveTab := -1;

 UpdateTabSet;

end;

 

 

 

procedure TForm2.AddRTFSet;

var rtfdata : TWPRTFDataCollection;

begin

  rtfdata := TWPRTFDataCollection.Create( TWPRTFDataBlockEd );

  rtfdata.MakeRTFProps;

  RTFSets.Add( rtfdata );

  SelectRTFSet(RTFSets.Count-1);

end;

 

Update the TabSet

 

procedure TForm2.WPRichText1AfterLoadText(Sender: TObject);

begin

 UpdateTabSet;

end;

 

 

procedure TForm2.UpdateTabSet;

var I : Integer;

begin

 TabSet1.Tabs.Clear;

for I := 0 to RTFSets.Count-1 do

   TabSet1.Tabs.Add(

     ExtractFileName(

      TWPRTFDataCollection( RTFSets[I] ).LastFileName ));

 TabSet1.TabIndex := ActiveTab;

end;

 

procedure TForm2.TabSet1Change(Sender: TObject; NewTab: Integer;

var AllowChange: Boolean);

begin

if ActiveTab<>NewTab then

    SelectRTFSet( NewTab );

end;

 

Capture the Click on the "New" and "Close" button in the toolbar

 

procedure TForm2.WPToolbar1IconSelection(Sender: TObject; var Typ: TWpSelNr;

const str: string; const group, num, index: Integer);

begin

// Click auf NEW

if (Typ=wptIconSel) and

    (group=WPI_GR_DISK) and

    (num=WPI_CO_New) then

begin

      AddRTFSet;

      WPToolbar1.UpdateIconAfterClick := true;

      Typ := wptNone;

end

// Click auf CLOSE

else

if (Typ=wptIconSel) and

    (group=WPI_GR_DISK) and

    (num=WPI_CO_Close) then

begin

      if WPRichText1.CanClose then

      begin

        if RTFSets.Count>1 then

            FreeRTFSet(ActiveTab)

        else

        begin

           WPRichText1.Clear;

           WPRichText1.LastFileName := '';

           WPRichText1.CheckHasBody;

           WPRichText2.CheckHasBody;

        end;

      end;

      UpdateTabSet;

      WPToolbar1.UpdateIconAfterClick := true;

      Typ := wptNone;

end;

 

end;