Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Letzte Stelle eines Strings anwählen (https://www.delphipraxis.net/108434-letzte-stelle-eines-strings-anwaehlen.html)

jbg 13. Feb 2008 18:22

Re: Letzte Stelle eines Strings anwählen
 
Zitat:

Zitat von Muetze1
Nachteil: Bei einem leeren String würde die PChar Konvertierung ein Nil bringen

So so. Hast du etwa die System.pas insbesondere die Funktion _LStrToPChar umgeschrieben und setzt dass nun bei jedem anderen voraus? :mrgreen:

Muetze1 13. Feb 2008 18:56

Re: Letzte Stelle eines Strings anwählen
 
Ok, falsche Stelle im Kopf gehabt: Bei einem leerem String gibt Delphi-Referenz durchsuchenAnsiLastChar() einen NIL Pointer zurück und dessen Dereferenzierung zum Vergleich des letzten Chars raucht dann mit einer AV ab.

Wäre es so wie ich es zuvor beschrieben habe, dann müsste meine XMLLib nur noch abrauchen...

Informatik-LK 13. Feb 2008 20:51

Re: Letzte Stelle eines Strings anwählen
 
Wow, da habe ich wohl eine rege Diskussion aufleben lassen.
Naja, bei meiner Syntaxprüfung klappt jetzt alles wunderbar bis auf die Überprüfung des vorletzten Zeichens des Strings. Wie kann ich das wieder anwählen?
Wenn ich
Delphi-Quellcode:
Memo1.Text[Length(Memo1.Text)-1];
schreibe, kriege ich eine Fehlermeldung wegen eines Operandentyps. Ich hoffe, ihr habt erneut eine Antwort für mich. :-D

mkinzler 13. Feb 2008 20:56

Re: Letzte Stelle eines Strings anwählen
 
Delphi-Quellcode:
s := Memo1.Text[Length(Memo1.Text)-2];

Informatik-LK 13. Feb 2008 21:07

Re: Letzte Stelle eines Strings anwählen
 
Hm, damit habe ich mein Problem noch nicht gelöst. Also es geht um eine Syntaxprüfung, wobei der eingegebene Text immer diese Form haben muss: ab <Mein Text> b. Und deswegen wollte ich eben die Bedingung schreiben, dass wenn das vorletzte Zeichen des Strings nicht die Ordnungszahl 32 (ASCII-Tabelle: Leerzeichen) hat, eine Fehlermeldung kommt.

Ich habe es auch schon mit
Delphi-Quellcode:
if not (rightstr(Memo1.Text, 2) = ' b') then
(also dass die letzten beiden Zeichen eine Lücke und ein b sind) probiert, aber dann kennt er den Bezeichner rightstr nicht...

Christian Seehase 13. Feb 2008 21:38

Re: Letzte Stelle eines Strings anwählen
 
Moin Informatik-LK,

RightStr befindet sich in der Unit StrUtils (zumindest in D7).
Die müsstest Du noch unter Uses einbinden.

Was mir aber aufgefallen ist: Du verwendest mehrfach die Eigenschaft Text von TMemo.
Zugriffe auf diese Eigenschaft sollte man möglichst vermeiden, da sie bei jedem Aufruf erst einmal aus den Lines zusammengesetzt wird. Das drückt, je nach Anzahl der Zeilen im Memo, ganz gewaltig auf die Performance.
In Deinem Anwendungsfall scheint es so, als würdest Du immer mit der letzten Zeile des Memos auskommen, also wäre doch die Abfrage

Delphi-Quellcode:
if RightStr(Memo1.Lines[Memo1.Lines.Count-1],2) = ' b' then
eine Alternative.
Voraussetzung ist hier natürlich, dass mindestens eine Zeile enthalten ist, da es sonst zu einer AV kommt.

marabu 14. Feb 2008 09:03

Re: Letzte Stelle eines Strings anwählen
 
Moin Christian,

Zitat:

Zitat von Christian Seehase
... Was mir aber aufgefallen ist: Du verwendest mehrfach die Eigenschaft Text von TMemo. Zugriffe auf diese Eigenschaft sollte man möglichst vermeiden, da sie bei jedem Aufruf erst einmal aus den Lines zusammengesetzt wird. ...

es gibt da einen kleinen, aber feinen Unterschied zu Memo.Lines.Text: Memo.Text besorgt den Text vom unterliegenden Windows Edit Control per WM_GETTEXT, während Memo.Lines.Text als VCL-Funktionalität das von dir beschriebene Aggregationsverhalten an den Tag legt.

Freundliche Grüße

Muetze1 14. Feb 2008 12:17

Re: Letzte Stelle eines Strings anwählen
 
Ich muss euch beide enttäuschen:

1. Es gibt keinen Unterschied
2. Er baut in keinem der beiden Fällen die Strings zusammen.

Delphi-Quellcode:
function TMemoStrings.GetTextStr: string;
begin
  Result := Memo.Text;
end;
Bei einem Memo wird der Text direkt vom Control gehalten und die Lines[] Eigenschaft holt die Zeilen mit den Windowsbotschaften direkt vom Control.

Delphi-Quellcode:
function TMemoStrings.Get(Index: Integer): string;
var
  Text: array[0..4095] of Char;
begin
  Word((@Text)^) := SizeOf(Text);
  SetString(Result, Text, SendMessage(Memo.Handle, EM_GETLINE, Index,
    Longint(@Text)));
end;
Der angegebene Quelltext ist (c) Copyright by Borland/CodeGear.

Bei einer ListBox würdet ihr teilweise Recht haben. Teilweise nur, weil die ListBox ihre Text Eigenschaft nicht veröffentlicht.

Sharky 14. Feb 2008 12:55

Re: Letzte Stelle eines Strings anwählen
 
Zitat:

Zitat von Muetze1
Ich muss euch beide enttäuschen:

1. Es gibt keinen Unterschied
2. Er baut in keinem der beiden Fällen die Strings zusammen.
...

Hai Thomas,

mein Delphi sagt mit bei der TMemo.Lines.Text als Getter:

Delphi-Quellcode:
function TStrings.GetTextStr: string;
var
  I, L, Size, Count: Integer;
  P: PChar;
  S, LB: string;
begin
  Count := GetCount;
  Size := 0;
  LB := LineBreak;
  for I := 0 to Count - 1 do Inc(Size, Length(Get(I)) + Length(LB));
  SetString(Result, nil, Size);
  P := Pointer(Result);
  for I := 0 to Count - 1 do
  begin
    S := Get(I);
    L := Length(S);
    if L <> 0 then
    begin
      System.Move(Pointer(S)^, P^, L);
      Inc(P, L);
    end;
    L := Length(LB);
    if L <> 0 then
    begin
      System.Move(Pointer(LB)^, P^, L);
      Inc(P, L);
    end;
  end;
end;

marabu 14. Feb 2008 13:06

Re: Letzte Stelle eines Strings anwählen
 
Hi Stephan,

Thomas hat Recht. Ich bin auch davon ausgegangen, dass es sich bei der Eigenschaft Lines um eine einfache StringList handelt, aber weit gefehlt: Es wird TMemoStrings verwendet und in dieser Klasse wird der Text tatsächlich per WM_GETTEXT besorgt.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr.
Seite 2 von 3     12 3      

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