Entwickler-Ecke

Sonstiges (Delphi) - Problem mit TStrings


patmann2001 - Mi 11.09.02 09:19
Titel: Problem mit TStrings
Hallo
Ich habe eine Globale Variable vom Type TStrings. Wenn ich versuche nun mit ADD Strings darin abzulegen bekomme ich eine Fehlermeldung. Ich habe auch versucht das Ding erstmal zu createn, das geht aber auch nicht. Was muss ich da machen?
In allen Fällen tritt diese Exception auf:
Im Projekt ... ist eine Exception der Klasse EAccessViolation aufgetreten.
Beim Debugen ist mir noch aufgefallen, das diese Variable die ganze Zeit auf NIL steht.
Ich benutze Delphi4

cu Patmann


wwerner - Mi 11.09.02 09:24

Benutze TStringList. TStrings ist nur ein Vorfahre, der nicht beutzt wird. Steht in der OH.


LCS - Mi 11.09.02 09:26

Hi
Objekte müssen vor der Verwendung mit Create erzeugt werden.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure Sonstwas;
var
  meineListe : TStringList;
begin
  meineListe := TStringList.Create;
  try
    tuwas
  finally
    meineListe.Free;  //Freigeben ist wichtig
  end;
end;

Wenn du das Objekt global verwendest schreibst du Create am besten in FormCreate und das Freigeben in FormClose oder FormDestroy.

Gruss Lothar


Sephiroth - Mi 11.09.02 13:46

Hi,

Bei der Variablendeklaration kann man statt TStringList > TStrings hinschreiben. Das funktioniert auch und somit weiss patman auch wie man TStrings verwendet und trotzdem mit TStringlist arbeitet.


LCS - Mi 11.09.02 14:34

Hi
Zitat:

Bei der Variablendeklaration kann man statt TStringList > TStrings hinschreiben

Versteh ich das so, dass du das so schreiben willst?

Quelltext
1:
2:
3:
4:
5:
6:
procedure Sonstwas; 
var 
  meineListe : TStrings; 
begin 
  meineListe := TStringList.Create; 
  ...

Falls nein gilt das was wwerner schon geschrieben hat. TStrings ist ein abstrakter Basistyp.
Falls ja: Solltest du auf keinen Fall machen.
Erstens ist es nicht gerade übersichtlich einen Objekttyp zu deklarieren und ihm dann ein Objekt von einem anderen Typ zuzuweisen.
Zweitens wird deine Stringliste ja damit in ein Objekt vom Typ TStrings gecastet. Bei den Basis-Methoden / -Eigenschaften kein Problem. Aber was passiert mit den Eigenschaften/Methoden die erst von TStringList eingeführt werden? Versuch in dem Beispiel mal die Methode Sort aufzurufen.

Und wenn ich das alles total falsch verstanden hab, nix für ungut :D

Lothar


aogwaba - Mi 11.09.02 19:01

Hi!
Muss auch noch meinen Senft dazugeben ;)

Wenn die Deklaration :

Quelltext
1:
2:
3:
4:
5:
procedure Sonstwas; 
var 
  meineListe : TStrings; 
begin 
  meineListe := TStringList.Create;

lautet, ist der Object-Typ vom Typ TStrings, die Instanz aber vom Typ TStringList. Nur die von TStrings (als abstract/virtual) deklarierten Methoden und von TStringList implementierten Methoden stehen zur Verfügung.

Quelltext
1:
meineListe.sort;                    

geht nicht.

Mit einem Typcast sind aber auch die Methoden von StringList nutzbar

Quelltext
1:
(meineListe as TStringList).sort;                    

cu
waba


patmann2001 - Mi 11.09.02 19:17

danke an alle
Das man eine TStringList benutzen muss wußte ich nicht. Klappt aber jetzt
cu Patmann


Klabautermann - Mi 11.09.02 23:36

Hallo,
patmann2001 hat folgendes geschrieben:
Das man eine TStringList benutzen muss wußte ich nicht. Klappt aber jetzt.

da sollten bei dir immer die Alarmglocken angehen wenn du in der Online-Hilfe was von einer virtuellen abstrakten Kalsse liest. Dann dafst du diese nicht direckt benutzen.

Gruß
Klabautermann