Autor Beitrag
BigBen4ever
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 28.08.05 19:42 
Hallo.
Ich würde gerne in einem Memo nach einem String suchen.
Dieser String ist immer im Memo vorhanden, es geht also nicht um eine Abfrage, ob der String da ist, sondern ich möchte die Line (Zeile) angegeben haben, am besten in einem Edit Feld.

Meine kläglichen versuche:

ausblenden Delphi-Quelltext
1:
temppos:=pos('Erfahrung', memo1.lines);					


Ich habe also wie man sieht überhaupt keine Ahnung (leider) wie das gehen könnte. Wäre über sachlich Hilfe und wenn es nicht zu viel Mühe macht, auch gerne quelltext sehr dankbar

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 28.08.05 19:52 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
i:=0;
p:=pos('Erfahrung', memo1.text);
while memo1.text[p] <> #13 do begin inc(p); inc(i); end;
dec(p,i);
edit1.text := copy(memo1.text,p,i);

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 28.08.05 21:30 
Wieso nicht so?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Var
  iZeilenNr : Integer;

Begin
  For iZeilenNr :=0 to memo1.lines.count - 1 do
    If Pos ('Erfahrung',memo1.lines[iZeilenNr])<>0 then Begin
      Label1.Caption := Format ('Gefunden in Zeile %d, "%s",[iZeilenNr, memo1.lines[iZeilenNr] ]);
      break;
    End;
...
End;
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 28.08.05 21:36 
Hallo,

@retnyg
deine Procedur gibt den String plus den Rest der Zeile aus :gruebel:,
user profile iconBigBen4ever will glaube ich die Line (Zeile) haben, also auch das was davor steht.

Die Zeile ermitteln:
wenn Memo.WordWrap = False: :arrow:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var Row : Integer;
  //...
  Row := SendMessage(Memo1.Handle, EM_LINEFROMCHAR,Pos('String_X', Memo1.Text), 0);
  Edit1.text := Memo1.Lines[Row];


wenn Memo.WordWrap = True: :arrow:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var z : Integer;
//...
  for z := 0 to Memo1.Lines.Count-1 do
    if Pos('String_X', Memo1.Lines[z]) <> 0 then
      begin
      Edit1.text := Memo1.Lines[z];
      break;
      end;


Nochmal zu user profile iconretnygs Procedur, mir ist aufgefallen das bei
größeren Texten (z.B. MSHTML_TLB.pas 1,8 MB) die Procedur sehr langsam wird.
Diese Möglichkeit ist da wesentlich schneller:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var p : Integer;
    s : String;
begin
  p := Pos('String_X', Memo1.tText);
  s := Copy(memo1.text,p,Length(Memo1.Text)-p);
  Edit1.Text := Copy(s,1,Pos(#13,s)-1);


//Edit: etwas zu spät, aber passt dazu

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )


Zuletzt bearbeitet von Lannes am So 28.08.05 21:38, insgesamt 1-mal bearbeitet
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 28.08.05 21:37 
vielen dank der zweite code funktioniert, beim ersten hat er mir keine zeile ausgegeben sondern das wort an sich ..


trotzdem auch vielen lieben dank


Edit1.text := IntTostr(Row);

sollte es glaub ich heißen
dann gibt er die zeile aus, bei dem was da vorher stand, gibt er ebenfalls nur das wort aus also den string
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 28.08.05 23:54 
Hallo,
user profile iconBigBen4ever hat folgendes geschrieben:
...
Edit1.text := IntTostr(Row);

sollte es glaub ich heißen
dann gibt er die zeile aus, bei dem was da vorher stand, gibt er ebenfalls nur das wort aus also den string

Ist eher eine Frage der Begriffsdefinition :wink:
Memo1.Lines[Row];gibt dir nicht das Wort oder den String aus, sondern die Zeile (Lines), also das was Du am Anfang des Treads geschrieben hast.
IntTostr(Row);gibt Dir den Zeilen-Index der Zeile aus in dem Dein gesuchtes Wort/String gefunden wird.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Mo 29.08.05 19:09 
Hab nun leider trotzdem noch ein Problem:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button3Click(Sender: TObject);
var
g1:integer;
t,c:string;
izeilennr:integer;

begin

For iZeilenNr :=0 to memo1.lines.count - 1 do
If Pos ('Gold ',memo1.lines[iZeilenNr])<>0 then
begin
goldedit.text:=memo1.Lines[iZeilenNr];
end;
t:=goldedit.text;
g1 := pos('Gold ', t);
c:=( copy (t,g1+5,maxint-1) );
edit3.text:=c;
end;


Ich will c eigentlich als Integer Wert haben, allerdings steht im Memo folgendes:

'Gold 4291 '
also am Ende ein Leerzeichen, dieses hab ich versucht mit maxint-1 wegzukriegen, funktioniert aber nicht, also ich würde auch hier gerne wieder den Goldwert kopieren, kann mir bitte nochmal jemand helfen, komme da leider nicht weiter.

Also ähnlich wie bei dem Erfahrungsteil.

Vielen dank
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mo 29.08.05 19:44 
Hallo,

hab mal schnell was zusammengeschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var i : Integer;
    t : String;
begin
  t:=goldedit.text;
  i := StrToInt(Trim(Copy(t,Pos(' ',t)+1,maxint)));
  Showmessage(IntToStr(i));

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Mi 31.08.05 21:11 
"" ist kein gültiger integerwert, irgendwie funktioniert das nicht :(
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 31.08.05 23:20 
Hallo,

wo kommt der Fehler?
wann? bei welchem String?
wie sieht dein Code aus?

Mit Deinem hier geposteten String 'Gold 4291 ' läuft der Code auf jeden Fall ohne Fehler.
Nehme an das in goldedit.text was anderes steht, änder mal diese Zeile zum Testen:
ausblenden Delphi-Quelltext
1:
2:
//t := goldedit.text;
t := 'Gold 4291 ';


Mein Code führt folgendes aus:
- erstes Leerzeichen suchen
- ab Leerzeichen+1 bis Ende den Reststring holen
- mit Trimm das letzte, oder falls vorhanden mehrere Leerzeichen entfernen
- den String in Integer umwandeln und der Variable i zuweisen

ist jetzt zum Beispiel
'Punkte: Gold 4921 '
in Goldedit.Text enthalten,
wird vor Gold getrennt. Das Ergebnis ist dann
'Gold 4921'
und erzeugt die Fehlermeldung bei der Konvertierung in einen Integer.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Do 01.09.05 18:25 
der fehler muss bei diesem goledit.text gelegen haben, wieso ist für mich zwar nicht naxhvollziehbar aber wie folgt funktioniert es, vielen dank nochmal!!!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button3Click(Sender: TObject);
var i : Integer;
    t : String;
    izeilennr:integer;
begin
For iZeilenNr :=0 to memo1.lines.count - 1 do
If Pos ('Gold ',memo1.lines[iZeilenNr])<>0 then
begin
t:=memo1.Lines[iZeilenNr];
end;
    i := StrToInt(Trim(Copy(t,Pos(' ',t)+1,maxint)));
  Showmessage(IntToStr(i));

end;


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 02.09.05 14:52 
Hallo,
user profile iconBigBen4ever hat folgendes geschrieben:
der fehler muss bei diesem goledit.text gelegen haben, wieso ist für mich zwar nicht naxhvollziehbar aber wie folgt funktioniert es, vielen dank nochmal!!!
mögliche Fehlerursachen, entweder:
- keine Zeile mit 'Gold 1234' im Memo enthalten
- vor 'Gold 1234' ist noch ein Leerzeichen (' Gold 1234')
- hinter 'Gold 1234' befinden sich noch andere Zeichen ('Gold 1234 bla')

Kannst Du sicherstellen das die Zeile immer und entsprechend 'Gold 1234' enthalten ist?
Du solltest in deinem Code dafür noch Sicherheiten einbauen um Fehler abzufangen.

Hab Deinen Code mal etwas kommentiert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button3Click(Sender: TObject);  
var i : Integer;  
    t : String;  
    izeilennr:integer;  
begin
  
 For iZeilenNr :=0 to memo1.lines.count - 1 do
  //Pos(...) ist auch dann <>0 wenn 'Gold ' nicht
  //am Beginn der Zeile steht
  If Pos ('Gold ',memo1.lines[iZeilenNr])<>0 then  
   begin  
   t:=memo1.Lines[iZeilenNr];  
   end;
//*************
//Diese Zeilen werden immer ausgeführt,
//auch wenn keine Zeile mit 'Gold ' enthalten ist   
    i := StrToInt(Trim(Copy(t,Pos(' ',t)+1,maxint)));  
  Showmessage(IntToStr(i));  
//************* 
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Fr 02.09.05 15:49 
vielen dank für deine mühe

habe es entsprechend verbessert.

sollte jez gut laufen.

magst du vielleicht nochmal in meinen anderen thread gucken Internet->Webbrowser Seite1->Seite2 , irgendwie kann mir da keiner helfen :(
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Sa 03.09.05 22:01 
hey kannst du bitte nochmal in deinen alten webbrowser thread gucken lannes ..
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Sa 03.09.05 22:49 
Oh mist. Hab den Code ja immer mit dem vorgegebenen Wert da getestet, aber hab total vergessen, dass das auch in folgender Form vorkommt:

'Gold 12261 (45065) '

Kannst du mir vielleicht sagen wie ich den Code abändern muss damit er mir hier auch einen integer wert ausgibt. (die klammer einfach missachten)
also es geht um den wert vor der klammer
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 04.09.05 00:22 
Hallo,
user profile iconBigBen4ever hat folgendes geschrieben:
Oh mist. ..., dass das auch in folgender Form vorkommt:
'Gold 12261 (45065) '
Kannst du mir vielleicht sagen wie ich den Code abändern muss ...

:evil: wenn Du immer nur die Code-Teile zusammenkopierst, ohne das Du versuchst sie zu verstehen, dann die Hinweise:
user profile iconLannes hat folgendes geschrieben:
Hallo,
user profile iconBigBen4ever hat folgendes geschrieben:
der fehler muss bei diesem goledit.text gelegen haben, wieso ist für mich zwar nicht naxhvollziehbar aber wie folgt funktioniert es, vielen dank nochmal!!!
mögliche Fehlerursachen, entweder:
- keine Zeile mit 'Gold 1234' im Memo enthalten
- vor 'Gold 1234' ist noch ein Leerzeichen (' Gold 1234')
- hinter 'Gold 1234' befinden sich noch andere Zeichen ('Gold 1234 bla')

Kannst Du sicherstellen das die Zeile immer und entsprechend 'Gold 1234' enthalten ist?
Du solltest in deinem Code dafür noch Sicherheiten einbauen um Fehler abzufangen.

nicht durchliest bzw. beachtest wirst Du immer wieder solche Probleme bekommen.

Nun wieder zu deiner Frage: Ja, ich kann Dir sagen wie, aber ohne Code:
- Zeile mit 'Gold ' suchen (siehe diesen Tread)
- Feststellen wo Gold in der Zeile steht(siehe diesen Tread)
- RestString hinter 'Gold ' mit Copy holen (siehe diesen Tread)
- In diesem Reststring mit Pos Leerzeichen suchen (siehe diesen Tread)
- Teilstring mit Copy bis zum Leerzeichen heraustrennen (siehe diesen Tread)

Versuch das mal selbst zu programmieren, das hilft Dir glaube ich am meisten.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 04.09.05 00:43 
Ok du hast recht ...aber ich versteh diesen Copy-Befehl einfach nicht...

(Trim(Copy(t,Pos(' ',t)+1,maxint)));

Du hast mir erklärt wofür Trim steht. Nachvollziehbar.
Dann kommt copy, ok er kopiert...

Angabe von t für den String von dem wir kopieren wollen, soweit nachvollziehbar.
Dann die Position von der wir anfangen wollen zu kopieren aus dem String t + 1 weil wir ja kein Leerzeichen vor der Zahl haben wollen.

und dann hinter dem Komma die Position bis zu der wir kopieren wollen, das müsste ja dann:

Pos(' (',t) und da wir ' (' nicht haben wollen, -2 aber das funktioniert nicht, weißt du und da liegt mein Problem, was ist daran falsch, ich möchte es ja versuchen zu verstehen, aber ich erkenn da die logik einfach nicht.
BigBen4ever Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 04.09.05 00:52 
Ok ich glaub das problem lag dabei dass ich das in einer neuen variable machen musste:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
t:string;
i:string;
g,h,j:string;
begin
t:='Gold 12261 (45065) ';
i:=(Trim(Copy(t,Pos(' ',t)+1,maxint)));
g:=copy(i,1,Pos('(',i)-2);
edit1.text:=g;
end;


Ist vielleicht nicht das schönste, aber jez funktioniert es.

Dein hinweis mit den möglichen fehlern war übrigens ne gute sache und was ich sagte dass ich dies berücksichtigt hab war auch nicht nur daher gesagt:

- keine Zeile mit 'Gold 1234' im Memo enthalten
- vor 'Gold 1234' ist noch ein Leerzeichen (' Gold 1234')
- hinter 'Gold 1234' befinden sich noch andere Zeichen ('Gold 1234 bla')

Ich bekam so mit meinem code echt fehlermeldungen
'' kein gültiger Integerwert, den es war keine Zeile mit 'Gold ...' enthalten
habe dann einfach eine if abfrage gemacht:

goldlabel.caption:=inttostr(pos('Gold ',memo1.text));
if strtoint(goldlabel.caption) <> 0 then
begin
...
end;

vor Gold steht definitiv nichts, also brauchte ich den fall nicht zu berücksichtigen ..und ich dachte hinter Gold auch nicht, deswegen hatte ich da auch nichts weitergemacht, aber naja ..jez sollten wirklich alle fehler ausgemergelt sein..

VIELEN VIELEN DANK!

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 04.09.05 08:07 
Und etwas vereinfacht sieht das dann so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var
  t, i: String;
begin
  t := 'Gold 12261 (45065) ';
  i := Trim(Copy(t, Pos(' ', t) + 1, Pos('(', t) - 2));
  Edit1.Text := i;
end;


Das hier musst du allerdings auch nicht so Kompliziert machen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  GoldLabel.Caption := IntToStr(Pos('Gold ', Memo1.Text));
  if StrToInt(GoldLabel.Caption) <> 0 then
  begin
    //...
  end;

->
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if Pos('Gold ', Memo1.Text) > 0 then
  begin
    //...
  end;


EDIT: '(' -> ')'

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)


Zuletzt bearbeitet von GTA-Place am So 04.09.05 17:25, insgesamt 1-mal bearbeitet
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 04.09.05 14:27 
Hallo

@GTA-Place
dein Code prüft auf ')':
  i := Trim(Copy(t, Pos(' ', t) + 1, Pos(')', t) - 2));und gibt daher '12261 (45065)' aus.

user profile iconBigBen4ever möchte '12261' als Ergebnis haben :arrow:

user profile iconBigBen4ever hat folgendes geschrieben:
... auch in folgender Form vorkommt:
'Gold 12261 (45065) '
Kannst du mir vielleicht sagen wie ich den Code abändern muss damit er mir hier auch einen integer wert ausgibt. (die klammer einfach missachten)
also es geht um den wert vor der klammer

und genau das bewirkt sein zuletzt geposteter Code.
Allerdings könnte er darin noch Trim weglassen,
ist wegen Codeumstellungen nicht mehr erforderlich.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )