AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Letzte Stelle eines Strings anwählen
Thema durchsuchen
Ansicht
Themen-Optionen

Letzte Stelle eines Strings anwählen

Ein Thema von Informatik-LK · begonnen am 13. Feb 2008 · letzter Beitrag vom 15. Feb 2008
Antwort Antwort
Seite 2 von 3     12 3      
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#11

Re: Letzte Stelle eines Strings anwählen

  Alt 13. Feb 2008, 19:22
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?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: Letzte Stelle eines Strings anwählen

  Alt 13. Feb 2008, 19:56
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...
  Mit Zitat antworten Zitat
Informatik-LK

Registriert seit: 21. Nov 2007
29 Beiträge
 
#13

Re: Letzte Stelle eines Strings anwählen

  Alt 13. Feb 2008, 21:51
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
Memo1.Text[Length(Memo1.Text)-1]; schreibe, kriege ich eine Fehlermeldung wegen eines Operandentyps. Ich hoffe, ihr habt erneut eine Antwort für mich.
Ich bin ein absoluter Delphi-Anfänger.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.862 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Letzte Stelle eines Strings anwählen

  Alt 13. Feb 2008, 21:56
s := Memo1.Text[Length(Memo1.Text)-2];
Markus Kinzler
  Mit Zitat antworten Zitat
Informatik-LK

Registriert seit: 21. Nov 2007
29 Beiträge
 
#15

Re: Letzte Stelle eines Strings anwählen

  Alt 13. Feb 2008, 22:07
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
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...
Ich bin ein absoluter Delphi-Anfänger.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.119 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Letzte Stelle eines Strings anwählen

  Alt 13. Feb 2008, 22:38
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

if RightStr(Memo1.Lines[Memo1.Lines.Count-1],2) = ' bthen eine Alternative.
Voraussetzung ist hier natürlich, dass mindestens eine Zeile enthalten ist, da es sonst zu einer AV kommt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#17

Re: Letzte Stelle eines Strings anwählen

  Alt 14. Feb 2008, 10:03
Moin Christian,

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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#18

Re: Letzte Stelle eines Strings anwählen

  Alt 14. Feb 2008, 13:17
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Letzte Stelle eines Strings anwählen

  Alt 14. Feb 2008, 13:55
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#20

Re: Letzte Stelle eines Strings anwählen

  Alt 14. Feb 2008, 14:06
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 +1. Es ist jetzt 22:49 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