Autor Beitrag
noo.bee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: So 13.06.10 16:45 
folgende überlegung habe ich:

ich habe in einem memo knapp 1000 zeilen mit zahlen belegt. gegeben werden die variablen a - f durch benutzereingaben in ein edit-feld.
jetzt soll jede memozeile geprüft werden, wie oft in ihr der inhalt des edit-feldes vorkommt

bsp:
memo.lines:
1 4 6 2 8 7 5
2 4 5 7 9
1 3 5

inhalt der edit.felder
feld1 "3"
feld2 "7"
feld3 "1"

alle edit-felder werden nun mit jeder memozeile nacheinander abgeglichen. das ergebnis wäre also:
1. memo.line: 2 (treffer)
2. memo.line: 1 (treffer)
3. memo.line: 2 (treffer)

meine for-in schleife würde dann so aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm2.Button1Click(Sender: TObject);
var x1 : Integer;
begin

  for (a=strtoint(memo1.lines.text)) or (b=strtoint(memo1.lines.text))  or (c=strtoint(memo1.lines.text)) in Memo1.Lines do begin
  inc(x1);

end;


warum bekomme ich folgende fehler ?
erwartet: Bezeichner, aber ( erhalten
erwartet: END, aber DO erhalten
erwartet: ., aber ; erhalten <-- das verschwindet, sobald ich das "end;" lösche, welches ich doch aber bei jedem "begin" brauche, oder ?


Zuletzt bearbeitet von noo.bee am So 13.06.10 18:52, insgesamt 1-mal bearbeitet
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 13.06.10 16:55 
Hi
ausblenden Delphi-Quelltext
1:
2:
3:
4:
for (a:=strtoint(memo1.lines.text)) or (b:=strtoint(memo1.lines.text))  or (c:=strtoint(memo1.lines.text)) in Memo1.Lines do 
begin
 inc(x1)
end;


erst mal so gesehen :wink:
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!

Für diesen Beitrag haben gedankt: noo.bee
noo.bee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: So 13.06.10 17:04 
denk ich grad falsch ? wollte nix zuweisen sonder vergleichen, deshalb nur "=" statt ":="
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 13.06.10 17:18 
Ich glaube vergleichen macht man mit if
In einer For schleife kanst du links nur was zuweisen also
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
For a := 1 to 100 do
begin
  if (a = 50or (a = 70then exit;
 
end;

Was anderes habe ich bis jetzt noch nicht gesehen
Ansonsten musst Du ne While schleife nehmen. Dort kanst Du auch vergleichen!
oder
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if (a=strtoint(memo1.lines.text)) or (b=strtoint(memo1.lines.text))  or (c=strtoint(memo1.lines.text)) in Memo1.Lines then
begin
  inc(x1);
end;


Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!

Für diesen Beitrag haben gedankt: noo.bee
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.06.10 18:20 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
In einer For schleife kanst du links nur was zuweisen also
Falsch, seit den Spracherweiterungen mit Turbo Delphi / Delphi 2006 geht auch das:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  c: Char;
  MyString: string;
begin
  MyString := 'abc';
  for c in MyString do
    if c in ['1''3'then
      ...
Die Kombination wie oben verstehe ich allerdings nicht, man kann so "nur" alle Elemente einer Menge durchgehen, mehr nicht.

Für diesen Beitrag haben gedankt: noo.bee
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 13.06.10 18:34 
Sorry @user profile iconjaenicke Ich bezog dies auf
ausblenden Delphi-Quelltext
1:
for (a=...) or (b=...)					

Hab mich wieder mal blöd ausgedrückt :oops:
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!

Für diesen Beitrag haben gedankt: noo.bee
noo.bee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: So 13.06.10 18:50 
Zitat:
man kann so "nur" alle Elemente einer Menge durchgehen, mehr nicht.

wie lässt sich denn jede zeile durchsuchen und von jeder zeile das ergebnis ausgeben ? oder kann ich memo nur komplett durchsuchen und die gesamtsumme ausgeben lassen ? das wäre natürlich mächtig blöd :/
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.06.10 18:55 
Die Frage ist vor allem, ob es grundsätzlich einstellige Zahlen sind oder auch mehrstellige vorkommen können.

Denn wenn es nur einstellig sein kann, dann reicht es zeichenweise zu arbeiten.

Für diesen Beitrag haben gedankt: noo.bee
noo.bee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: So 13.06.10 19:19 
mhhh, es können zahlen von 1-99 vorkommen... also leider auch zweistellig
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.06.10 19:55 
Dann würde ich bei der geringen Anzahl an Zeilen einfach den trivialen Weg ohne Optimierung gehen und in jeder Zeile mit Pos nach jeder Zahl suchen.

Dabei muss auch beachtet werden, dass in mehrstelligen Zahlen nicht Teile als eine Zahl erkannt werden. Dafür können zum Beispiel die Leerzeichen einbezogen werden.

Für diesen Beitrag haben gedankt: noo.bee
noo.bee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Mo 14.06.10 17:27 
ist POS nicht zur berechnung der position eines strings da ? versteh da nicht ganz, wie mir das bei meinem prob helfen soll :shock:
Tropby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 71
Erhaltene Danke: 4

Vista, Win XP, Win 89
Turbo Delphi Ex.
BeitragVerfasst: Mo 14.06.10 20:29 
Du kannst doch so suchen, ob die Zeichen (Zahlen) in der Zeile vorkommen. Wenn Pos größer 0 ist dann kommt er in der Zeile vor.

ausblenden Delphi-Quelltext
1:
2:
3:
for i := 0 to Memo.Lines.Count - 1 do
  if(pos('1', Memo.Lines[I]) > 0)then
    inc(x);


Wenn jetzt eine Zahl aber öfters vorkommen kann in einer Zeile dann musst du das auch noch beachten.

_________________
Tropby

Für diesen Beitrag haben gedankt: noo.bee
noo.bee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Mo 14.06.10 21:02 
also in den zeilen kommen keine zahlen doppelt vor. aber muss ich jetzt für a, b, c, d, e und f jedesmal

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var a, b, c, d, e, f, x1 : Integer;
var I: array[1..1000of integer;
begin
for a := 0 to Memo1.Lines.Count - 1 do
  if(pos('1', Memo1.Lines[I]) > 0)then
    inc(x1);
end;
schreiben ?
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Mo 14.06.10 21:29 
Meine Damen und Herren,
nach langer Zeit mal wieder ein (hoffentlich) sinnvoller Post von mir.

Du deklarierst dir ein Array of Integer.
Dieses ist dynamisch und entspricht der Länge der Zeilen deines Memos.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
var meineTreffer: array of Integer;
   def_a, def_b, def_c, def_d, def_e, def_f: String;
   Treffer: Integer; //Ändert sich von Zeile zu Zeile;
   Zeile: String;
   i: Integer; //i = Zeilenläufer
begin;
 //Hier setzen wir die Länge des Arrays ersteinmal auf 0
 setlength(meineTreffer, 0);
 
 //Nun auf die Anzahl der Zeilen des Memos
 setlength(meineTreffer, meinMemo.Lines.Count);

 //Überschreiben der Trefferdefinitionen
 def_a:= edit_a.text;
 def_b:= edit_b.text;
 def_c:= edit_c.text;
 //...
 def_f:= edit_f.text;

 //Treffer auf 0 setzen
 Treffer:= 0;

 //Jetzt durchlaufen wir die Zeilen
 for i:= 0 to meinMemo.Lines.Count-1 do
 begin
  //Wir überschreiben (unnötigerweise) die MemoZeile in die Variable Zeile
  Zeile:= meinMemo.Lines[i];
 
  //Hier könnte noch eine Prüfung rein, ob die Länge der Zeile zulässig (> 0) ist
  //Machen wir doch direkt
  if length(Zeile) <= 0 then
  begin
   //meineTreffer schreiben mit 0, da Zeile leer ist und somit bedeutungslos
   meineTreffer[i]:= 0;
   continue; //und die nächste Zeile ranholen, ohne nachfolgenden Code auszuführen
  end;
 
  //Und nun korrekterweise mit pos() abfragen
  if pos(def_a, Zeile) then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  if pos(def_b, Zeile) then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  //...
  if pos(def_f, Zeile) then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);


  //Überschreiben der Treffer in die Trefferliste
  meineTreffer[i]:= Treffer;
  
  Treffer:= 0;
 end;

 //Glückwunsch!
 //An dieser Position wurden alle deine Zeilen abgearbeitet und auf Treffer überprüft.

 //Zur Ausgabe:
 //Einfach über deine Trefferliste meineTreffer eine Schleifen laufen lassen und den Wert ausgeben, der dahintersteht.
 for i:= low(meineTreffer) to high(meineTreffer) do
 begin
  //Memo leeren
  meinMemo.lines.clear;
  //Ausgabe
  meinMemo.lines.add('Zeile ' + inttostr(i+1) + ': ' + IntToStr(meineTreffer[i]) + ' Treffer');

  //Warum i+1 bei der Zeile?
  //Nun, du beginnst die Zeilen bei 1 zu zählen, Delphi bei 0 ;-)
 end;
end;


Geschafft. Ausm Kopf. Hoffentlich funktionstüchtig.

Guten Abend.
Stefan

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.

Für diesen Beitrag haben gedankt: noo.bee
noo.bee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Mi 16.06.10 18:22 
huu, erstmal danke für die hilfe. habs mal durchgeackert. sieht soweit gut aus ausser dass
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//Und nun korrekterweise mit pos() abfragen
  if <span style="color: orange">pos(def_a, Zeile)</span> then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  if <span style="color: orange">pos(def_b, Zeile)</span> then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  //...
  if <span style="color: orange">pos(def_f, Zeile)</span> then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

alle nicht boolean sind
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mi 16.06.10 18:27 
pos() gibt nur den Index des gesuchten Zeichens im String zurück. Du könntest schreiben if pos(...) > 0 then, denn wenn das Zeichen nicht vorkommt, ist pos() null.

Für diesen Beitrag haben gedankt: noo.bee
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Mi 16.06.10 18:27 
user profile iconnoo.bee hat folgendes geschrieben Zum zitierten Posting springen:
huu, erstmal danke für die hilfe. habs mal durchgeackert. sieht soweit gut aus ausser dass
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//Und nun korrekterweise mit pos() abfragen
  if <span style="color: orange">pos(def_a, Zeile)</span> then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  if <span style="color: orange">pos(def_b, Zeile)</span> then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  //...
  if <span style="color: orange">pos(def_f, Zeile)</span> then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

alle nicht boolean sind


Mea maxima culpa!

Natürlich ist die Rückgabe von pos() ein Integer.
Somit musst du prüfen if pos(def_a, zeile) > 0 then

Aber durch Lesen der Hilfe... :P

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.

Für diesen Beitrag haben gedankt: noo.bee
noo.bee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Mi 16.06.10 20:54 
ja passt ;) habs durch probieren auch hinbekommen mit  > 0. aber leider spuckt er mir immer nur die treffer der letzten zeile aus :(
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Mi 16.06.10 20:59 
Magst du mal bitte deinen Code posten? ;-)

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.

Für diesen Beitrag haben gedankt: noo.bee
noo.bee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Mi 16.06.10 21:10 
ist eig. dein funktionierender code. hab nur sachen geändert wie die richtigen edits oder memos und sowas

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
procedure TForm2.Button1Click(Sender: TObject);
var meineTreffer: array of Integer;
   def_a, def_b, def_c, def_d, def_e, def_f: String;
   Treffer: Integer; //Ändert sich von Zeile zu Zeile;
   Zeile: String;
   i: Integer; //i = Zeilenläufer
begin
 //Hier setzen wir die Länge des Arrays ersteinmal auf 0
 setlength(meineTreffer, 0);

 //Nun auf die Anzahl der Zeilen des Memos
 setlength(meineTreffer, Memo1.Lines.Count);

 //Überschreiben der Trefferdefinitionen
 def_a:= edit1.text;
 def_b:= edit2.text;
 def_c:= edit3.text;
 def_d:= edit4.text;
 def_e:= edit5.text;
 def_f:= edit6.text;

 //Treffer auf 0 setzen
 Treffer:= 0;

 //Jetzt durchlaufen wir die Zeilen
 for i:= 0 to Memo1.Lines.Count-1 do
 begin
  //Wir überschreiben (unnötigerweise) die MemoZeile in die Variable Zeile
  Zeile:= Memo1.Lines[i];

  //Hier könnte noch eine Prüfung rein, ob die Länge der Zeile zulässig (> 0) ist
  //Machen wir doch direkt
  if length(Zeile) <= 0 then
  begin
   //meineTreffer schreiben mit 0, da Zeile leer ist und somit bedeutungslos
   meineTreffer[i]:= 0;
   continue; //und die nächste Zeile ranholen, ohne nachfolgenden Code auszuführen
  end;

  //Und nun korrekterweise mit pos() abfragen
  if pos(def_a, Zeile) > 0 then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  if pos(def_b, Zeile) > 0 then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  if pos(def_c, Zeile) > 0 then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  if pos(def_d, Zeile) > 0 then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  if pos(def_e, Zeile) > 0 then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);

  if pos(def_f, Zeile) > 0 then
   //Kommt vor -> Treffer erhöhen
   inc(Treffer);


  //Überschreiben der Treffer in die Trefferliste
  meineTreffer[i]:= Treffer;

  Treffer:= 0;
 end;

 //Glückwunsch!
 //An dieser Position wurden alle deine Zeilen abgearbeitet und auf Treffer überprüft.

 //Zur Ausgabe:
 //Einfach über deine Trefferliste meineTreffer eine Schleifen laufen lassen und den Wert ausgeben, der dahintersteht.
 for i:= low(meineTreffer) to high(meineTreffer) do
 begin
  //Memo leeren
  Memo2.lines.clear;
  //Ausgabe
  Memo2.lines.add('Zeile ' + inttostr(i+1) + ': ' + IntToStr(meineTreffer[i]) + ' Treffer');

  //Warum i+1 bei der Zeile?
  //Nun, du beginnst die Zeilen bei 1 zu zählen, Delphi bei 0 ;-)
 end;
end;
end.