Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ganz simpler aufruf aber compiler meldet fehler... (https://www.delphipraxis.net/80765-ganz-simpler-aufruf-aber-compiler-meldet-fehler.html)

Angel333 14. Nov 2006 23:04


ganz simpler aufruf aber compiler meldet fehler...
 
Ich will n memo nach nem string durchsuchen ganz normal...das hat auch alles funktioniert.
Aber als ich dann aus einem String was löschen wollte sagt er immer:

Constant object cannot be passed as var Parameter


Delphi-Quellcode:
while i<=memo4.Lines.Count-1 do
begin
if pos('http://lix.in/',memo4.Lines[i])>0 then
  begin
        q:= pos('http://lix.in/',memo4.Lines[i]);
        for p:= Pos('http://lix.in/', memo4.Lines.Strings[i]) to length(memo4.Lines.strings[i]) do
          if (Memo4.Lines.Strings[i][p] <> ' ') then
          begin
          s := s + Memo4.Lines.Strings[i][p];
          end
        else
        begin
          break;
          delete(memo4.lines.strings[i],q,p);
        end;
          memo3.Lines.Add(s);
          s:='';
        end;
  end;
i:=i+1;
end;

Ich dreh durch...selbst wenn ich da delete('test',1,2) einsetze sagt er dass gleiche...
Markiert aber diese Zeile als Fehlerquelle...

Habe delphi 6 personal english

Vielen Dank im Vorraus.

Ultimator 14. Nov 2006 23:23

Re: ganz simpler aufruf aber compiler meldet fehler...
 
Arbeite nicht direkt mit Memo4.Lines.Strings, sondern speichere diese in eine Variable, mit der du in deiner Prozedur arbeitest und die du danach wieder deinen Memo4.Lines.String zuweist. Ist außerdem schneller ;)

marabu 15. Nov 2006 06:59

Re: ganz simpler aufruf aber compiler meldet fehler...
 
Guten Morgen.

Memo4.Lines.Strings[i] ist das gleiche wie Memo4.Lines[i]. In jedem Fall ist es eine property und kann nicht als Variable an die Prozedur Delete() übergeben werden - wie Julian dir schon geschrieben hat. Wenn du eine Position öfter verwendest, dann solltest du sie in einer Variablen zwischenspeichern und sie nicht ständig neu suchen lassen. Und wenn du deinen Code funktional gliederst, hast du mehr Spaß am Programmieren:

Delphi-Quellcode:
procedure ExtractUrls(s, urls: TStrings; prefix: String);
var
  i, iStart, iStop: Integer;
  line: String;
begin
  for i := 0 to Pred(s.Count) do
  begin
    line := s[i];
    iStart := Pos(prefix, line);
    if iStart > 0 then
    begin
      iStop := PosEx(' ', line, iStart + Length(prefix));
      if iStop = 0
        then urls.Add(Copy(line, iStart, MaxInt))
        else urls.Add(Copy(line, iStart, iStop - iStart));
    end;
  end;
end;
Verwenden kannst du diese Prozedur in deinem Fall so:

Delphi-Quellcode:
begin
  ExtractUrls(Memo4.Lines, Memo3.Lines, 'http://lix.in/');
end;
Grüße vom marabu

Angel333 15. Nov 2006 09:26

Re: ganz simpler aufruf aber compiler meldet fehler...
 
Danke euch...

Habs jetzt so gemacht wie marabu es gesagt hat...

Hattte kein PoseX (Delphi6 PE)

aber habs nachgebaut mit
Delphi-Quellcode:
function PosEx(const Substr: string; const S: string; Offset: Integer): Integer;
begin
  if Offset <= 0 then Result := 0
  else
    Result := Pos(Substr, Copy(S, Offset, Length(S)));

  if Result <> 0 then
    Result := Result + Offset - 1;
end;
Jedoch findet er trotzdem nur einen link wenn sie in einer zeile stehen...

Wenn wir das noch gelöst kriegen...Bettel....

marabu 15. Nov 2006 13:16

Re: ganz simpler aufruf aber compiler meldet fehler...
 
An mehrere Links pro Zeile hatte ich bei meinem Code garnicht gedacht, aber mit PosEx() und zwei zusätzlichen Zeilen sollte es funktionieren:

Delphi-Quellcode:
procedure ExtractUrls(s, urls: TStrings; prefix: String);
var
  i, iStart, iStop: Integer;
  line: String;
begin
  for i := 0 to Pred(s.Count) do
  begin
    line := s[i];
    iStop := 0;
    repeat
      iStart := PosEx(prefix, line, Succ(iStop));
      if iStart > 0 then
      begin
        iStop := PosEx(' ', line, iStart + Length(prefix));
        if iStop = 0
          then urls.Add(Copy(line, iStart, MaxInt))
          else urls.Add(Copy(line, iStart, iStop - iStart));
      end;
    until iStart = 0;
  end;
end;
Freundliche Grüße

Angel333 15. Nov 2006 13:39

Re: ganz simpler aufruf aber compiler meldet fehler...
 
Und ich hatte an repeat until nicht gedacht...

Vielen vielen dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz