![]() |
Delphi-Version: 7
Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Kann da mal schnell jemand drüber schauen und mir sagen, warum
Delphi-Quellcode:
function commands (request:string):TStringList; stdcall;
var s1, s2, s3: String; Liste: TStringList; begin s1:='H'; s2:='G0'; s3:='G1'; Liste := TStringList.Create; Liste:= Liste.Add(s1); Liste.Add(s2); Liste.Add(s3); result:=Liste; end; exports commands; Das hier ausgibt?!:
Code:
Ich habe doch s1 - s3 als strings definiert und nicht als integer, wo ist denn das Problem?
[Error] Project2.dpr(24): Incompatible types: 'TStringList' and 'Integer'
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Du willst ein Objekt aus einer DLL zurückgeben? Das wird so nichts. Informiere dich mal über "DLL und Objekte".
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
Delphi-Quellcode:
Liste := Liste.Add(s1); Ob das mit der Übergabe funktioniert, wie Luckie moniert, hat ersteinmal nichts mit dem jetzt erzeugten Fehler zu tun. |
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Das auch, aber der Fehler ist in hier:
Delphi-Quellcode:
Liste.Add gibt den Index des neu hinzugefügten Eintrages zurück ( ein Integer) welchen Du dann der Liste zuweisen willst.
Liste:=
Liste.Add(s1); |
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Auch wenn ich nicht weiß, ob mein Vorschlag auch nur ansatzweise sinnvoll erscheinen könnte, vermutlich hätte ich es so gemacht:
Delphi-Quellcode:
Was soll denn hier passieren?
function commands (request:string):TStringList; stdcall;
begin Result := TStringList.Create; Result.Add('H'); Result.Add('G0'); Result.Add('G1'); end;
Delphi-Quellcode:
Add ist eine Methode von Liste, aber die weist man doch nicht bei dem Aufruf gleichzeitig wieder der Liste zu?
Liste:=
Liste.Add(s1); Auch dashier verstehe ich nicht:
Delphi-Quellcode:
mit einem
result:=Liste;
Delphi-Quellcode:
und dem dann zwingend folgende
result.AddStrings(Liste);
Delphi-Quellcode:
könnte ich ja noch leben.
Liste.Free
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Wann, und wie, wenn überhaupt, wird die Stringliste denn wieder freigegeben?
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
Aber auch der Einwand von nahpets hat seine Berechtigung und sollte berücksichtigt werden. |
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Der Code entstand bei meinem erste Test mit DLL's. Deswegen sind da noch einige Brocken drin, die schlichtweg nicht mehr gebraucht werden, bzw. keinen Sinn ergeben.
Deswegen auch das überflüssige
Delphi-Quellcode:
Liste:=
Liste.Add(s1); Zitat:
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
Delphi-Quellcode:
Steht nur leider erst seit 20 Sekunden da :wink:
Liste.free;
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Gerade gelesen.
Zitat:
Ich lass mir das testweise in einer Messagebox ausgeben
Delphi-Quellcode:
Funktioniert.
teststring:=commands('test');
showmessage(teststring[0]+' '+teststring[1]+' '+teststring[2]); |
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Moin,
Daten in so eine Stringliste bekommt man durcch die verschiedensten Türen:
Delphi-Quellcode:
Liste.AddStrings(Liste, ['car', 'cat', 'dog']);
Delphi-Quellcode:
Liste.DelimitedText := 'Zeile1,Zeile2,in mehrere Zeilen';
Delphi-Quellcode:
Liste.AddStrings('Mal wieder eine neue Zeile');
Delphi-Quellcode:
Liste.Text:='Ein Text mit Zeilenumbruch geht in mehrere Zeilen';
also glatter Viertürer. Grüße in die Runde // Martin |
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
Delphi-Quellcode:
Ergibt
Liste.AddStrings(Liste, [s1,s2,s3]);
Delphi-Quellcode:
[Error] Project2.dpr(23): Too many actual parameters
|
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
Die Methode Destroy ist "virtual" und wird somit über die Klassenreferenz des Objektes in der DLL aufgerufen. Aber schon der Vergleich "(teststring is TStringList)" dürfte in der Anwendung "False" ergeben. Der Stringliste dürfen auch nur einzelne String-Konstanten hinzufügt werden. Für diese wird keine Referenzzählung und keine automatische Freigabe durchgeführt. Wird ein String in der DLL mit dem Speichermanager der DLL erzeugt, wird bei der Freigabe unter Umständen der Speichermanager der Anwendung aufgerufen, der für diesen Speicherbereich nicht zuständig ist. Gefährlich wäre z.B.:
Delphi-Quellcode:
{in der DLL:}
Liste.Add('function' + IntToStr(i)); {in der Anwendung mit der selben Liste:} s := teststring[0]; teststring.Free; s := ''; // <- Hier könnte es dann einen Fehler geben, da Referenzzähler des Strings auf 0 fällt |
AW: Alles richtig, trotzdem "Incompatible Types TString List and Integer"?
Zitat:
Der eine Compiler braucht sich nur zu denken, "oh geil, das braucht keiner, also lass ich es weg". In dem anderen Modul (EXE/DLL) wird das aber benötigt und dann knallt es, z.B. beim Zugriff auf das Feld, bzw. auch auf alle nachfolgenden Felder. Auch alle Prüfungen mit IS gehen dann in die Hose, da jedes Modul seine eigene RTTI hat und dann TObject (EXE) nicht das Selbe ist, wie TObject (DLL). Laufzeitpackages sind da die einzige wirkliche Lösung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz