Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit feld (https://www.delphipraxis.net/166551-suche-bestimmten-wert-memo-und-zeige-mir-den-neben-stehenden-wert-im-edit-feld.html)

klaus9 17. Feb 2012 21:15

Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit feld
 
Hallo,

ich habe ein Memo Feld, hier möchte ich gerne nach dem Text

z.B. YXZ suchen und den neben stehenden Text anzeigen lassen in einem Edit Feld.

Memo.text

.
bla blub
bla bla
bla YXZ 1234 blub
bla
.


Nun soll im Edit1.text Feld dann angezeigt werden

1234

Wie kann ich dieses hinbekommen ?

Bzw. wie kann ich sagen er soll mir bei einem gefundenem Wert z.B. "YXZ"

den Wert darüber, oder auch darunter oder da neben oder davor anzeigen.

Hat jemand eine Idee ?

Vielen Dank

himitsu 17. Feb 2012 21:38

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Ein Memo kennt .Text oder auch .Lines (wenn man Zeilenweise auswerten will).
Dort kann man mit Pos drine suchen (bei Lines mit einer Schleife über alle Zeilen).
Hat man was mit Delphi-Referenz durchsuchenPos gefunden, dann kann man über Copy und bissl Mathematik sich dort was rauskopieren.

Eventuell mit einem weiteren Pos/PosEx oder einer weiteren Schleife über die Zeichen weitere Stellen suchen (wie z.B. das nächste Leerzeichen) ... zwischen dem gefundenem Wort und dem nächsten gefundenen Zeichen ist dann das gewünschte nächste Wort.

Popov 17. Feb 2012 21:43

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Da gibt es einige Wege, wobei, was verstehst du unter Text darüber?

Am einfachsten wird es sein über for to alle Lines des Memo von Anfang bis Ende durchzugehen und in jeder Lines Zeile mit Pos(Wort, Lines[i]) nach dem Wort suchen. So findest du schon mal die Zeile und Position innerhalb der Zeile. Jetzt mit vier Funktionen das Wort links, rechts, oben oder unten ermitteln.

Edit:
Wobei ich dir noch die Funktion LastDelimiter empfehlen könnte für die Rückwertssuche, d. h. hast du die Position gefunden, alles bis zu der Position kopieren, trimen und dann mit LastDelimiter das letzte Leerzeichen finden. Schon hast du das vorherige Wort.

Furtbichler 18. Feb 2012 07:51

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
"Daneben" ist einfach, aber "darüber" bzw. "darunter" nicht trivial, denn was genau über einem Wort ist, ist vom Zeichensatz abhängig. Beispiel
Code:
iii iiii iiii iiii iiii iiii iiii iiii
mmm mmmm mmmm mmmm mmmm mmmm mmmx mmmm
iii iiii iiii iiii iiii iiii iiii iiii
iii iiii iiii iiii iiii iiii iiii iiii
mmm mmmm mmmm mmmm mmmm mmmm mmmx mmmm
iii iiii iiii iiii iiii iiii iiii iiii

klaus9 18. Feb 2012 08:31

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Hi,

vielen Dank, für die Tipps.

Hat jemand vielleicht mal ein beispiel wie ich das über die Positionen ermitteln könnte ? Die variante von Popov klingt gut.

Furtbichler 18. Feb 2012 09:29

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Na, komm. Ein wenig googeln und Eigeninitiative ist doch nicht zuviel verlangt.

PhilmacFLy 18. Feb 2012 10:59

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Man könnte natürlich auch mit ein bisschen Automaten Theorie daran gehen so z.B:

Delphi-Quellcode:
for i:=1 to length(memo1.Text) do
 begin
  if Memo1.Lines.Text[i] = X then
    if Memo1.Lines.Text[i+1] = Y then
      if Memo1.Lines.Text[i+2] = Z then
        begin
          ...
        end;
 end;
dann hast du jedenfalls die Position und kannst dann ja schauen was davor und danach kommt.
Für Variable Text längen müsste man das ganze dann natürlich rekursiv aufbauen

Furtbichler 18. Feb 2012 11:56

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Nunja, dann müsste man den Code für jeden Suchtext umschreiben

PhilmacFLy 18. Feb 2012 12:09

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
nein wieso du gibst zu dem Code noch ein array of char mit wo das wort drin steht

klaus9 18. Feb 2012 15:46

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
hi,

danke für die infos, also der Code funktioniert schonmal sehr gut

Delphi-Quellcode:
for i:=1 to length(memo1.Text) do
 begin
  if Memo1.Lines.Text[i] = X then
    if Memo1.Lines.Text[i+1] = Y then
      if Memo1.Lines.Text[i+2] = Z then
        begin
          ...
        end;
 end;
Aber wie kann ich jetzt sagen er möchte mir nach dem fund des wortes "XYZ" dann alle zeichen z.B. nach dem Wort kopieren und in Edit1.text einfügen

Furtbichler 18. Feb 2012 18:33

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Zitat:

Zitat von PhilmacFLy (Beitrag 1151709)
nein wieso du gibst zu dem Code noch ein array of char mit wo das wort drin steht

Na ja, und wenn das Wort 4 Zeichen lang ist? Oder nur 2?

Sir Rufo 18. Feb 2012 20:29

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Die Funktionen die du dafür benötigst, sind Delphi-Referenz durchsuchenPos und Delphi-Referenz durchsuchenCopy

klaus9 18. Feb 2012 20:46

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Hi habe jetzt folgendes hinbekommen..

Delphi-Quellcode:

procedure TForm1.Button6Click(Sender: TObject);
var
  s, s2: string;
  Pos1, Pos2, Pos3: Integer;
begin
  s := memo1.Text;
  Pos1 := Pos('test', s); // erstes Komma
  Pos2 := PosEx('GesLänge/(A):', s, Pos1+1); // zweites Komma
  Pos3 := PosEx('GesLänge/(B):', s, Pos2+1); // drittes Komma
  s2 := Copy(s, Pos2+14, Pos3 - Pos2 -15); // Text zwischen 2. und 3. Komma
  Edit2.text := (Trim(s2)); // Leerzeichen entfernen und ausgeben

 end;
Das funktioniert schonmal, er sucht nach dem Wort "test" und nimmt dann den wert zwischen GesLänge(A) und GesLänge/(B)

wie kann ich nun noch über Pos die zeilen / reihen bestimmen ?

also z.B.

pos1 := Pos('test'), s;
Pos2 := PosEx( ?????, s, Pos1+1); // statt ????? z.B. unter gefundenem wort "test" eine reihe darunter.

Memo feld aufbau

test
hallo katze

Reihe 1 = test
Reihe 2 = hallo katze

nun würde ich gerne wissen wie ich auf die reihe zwei per pos komme..


vielen Dank nochmal für die ganzen tipps..

PhilmacFLy 18. Feb 2012 21:03

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Zitat:

Zitat von Furtbichler (Beitrag 1151756)
Zitat:

Zitat von PhilmacFLy (Beitrag 1151709)
nein wieso du gibst zu dem Code noch ein array of char mit wo das wort drin steht

Na ja, und wenn das Wort 4 Zeichen lang ist? Oder nur 2?

Delphi-Quellcode:
function textsuch(charrarr: Array of Char; length, count, pos: integer): Integer;
begin
   if count = length then
        begin
          Result := pos - count;
     exit;
        end;
   if Memo1.Lines.Text[pos] = charrarr[count] then
     Result := textsuch(charrarr, length, count+1, pos+1)
   else
     Result := -1;
end;

klaus9 18. Feb 2012 21:40

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
danke für die funktion, kannst du mir kurz sagen wie ich diese ansteuere ?

Furtbichler 18. Feb 2012 21:55

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
@PhilmacFly: Toll. Wieso postest Du eigentlich immer neuen Code, anstatt einfach mal eine allgemeingültige Lösung?
Dein nächster Versuch sollte alle Vorkommnisse in einer Zeile finden. Und verwende garantiert keine vorgefertigten Lösungen, wie z.B. 'PosEx'. Das wäre ja ... naheliegend?

Sir Rufo 18. Feb 2012 22:03

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Zitat:

Zitat von Furtbichler (Beitrag 1151790)
@PhilmacFly: Toll. Wieso postest Du eigentlich immer neuen Code, anstatt einfach mal eine allgemeingültige Lösung?
Dein nächster Versuch sollte alle Vorkommnisse in einer Zeile finden. Und verwende garantiert keine vorgefertigten Lösungen, wie z.B. 'PosEx'. Das wäre ja ... naheliegend?

Wer macht denn so was ...?

Echte Kerle programmieren alles selber ... ich selber wollte 2 Strings in einer Text-Datei speichern und nun bin ich seit ca. 2.5 Jahren dabei ein eigenes Dateisystem zu schreiben. Sieht gut aus, das Speichern geht, nur mit dem Auslesen hapert es noch :mrgreen:

Popov 18. Feb 2012 22:17

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Zitat:

Zitat von klaus9 (Beitrag 1151774)
Hi habe jetzt folgendes hinbekommen..

Weiter oben wurde zwar "Text" erwähnt, aber Text ist nur ein langer String. Man kann zwar auch hier mit gewissen Aufwand die vorherige Zeile finden, aber warum nicht gleich mit Lines[x] arbeiten?

Aber warum den ganzen Tag darüber reden wie man es machen könne, warum nicht in 10 Minuten es Coden

Delphi-Quellcode:
function WortAnPos(s: String; p: Integer): String;
var
  i: Integer;
begin
  if Pos(' ', s) < p then
  begin
    for i := p downto 1 do
      if s[i] = ' ' then
      begin
        Delete(s, 1, i);
        Break;
      end;
  end;

  Result := s;
  if Pos(' ', Result) > 0 then
    Delete(Result, Pos(' ', Result), maxint);
end;

function _darunter(list: TStrings; Index, p: Integer): String;
var
  s: String;
begin
  if Index = 0 then Exit;
  Result := WortAnPos(list[Index - 1], p);
end;

function _darueber(list: TStrings; Index, p: Integer): String;
begin
  if Index = list.Count - 1 then Exit;
  Result := WortAnPos(list[Index + 1], p);
end;

function _links(s: String; p: Integer): String;
begin
  Delete(s, p, Maxint);
  if LastDelimiter(' ', s) > 0 then
      Delete(s, LastDelimiter(' ', s), Maxint);
  if LastDelimiter(' ', s) > 0 then
    Result := Trim(Copy(s, LastDelimiter(' ', s), Maxint))
  else
    Result := Trim(s);
end;

function _rechts(s, substr: String; p: Integer): String;
begin
  Delete(s, 1, p + length(substr));

  if Pos(' ', s) > 0 then
  begin
    Delete(s, 1, Pos(' ', s));
    Result := Trim(Copy(s, 1, Pos(' ', s)))
  end
  else
    Result := Trim(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  gesucht = 'bb';
var
  i, p: Integer;
  s: String;
begin
  Memo1.Clear;
  Memo1.Lines.Add('1111 2222 3333 4444');
  Memo1.Lines.Add('aaaa bbbb cccc dddd');
  Memo1.Lines.Add('5555 6666 7777 8888');

  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    s := Memo1.Lines[i];
    p := Pos(gesucht, s);
    if p > 0 then
    begin
      ShowMessage('Links: ' + _links(s, p));
      ShowMessage('Rechts: ' + _rechts(s, gesucht, p));
      ShowMessage('Draunter: ' + _darunter(Memo1.Lines, i, p));
      ShowMessage('Draunter: ' + _darueber(Memo1.Lines, i, p));
    end;
  end;
end;

Popov 18. Feb 2012 22:22

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
[QUOTE=Sir Rufo;1151793]
Zitat:

Zitat von Furtbichler (Beitrag 1151790)
Echte Kerle programmieren alles selber ...

Ich bin ganz ordentlich Delphi 3 geschädigt, da ich mehr oder weniger damit aus gegebenem Anlass arbeiten sollte. Deshalb bin ich ein Purist. Und da Delphi 3 so was wie PosEx oder ReplaceStr nicht kennt und ich es nie geschafft habe eine ordentliche Unit mit den Erweiterungen mir anzulegen, verzichte ich auch heute noch auf die Funktionen und proge es alleine.

klaus9 18. Feb 2012 22:29

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
vielen Dank :) das hilft mir schon super weiter ..

dankeschön

himitsu 18. Feb 2012 22:30

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Man mag es nicht glauben ... TEdit ist am Ende auch nur eine gekapselte Windows-Komponente.
Diese ist mehrzeilig und es gibt gewisse Schnittstellen.

Sogar Eine, die man fragen kann, in welcher Zeile sich ein bestimmtes Zeichen befindet.
MSDN-Library durchsuchenEM_POSFROMCHAR
Dazu gibt es sogar noch Befehle zum Suchen usw.

Aber man kann auch einfach, so es wie gleich am Anfang von irgendwem schonmal genannt wurde,
jede Zeile einzeln durchsuchen und schon hat man automatisch auch die Zeile, worin man etwas gefunden hatte. :roll:

Popov 18. Feb 2012 22:41

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Zitat:

Zitat von himitsu (Beitrag 1151799)
Aber man kann auch einfach, so es wie gleich am Anfang von irgendwem schonmal genannt wurde,
jede Zeile einzeln durchsuchen und schon hat man automatisch auch die Zeile, worin man etwas gefunden hatte. :roll:

Auch wenn das etwas sarkastisch gemeint ist, es gibt die Methode mit den Hausmitteln und die etwas elegante aber wissensintensivere Methode über Messages. Sir Rufo würde sagen: warum kompliziert, wenn es auch einfach geht. mit for to und pos mag zwar nicht elegant sein, aber das ist gutes Pascal. Und dagegen ist nichts auszusetzten. Ich habe gerade vor Wochen einen Editor benötigt und brauchte den halben Tag um mir alle Möglichkeiten (sprich Positionen über Messages ermitteln) anzueignen. Nur wozu einen halben Tag opfern wenn man es in 30 Sekunden auch mit Hausmitteln hinkriegt?

himitsu 18. Feb 2012 23:19

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Zitat:

Zitat von himitsu (Beitrag 1151799)
Aber man kann auch einfach, so es wie gleich am Anfang von irgendwem schonmal genannt wurde, ...

Hab nichts anderes behauptet, siehe Antwort 1 / Beitrag #2, Zeile 2. :angle2:
Aber dem TE scheint diese Lösung wohl nicht zu gefallen.

PhilmacFLy 19. Feb 2012 10:25

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Zitat:

Zitat von Furtbichler (Beitrag 1151790)
@PhilmacFly: Toll. Wieso postest Du eigentlich immer neuen Code, anstatt einfach mal eine allgemeingültige Lösung?
Dein nächster Versuch sollte alle Vorkommnisse in einer Zeile finden. Und verwende garantiert keine vorgefertigten Lösungen, wie z.B. 'PosEx'. Das wäre ja ... naheliegend?

Weil die ja schon genannt wurden und ich nur eine alternativ aufzeige. Außerdem werd ich hier nicht den ganzen Code vorkauen ich wollte dir mit meinem Code Schnipsel nur zeigen das meine Methode auch funktionieren würde. Kein Grund gleich so abzugehen.

Gustav.R 19. Feb 2012 13:05

AW: Suche bestimmten Wert in Memo und zeige mir den neben stehenden Wert an im Edit f
 
Inzwischen gehen hier fast alle ab, bis auf Klaus9, der den Sourcecode auf seine Frage fast schon ausprogrammiert geliefert bekommt :evil:

GG


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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-2025 by Thomas Breitkreuz