Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi einer Klassenfunktion einen berechneten Wert übergeben? (https://www.delphipraxis.net/134102-einer-klassenfunktion-einen-berechneten-wert-uebergeben.html)

VizeTE 15. Mai 2009 18:06


einer Klassenfunktion einen berechneten Wert übergeben?
 
Hallo,

ich bin gerade auf einen mir unbekannten Effekt gestoßen. (Delphi 5)
Innerhalb einer Klasse habe ich folgende Klassenfunktion definiert:
Delphi-Quellcode:
class function TMyObject.FindCtrlTag(Text: string; Offset: integer; out CtrlTag: string): integer;
Von anderer Stelle habe ich diese Funktion dann aufgerufen:
Delphi-Quellcode:
...
var
  CtrlTag : string;
  Idx: integer
  MyText : string;
begin
  MyText := 'test <tag> test';
  ...
  Idx := TMyObject.TMyObject.FindCtrlTag(MyText, 0, CtrlTag);
  while Idx > 0 do
    Idx := TMyObject.TMyObject.FindCtrlTag(MyText, Idx + Length(CtrlTag), CtrlTag);
end;
Ich hoffe es wird klar worauf ich hinaus will. Ziel ist alle Tags in Text zu durchlaufen.
Beim zweiten Aufruf von FindCtrlTag kommt innerhalb der Funktion aber nur der Wert von "Idx" an und nicht der Wert von "Idx + Length(CtrlTag)".
Zuvor hatte ich dort auch mal "Pred(Idx + Length(CtrlTag))" stehen. Dann kam in der Funktion immer 0 an.

gelöst habe ich es so:
Delphi-Quellcode:
...
type
  TMyObject = class
    ...
    class function TMyObject.FindCtrlTag(Text: string; var Offset: integer; out CtrlTag: string): integer; //Offset als "var"
    ...
  end;
...
var
  CtrlTag : string;
  Idx: integer
  MyText : string;
begin
  MyText := 'test <tag> test';
  ...
  Idx := TMyObject.TMyObject.FindCtrlTag(MyText, 0, CtrlTag);
  while Idx > 0 do
  begin
    Inc(Idx, Length(CtrlTag)); //Idx vorher erhöhen
    Idx := TMyObject.TMyObject.FindCtrlTag(MyText, Idx, CtrlTag);
  end;
end;
Kann mir das jemand erklären?


Danke!

Hawkeye219 15. Mai 2009 19:28

Re: einer Klassenfunktion einen berechneten Wert übergeben?
 
Hallo,

da du die Variable CtrlTag als OUT-Parameter vereinbart hast, wird ihr Inhalt gelöscht, bevor seine Länge ermittelt werden kann. Wenn du die Variable als VAR-Parameter vereinbarst, dürfte der Fehler nicht auftreten.

Eine genaue Erklärung findest du auf dieser Seite.

Gruß Hawkeye

DeddyH 15. Mai 2009 19:33

Re: einer Klassenfunktion einen berechneten Wert übergeben?
 
Das war aber nicht die Implementation der Funktion, sondern nur der Aufruf (oder ich hab das völlig missinterpretiert).

VizeTE 20. Mai 2009 14:32

Re: einer Klassenfunktion einen berechneten Wert übergeben?
 
Zitat:

Zitat von Hawkeye219
da du die Variable CtrlTag als OUT-Parameter vereinbart hast, wird ihr Inhalt gelöscht, bevor seine Länge ermittelt werden kann. Wenn du die Variable als VAR-Parameter vereinbarst, dürfte der Fehler nicht auftreten.

So gehts, danke. Irgendwie klingt die Erklärung auch logisch. Ich hatte erwartet das das löschen der out-Variable erst später passiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 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 by Thomas Breitkreuz