Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 3. Jan 2010, 16:12
Zitat von Guido Eisenbeis:
Ok, bleibt immer noch die Ausgangs-Frage: Warum eine Variable als TStrings deklarieren, wenn mit TStringList instanziert wird?
Wenn man direkt folgendes macht:
Delphi-Quellcode:
var x:TStringList;
begin
  x:=TStringlist.create;
 
  ...
end;
und hier x nur als Tstringlist verwendet und niemals nicht
eine andere Klasse (abgeleitet von TStrings) in x verwendet, dann ist es völlig sinnlos TStrings zu nehmen und in der Hilfe auch unsauber erklärt. --> Hier wäre x besser als TStringlist deklariert. Wenn du nirgends Probleme (mit dem Compiler) damit bekommst ist es auch in Ordnung TStringList zu verwenden. Mit TStrings würdest du dir Möglichkeiten verbauen, die vorhanden sind, du aber auf Grund der Deklaration nicht weist wo (Die Möglichkeit der Sortierung hat TStrings IMHO noch nicht dabei etc. pp).


Wo nimmt man nun TStrings?
Möglichkeit 1 (Wurde schon mehrfach hier erwähnt ):
-> Parameter
Du hast eine Methode, welche als Parameter TStrings bekommt
Delphi-Quellcode:
procedure myClass.myMethod(x:TStrings)
begin
  showmessage(x.Strings[0]);
end;
Du kannst in dieser Methode verschiedene Ableitungen von TStrings bekommen und bspw. nur die Strings auslesen und - wie hier - anzeigen. Ob das jetzt eine TStringList ist oder Memostrings oder von einem Stringgrid oder eine eigene Ableitung von TStrings ist völlig egal. Durch die virtualisierung des Getters von Strings wird bei jeder Variante intern eine andere Methode aufgerufen, nur du bekommst immer einen String vom Index 0 zurück.

Möglichkeit 2
-> Unterschiedliche Instanzierung von TStrings
Du bist dir bei der Deklaration noch nicht sicher welche Variante du von TStrings nimmst (das entscheidet sich quasi erst zur Laufzeit):
Delphi-Quellcode:
var x:TStrings;
begin
  if irgendetwas=irgendetwasanders then
    x:=TStringlist.create
  else
    x:=Memo1.lines;
  end;
  
  ...
end;
Hier mal noch ein Beipsiel:
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TmyStrings = class(TStrings)
   protected
    function Get(Index: Integer): string; override;
    function GetCount: Integer; override;
   public
    function Add(const S: string): Integer; override;
    procedure Delete(Index: Integer); override;
    procedure Insert(Index: Integer; const S: string); override;
    procedure Clear; override;
  end;


  TForm1 = class(TForm)
    Memo1: TMemo;
    RadioGroup1: TRadioGroup; //mit 3 Einträgen
    Edit1: TEdit;
    Button1: TButton; //eintragen des Edits in ausgewählte Impl. von TStrings
    Button2: TButton; //Anzeige der Stringlist
    procedure RadioGroup1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FStrings:TStrings;
    FmyStrings:TmyStrings;
    FStringList:TStringList;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  //Übergabe einer konkreten Implementierung an FStrings
  case RadioGroup1.ItemIndex of
    0: FStrings:=Memo1.lines;
    1: FStrings:=FmyStrings;
    2: FStrings:=FStringList;
    else FStrings:=nil;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //eigentliche Verwendeung von FStrings
  if assigned(FStrings) then
    FStrings.Add(edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  //Anzeige der StringList
  showmessage(FStringlist.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //ein paar Initialisierungen
  FStringList:=TStringlist.Create;
  FmyStrings:=TmyStrings.Create;
end;


{ TmyStrings }

function TmyStrings.Add(const S: string): Integer;
begin
  //es wird in dem Programm ausschließlich add verwendet
  showmessage(s);
  result:=-1;
end;

procedure TmyStrings.Delete(Index: Integer);
begin //abstrakte Methode überschreiben
end;

function TmyStrings.Get(Index: Integer): string;
begin //abstrakte Methode überschreiben
  raise Exception.create('Keine Strings gespeichert');
end;
function TmyStrings.GetCount: Integer;
begin //abstrakte Methode überschreiben
  result:=0;
end;
procedure TmyStrings.Insert(Index: Integer; const S: string);
begin //abstrakte Methode überschreiben
end;
procedure TmyStrings.Clear;
begin //abstrakte Methode überschreiben
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat