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.