AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PosEx gibt immer 0 ( Null ) zurück

Ein Thema von TheMiller · begonnen am 25. Mär 2009 · letzter Beitrag vom 26. Mär 2009
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

PosEx gibt immer 0 ( Null ) zurück

  Alt 25. Mär 2009, 21:28
Hallo Delphi-Freunde!

Ich möchte einen Text aus einem RichEdit auf das Vorkommen bestimmter Worte durchsuchen und diese dann rot markieren. Letzteres funktioniert.

Ich arbeite mit PosEx (das erste Mal), nachdem ich erkennen musste, dass mein geliebtes Pos immer nur das erste Vorkommen findet.

Doch PosEx gibt immer nur 0 zurück, obwohl ich den Code aus diesem Forum habe. Hier mal mein Code:

Delphi-Quellcode:
i:=0;
        while PosEx('mit', 'mit mama und mit papa fahre ich mit', i) > 0 do
        begin
          ShowMessage('gefunden');
          with (re) do
          begin
            SelStart:=i;
            SelLength:=Length('mit');
            SelAttributes.Color:=clRed;
            SelLength:=0;
          end;
          i:=PosEx('mit', 'mit mama und mit papa fahre ich mit', i)+1;
        end;
Was ist daran denn falsch? Noch nichteinmal kommen die ShowMessages...

Danke im Voraus
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 25. Mär 2009, 21:33
Hallo,

da das erste Zeichen eines Strings den Index 1 besitzt, vermute ich, dass du auch bei 1 und nicht bei 0 starten musst.

Grüße, Matze
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.341 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 25. Mär 2009, 21:35
Du suchst nicht im RichEdit sondern in deinem eigenen String 'mit mama und mit papa fahre ich mit', was soll das bringen?

// EDIT:
Ja, i muss natürlich 1 am Anfang sein, stimmt.

// EDIT2:
Wie wäre es so, so klappt es:
Delphi-Quellcode:
var
  i: Integer;
begin
  i := PosEx('mit', RichEdit1.Text, 1);
  while i > 0 do
  begin
    ShowMessage('gefunden');
    RichEdit1.SelStart := i - 1;
    RichEdit1.SelLength := Length('mit');
    RichEdit1.SelAttributes.Color := clRed;
    RichEdit1.SelLength := 0;
    i := PosEx('mit', RichEdit1.Text, i + 1);
  end;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.123 Beiträge
 
Delphi 12 Athens
 
#4

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 25. Mär 2009, 22:56
ich weiß, manchmal bin ich etwas brutal, aber wozu muß man unbedingt PosEx doppelt haben

und RichEdit1.Text vielleicht nicht ständig neu auslesen.

soll hier immer nur das aktuelle markiert werden, dann
Delphi-Quellcode:
S := RichEdit1.Text;
i := 0;
while true do
begin
  i := PosEx('mit', S, i + 1);
  if i = 0 then break;
  RichEdit1.SelStart := i - 1;
  RichEdit1.SelLength := Length('mit');
  RichEdit1.SelAttributes.Color := clRed;
  ShowMessage('gefunden');
  RichEdit1.SelAttributes.Color := clBlack;
  RichEdit1.SelLength := 0;
end;
ansonsten
Delphi-Quellcode:
S := RichEdit1.Text;
B := False;
i := 0;
while true do
begin
  i := PosEx('mit', S, i + 1);
  if i = 0 then break;
  RichEdit1.SelStart := i - 1;
  RichEdit1.SelLength := Length('mit');
  RichEdit1.SelAttributes.Color := clRed;
  B := True;
end;
if B then ShowMessage('gefunden');
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 25. Mär 2009, 23:50
Danke für eure Hilfe und Quelltexte. Es lag atsächlich an i:=0. Ist ja auch logisch.

Was den doppelten Aufruf von PosEx angeht hast du Recht. Das werde ich noch entsprechend ändern.

Danke!
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 26. Mär 2009, 05:25
Daraus lernen wir, dass man besonders vorsichtig sein muss beim PosEx
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 26. Mär 2009, 16:07
PosEx hat zumindest bis Delphi 5 durchaus mit Paramter 0 als Index funktioniert, wurde in einer späteren Delphiversion verändert.

Im zweiten Beispiel von himitsu wird i mit 1 initialisiert, muss an dieser Stelle richtig 0 sein (gesucht wird ab i + 1).

Hier noch meine (hübschere ) Variante:
Delphi-Quellcode:
function Markiere(ARichedit: TRichEdit; AText: String; AColor: TColor): Boolean;
{---}
  function FindNext(const AValue, AText: String; var AIndex: Integer): Boolean; inline;
  begin
    AIndex := PosEx(AValue, AText, AIndex);
    Result := (AIndex > 0);
  end;
{---}
var
  s: String;
  i: Integer;
begin
  Result := False;
  s := ARichEdit.Text;
  i := 1;
  while FindNext(AText, s, i) do
  begin
    ARichEdit.SelStart := i - 1;
    ARichEdit.SelLength := Length(AText);
    ARichEdit.SelAttributes.Color := AColor;
    Inc(i, Length(AText));
    Result := True;
  end;
end;

if Markiere(Richedit1, 'mit', clRed) then
  ShowMessage('gefunden');
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 26. Mär 2009, 17:11
War bei Delphi 5 dann der Index des ersten Zeichens 0 oder 1?
Oder hat PosEx einfach nur den "Anfangswert" 0 akzeptiert?
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.123 Beiträge
 
Delphi 12 Athens
 
#9

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 26. Mär 2009, 17:20
In Delphi war der 1. Zeichen-Index, bei Strings, schon immer 1.

Lag daran, daß beim 1. String-Typ, dem heute sogenannten ShortString, der Index 0 schon belegt ist (mit dem Längen-Byte)
und dieses bis jetzt, aus Kompatibilitätsgründen, so beibehalten wurde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: PosEx gibt immer 0 ( Null ) zurück

  Alt 26. Mär 2009, 18:49
Moin Zusammen,

einen kleinen Hinweis hätte ich noch.
Die Versionen von Himitsu und Blup haben den grossen Vorteil, dass sie nur einmal auf RichEdit.Text zugreifen, was einen erheblichen Performancegewinn bringen kann. Der Gewinn ist umso grösser, je mehr Daten das RichEdit enthält, da die Eigenschaft Text bei jedem Zugriff aus den Lines aufgebaut wird.
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
Antwort Antwort


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 13:34 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