Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TStrings.Assign gibt EAbstractError


GuaAck - Di 17.04.12 23:58
Titel: TStrings.Assign gibt EAbstractError
Hallo,

ich möchte aus einer Library (CPort) eine bestimmte Procedure nutzen, erhalte aber immer den Fehler "EAbstractError". Da ich den Quellcode der Library habe, konnte ich den Fehler auch in dem dargestellten Code-Schnippsel reproduzieren. Der Fehler passiert bei dem Assign. Ich habe schon versucht, hsl als globale Variable zu deklarieren, hsl als TStrimgs zu definieren oder auch hs als VAR zu übergeben. Hat alles keinen Einfluss. Hat jemand einen Tipp?

Gruß GuaAcke
(Delphi 7)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
{ Sinngemäß mein Programm }
{ ======================= }
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
  hs: tstrings;
  i: integer;
BEGIN
  hs := tstrings.Create;
  fuelle(hs);
  Memo1.Clear;
  FOR i := 0 TO hs.Count - 1 DO
    Memo1.Lines.Add(hs[i]);
  hs.Free;
END;

{ Sinngemäß die Library Procedure }
{ =============================== }
PROCEDURE TForm1.fuelle(hs: tstrings);
VAR
  hsl: TStringList;
BEGIN
  hsl := TStringList.Create;
  hsl.Add('aaaa');
  hsl.Add('cccc');
  hsl.Add('bbbb');
  hs.Assign(hsl);
  hsl.Free;
END;


mandras - Mi 18.04.12 00:29

Ich habs mal mit D6 geprüft.

Das Problem liegt anscheinend an folgendem:

Es ist nicht möglich einem tstrings ein tstringlist zu "assignen":
fuelle aus cport ruft das assign der übergebenen tstrings auf. dort wird wiederum clear aufgerufen was den abstract error erzeugt.
Versuch es einfach mal damit in Deinem button1click:

hs := tstringlist.Create;


Narses - Mi 18.04.12 00:50

Moin!

TStrings ist eine abstrakte Basisklasse, die nicht selbst instantiiert werden darf (steht auch so in der DOH :les:), es ist also kein Wunder, dass es so nicht geht:
user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
{ Sinngemäß mein Programm }
{ ======================= }
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
  hs: tstrings;
  i: integer;
BEGIN
  hs := tstrings.Create;
Lösung hast du schon bekommen, z.B. eine TStringList nehmen. ;)

cu
Narses


GuaAck - Mi 18.04.12 19:41

Danke Narses,

in der Delphi-Hilfe habe ich jetzt folgendes Konstrukt gefunden, was geht:

Delphi-Quelltext
1:
2:
3:
4:
5:
VAR
hs:TStrings;

BEGIN
hs:=TstringList.create;


Damit geht es, Danke an alle,


Narses - Do 19.04.12 09:30

Moin!

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
in der Delphi-Hilfe habe ich jetzt folgendes Konstrukt gefunden, was geht:

Delphi-Quelltext
1:
2:
3:
4:
5:
VAR
hs:TStrings;

BEGIN
hs:=TstringList.create;
"Geht doch" ist ein schlechter Ansatz. :? Ich muss dir davon aber auch abraten, trotz "geht doch". ;) Wenn du eine TStringList instantiierst, dann deklatiere sie auch so, sonst kannst du ja nichtmal ohne Typecast auf die Eigenschaften und Methoden des Objektes zugreifen! :idea: Alles andere macht nur sehr wenig bis keinen Sinn. :nixweiss:

Also:

Delphi-Quelltext
1:
2:
3:
4:
5:
var
  hs: TStringList;

begin
  hs := TStringList.Create;
cu
Narses