AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi PosExUltra - Ultimative Stringsuche/Parser

PosExUltra - Ultimative Stringsuche/Parser

Ein Thema von Novo · begonnen am 21. Feb 2010 · letzter Beitrag vom 19. Mai 2010
Antwort Antwort
Seite 4 von 5   « Erste     234 5   
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
230 Beiträge
 
Delphi 10.3 Rio
 
#31

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 10:27
Erzeugt und wieder freigegeben habe ich die Stringlist natürlich ausserhalb, eine Property ist diese ja auch nicht:

Delphi-Quellcode:
  slSplitString:=TStringList.Create;
  try
    slSplitString:=ExtractBetween(dummy, 'http://', '.de', '', '', true);
    Memo.Lines.AddStrings(slSplitString);
  finally
    slSplitString.Free;
  end;
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.252 Beiträge
 
Delphi 10.4 Sydney
 
#32

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 10:29
Und damit hast Du Dir die Referenz der erzeugten Liste mit einer nichtexistenten überschrieben. Mach es doch wie vorgeschlagen: übergib die Liste als (const-)Parameter und alles wird gut

[edit] Da waren mir zu viele "und"s drin [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
230 Beiträge
 
Delphi 10.3 Rio
 
#33

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 11:07
Hab ich schon längst wieder gemacht.
Es ging mir nur darum, zu verstehen, was hier schief läuft.

Danke für die Infos und die Geduld.
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#34

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 11:21
Hast du es schon bereits verstanden?

Ansonsten eine kleine Erklärung:
Du gibst mit der Funktion via Result etwas zurück. Das macht auch deine Zuweisung deutlich. Wenn man schreibt a := b dann schreibt man quasi den Inhalt von b in a. Das Problem dabei ist, das du nirgends der Funktion sagst, wie denn das erstellte Objekt lautet, dass zurückgegeben wird. Ich mach mal ein Beispiel:
Delphi-Quellcode:
function answer : Integer;
begin
  Result := 42 * Result;
end;

var
  a : Integer;
begin
  a := 10;
  a := answer;
  ShowMessage(IntToStr(a));
end;
Das ist quasi dein Beispiel: Du initialisierst a und schreibst dann den Wert der Funktion rein, und versuchst a in der Funktion zu benutzen. Wahrscheinlich steht nachher im Dialog 0, weil Result normalerweise mit 0 initalisiert wird. Wenn man das jetzt etwas umschreibt und die Funktion umgeht sieht das dann so aus (woraus klar werden dürfte, warum das nicht geht):
Delphi-Quellcode:
var
  a, b : Integer;
begin
  a := 10;

  // Code von answer
  b := 42 * b;

  a := b;
  ShowMessage(IntToStr(a));
end;
Das heißt, Result ist wie eine lokale Variable und nur in der Funktion sichtbar, womit es nicht den Wert von a hat.
Ich hoffe das ist soweit verständlich.

MfG
Fabian

PS: Es kann auch sein, dass a ≠ 0 ist, weil man nicht sicher sein kann, mit was Result oder b initalisiert werden. In der Regel wird a aber 0 sein
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
230 Beiträge
 
Delphi 10.3 Rio
 
#35

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 11:31
Jetzt hats Klick gemacht, danke.
Schon witzig, wenn einem so ein Grundlagenproblem nach vielen Jahren Programmiertätigkeit noch nicht untergekommen ist.
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.252 Beiträge
 
Delphi 10.4 Sydney
 
#36

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 11:34
Um das noch weiter auszuführen: TStrings ist ja eine Klasse. Will man nun ein Objekt dieser Klasse in einer Funktion zurückgeben, muss sie auch innerhalb der Klasse Funktion instanziert werden. Da aber die Freigabe nicht innerhalb des Blocks (also der Funktion) erfolgen kann, in dem sie instanziert wurde (der Rückgabewert wäre ja sonst hinfällig), muss man sehr genau aufpassen, dass man sich kein Speicherleck einfängt. Aus genau diesem Grund gilt diese Vorgehensweise als unschön. Der einzige mir bekannte sinnvolle Einsatzzweck einer Funktion, die ein Objekt zurückgibt, ist der Getter einer Property. Es mag evtl. noch weitere geben, aber es fallen mir spontan keine ein. Zur angesprochenen Property aber noch schnell ein Beispiel:
Delphi-Quellcode:
type
  TMyClass = class
  private
    //privates Feld vom Typ der Klasse (initial nil)
    FStrings: TStrings;
    //Getter-Methode
    function GetStrings: TStrings;
  public
    //Property
    property Strings: TStrings read GetStrings;
  end;

...

function TMyClass.GetStrings: TStrings;
begin
  if not Assigned(FStrings) then
    FStrings := TStringlist.Create;
  Result := FStrings;
end;
Der Sinn einer solchen Vorgehensweise liegt darin, Objekte erst dann zu erzeugen, wenn diese auch wirklich gebraucht werden, im obigen Beispiel also beim ersten Zugriff auf die Property.

[edit] Blödsinn korrigiert (s.o.) [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.296 Beiträge
 
Delphi 2007 Professional
 
#37

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 17:41
Zitat von DeddyH:
Und damit hast Du Dir die Referenz der erzeugten Liste mit einer nichtexistenten überschrieben. Mach es doch wie vorgeschlagen: übergib die Liste als (const-)Parameter und alles wird gut

[edit] Da waren mir zu viele "und"s drin [/edit]
Die Liste als const-Parameter zu übergeben ist fast genauso falsch wie als var-Parameter.
In beiden Fällen wird eine Referenz auf eine Objektvariable erwarted, damit ist die direkte Übergabe von TStrings-Property nicht möglich.

Vor Parametern für einfache Datentypen ohne Referezzählung braucht auch kein const zu stehen.
Ein Boolean nimmt auf dem Stapel ebenso viel Speicher ein, wie ein Zeiger auf eine Boolean-Variable/Konstante.
Innerhalb der Prozedur kann einfacher auf den Wert zugegriffen werden, als diesen bei jedem Zugriff über den Zeiger zu lesen/schreiben.

Mein Vorschlag:
Delphi-Quellcode:
procedure ExtractBetween(const aSource, aPrefix, aSuffix, aNewPrefix, aNewSuffix : string;
                         aWords : TStrings;
                         aFindAll : Boolean = True);
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.252 Beiträge
 
Delphi 10.4 Sydney
 
#38

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 17:46
Zitat von Blup:
..., damit ist die direkte Übergabe von TStrings-Property nicht möglich.
Delphi-Quellcode:
procedure FillWithNumbers(const aList: TStrings);
var i: integer;
begin
  aList.Clear;
  for i := 0 to 100 do
    aList.Add(Format('%d',[i]));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FillWithNumbers(Memo1.Lines);
end;
Komischerweise funktioniert das bei mir, obwohl ich das wohl schon seit Jahren falsch mache.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#39

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 26. Feb 2010, 19:54
Ich vermute, er verwechselt das mit var was natürlich nicht geht

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.296 Beiträge
 
Delphi 2007 Professional
 
#40

Re: PosExUltra - Ultimative Stringsuche/Parser

  Alt 1. Mär 2010, 13:18
Ich habe mich zu kurz und damit falsch ausgedrückt
Zitat von Blup:
Die Liste als const-Parameter zu übergeben ist fast genauso falsch wie als var-Parameter.
Ich hätte schreiben sollen "Die Übergabe als const-Parameter ist überflüssig".
Zitat von Blup:
In beiden Fällen wird eine Referenz auf eine Objektvariable erwarted,
Tatsächlich behandelt der Compiler "const" nur, in dem er Zuweisungen auf die Variable innerhalb der Prozedur verbietet und entsprechend auch die Weitergabe als var-Parameter an weitere Funktionsaufrufe. Der erzeugte Code ist identisch, ob "const" angegeben wird oder auch nicht.
Zitat von Blup:
damit ist die direkte Übergabe von TStrings-Property nicht möglich.
Der Teilsatz bezieht sich natürlich auf var-Parameter. Als weitere Einschränkung muss die Variable auch genau dem Typ entsprechen. Wird die Variable z.B. als TStringList deklariert, ist eine direkte Übergabe unzulässig.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 00:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf