Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Memo Delete


Thomek - So 19.10.03 23:10
Titel: Memo Delete
Hiho erstmal ;)

Ich bin niegelnagel neu im Programmgeschäft und habe mich für Delphi entschieden! Ich hoffe das richtige getroffen zu haben. Auch das richtige Forum hier :) und richtige Abteilung.

Also zu meinem Problem:

Ich habe mich entschlossen erstmal ein Programm zu schreiben, wo man in ein "memo" einen text kopiert und er da bestimmte zahlen rausnimmt und dann daen durchschnitt ausrechnet.

Folgendes wird in das Memo Feld eingegeben:

Quelltext
1:
2:
3:
4:
1     219 : 1 Bautram 430 3.336 15.015.415 
2     219 : 2 DZVO * 348 3.043 16.103.996 
3     219 : 3 Lancelot3009 898 470 27.026.697 
... bis 48

Ich habe im Quakenet nach gefragt und mir wurde gesagt ich soll das per Delete machen. Nun habe ich folgendes:

Delphi-Quelltext
1:
2:
3:
test:=memo1.Lines[0];
Delete(test,pos(test,' '),length(test));
showmessage(test);

Also das er erstmal aus dem Memo Zeile 1 alles bis zum ersten Leerzeichen wegnimmt ( so sollte es sein ) leider geht das net. Und das ist auch mein Problem, wollte das dann so oft repeaten, bis er bei der letzten Zahl ist.

Eine andere Fragen:

1. Man sieht oben bei den Sachen die man eingibt ist manchmal hinter dem Text (dem Nickname) ein * das ist aber auch net bei jedem. Gibt es ne Funktion oder eine Möglichkeit um erstmal alle * rauszufiltern? Und vielleicht alle Punkte ".", da diese nachher ja beim Rechnen nerven.

Danke schonmal für die Hilfe!

Thomek

Moderiert von user profile iconTino: Code- und Delphi-Tags hinzugefügt.


inselberg - Mo 20.10.03 13:42


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function extractnumber(str:string;position:byte):real;
var sub : string;
    ctrl: integer;
    r   : real;
begin
 r:=0;
 while ( pos(' ',str) > 0 ) And (position > 0 ) do
 begin
  sub:=copy(str,1,pos(' ',str)-1);
  val(sub,r,ctrl);
  if ctrl = 0 then dec(position);
  str:=copy(str,pos(' ',str)+1,length(str));
 end;
 result:=r;
end;

müsste eigentl selbsterklärend sein ... es ist en einfache zerlegung deiner zeichenkette ...

Delphi-Quelltext
1:
extractnumber(memo1.Lines[0],5)                    

liefert zb 3.336

das durchschnittberechnen müsstest du jez auch ohne hilfe hinbekommen oder ;) ?

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Thomek - Mo 20.10.03 21:43

Ist ja geil :) Jo das stimmt. Aber extractnumber(test.Lines[0],6) gibt 15015 aus und nicht 15.015.415 ;)

Und wie mach ich das mit den * Filtern?

Danke!!!!

Thomek


inselberg - Di 21.10.03 01:55

ist 15.015.415 denn auch ne zahl ;) oder möchtest du dies als 3 zahlen behandeln ?

den sinn des * hab ich auch nicht verstanden ,,, möchtest du das einfach löschen ???

Quelltext
1:
while ( pos('*',str) > 0 ) delete(pos('*',str),1)  ;                    


so mal ausm kopf wenndu siehst was ich meine...

gn8


Wolff68 - So 26.10.03 17:44

Für das Ausfiltern der * könnte StringReplace(Memo1.Text,'*','', [rfReplaceAll]) dienlich sein.
(Und das gleiche eben nochmal für die Punkte)

Wenn Du mehrere, einzelne Zeichen ausfiltern willst würde ich es allerdings eher so machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
  s : String;
begin
  s := Memo1.Text;
  For i := 1 to Length(s)-1 do begin
    While s[i] IN ['*','.'do begin // Hier kannst auch noch andere Zeichen reinsetzen
      // While, da bei IF nach dem Löschen das nächste Zeichen nicht geprüft wird
      Delete(s, i, 1); // Geht leider nicht direkt mit Memo1.Text daher die Variable S
    end;
  end;
  Memo1.Text := s;
end;