Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi an das Ende eines memo's einen doppelpunkt setzen (https://www.delphipraxis.net/165385-delphi-das-ende-eines-memos-einen-doppelpunkt-setzen.html)

Lyan 27. Dez 2011 19:03

Delphi-Version: 2010

Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Hallo,

ich möchte eine Liste abarbyten.
Also man hat quasi einen Text der in etwa so aussehen könnte:

Code:
hallo mein name ist
ich bin 99 jahre alt
ich liebe pizza
außerdem asdasdasd
obendrauf gefallen mir
Ohne jetzt zu erwähnen warum ich das so möchte, sollte es nach Bearbeitung der routine dann so aussehen:

Code:
hallo mein name ist:
ich bin 99 jahre alt:
ich liebe pizza:
außerdem asdasdasd:
obendrauf gefallen mir:
Jemand eine Idee wie das machbar wäre?

Habs so versucht:

Code:
procedure TForm1.pSetzedoppel;
var i : Integer;
begin
  for i := 0 to memo1.Lines.count - 1 do
  begin
    memo1.Lines[i] := memo1.Lines[i] + ':';
  end;
end;

Ist aber völliger Schwachsinn! Also bitte um Denkanstöße :)


MfG

haentschman 27. Dez 2011 19:08

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Zitat:

Ist aber völliger Schwachsinn!
... hast du den Schwachsinn mal ausprobiert ? Was kommt dabei raus ? :stupid:

lbccaleb 27. Dez 2011 19:15

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Das ist total OFF-Topic, aber total geil deswegen muss das mal gesagt werden^^
Zitat:

ich möchte eine Liste abarbyten.

Lyan 27. Dez 2011 19:26

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Zitat:

Zitat von haentschman (Beitrag 1143359)
Zitat:

Ist aber völliger Schwachsinn!
... hast du den Schwachsinn mal ausprobiert ? Was kommt dabei raus ? :stupid:

Bei paar tausend Zeilen, oder auch 1 Million Zeilen, kann das dann schon hängen mit einer Schleife :(

Habs mit 1565 Zeilen versucht, dauert ewig!

markus5766h 27. Dez 2011 19:32

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
'ne TStringList nehmen
abarbeiten
und dann in's TMemo kopieren

sollte einiges schneller sein

lbccaleb 27. Dez 2011 19:33

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Füge diese Zeilen ein:

Delphi-Quellcode:
Memo1.Lines.BeginUpdate

... //Bearbeitung ...

Memo1.Lines.EndUpdate;

Lyan 27. Dez 2011 19:43

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Zitat:

Zitat von lbccaleb (Beitrag 1143363)
Füge diese Zeilen ein:

Delphi-Quellcode:
Memo1.Lines.BeginUpdate

... //Bearbeitung ...

Memo1.Lines.EndUpdate;

Habe es nun so gemacht:

Code:
procedure TForm1.pSetzedoppel;
var i : Integer;
begin
  progressbar1.position := 0;
  for i := 1 to memo1.Lines.count do
  begin
    Memo1.Lines.BeginUpdate;
    memo1.Lines[i] := memo1.Lines[i] + ':';
    progressbar1.position := i;
    application.ProcessMessages;
    Memo1.Lines.EndUpdate;
  end;
end;
Gibts sonst noch andere methoden um eine liste abzuarbyten?
die performance würde ich schon gerne erhöhen.

MfG

implementation 27. Dez 2011 19:53

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Zitat:

Zitat von Lyan (Beitrag 1143364)
Code:
procedure TForm1.pSetzedoppel;
var i : Integer;
begin
  progressbar1.position := 0;
  for i := 1 to memo1.Lines.count do
  begin
    Memo1.Lines.BeginUpdate;
    memo1.Lines[i] := memo1.Lines[i] + ':';
    progressbar1.position := i;
    application.ProcessMessages;
    Memo1.Lines.EndUpdate;
  end;
end;

Nimm BeginUpdate und EndUpdate mal aus der Schleife raus und setz sie außerhalb:
Delphi-Quellcode:
procedure TForm1.pSetzedoppel;
var i : Integer;
begin
  progressbar1.position := 0;
  Memo1.Lines.BeginUpdate;
  for i := 1 to memo1.Lines.count do
  begin
    memo1.Lines[i] := memo1.Lines[i] + ':';
    progressbar1.position := i;
    application.ProcessMessages;
  end;
  Memo1.Lines.EndUpdate;
end;

Klaus01 27. Dez 2011 19:55

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Hallo,

BeginUpdate vor der Schleife
EndUpdate noch der Schleife.

Grüße
Klaus

himitsu 27. Dez 2011 20:05

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Erstmal ist es totaler "Schachsinn" überhaupt soviele Zeilen in einem Memo verarbeiten zu wollen.
Wer will sich das alles ansehn?

TStringList geht schneller, da hier jede Zeile "einzeln" ist und damit alles schnell verarbeitet wird.
(Memo.Text > StringList.Text > die StringList verarbeiten > StringList.Text > Memo.Text)

TMemo ist nunmal nicht für eine massenhafte String-Verarbeitung geeignet, denn dort befindet sich alles in einem Speicherblock, also für das Einfügen eines Zeichens am Anfang werden alle nachfolgenden Zeichen verschoben.
und bei 1 Mio. Zeilen muß da viel verschoben werden.

Ohne BeginUpdate wird dabei auch noch jedesmal die GUI geupdatet, was dann nochmals massig Rechenleistung verbrät.

usw.

Lyan 27. Dez 2011 20:21

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Also um mal kurz zu erwähnen was ich machen möchte:
Das Programm wird ein FTP-Checker.

Man soll eine Liste angeben können in folgendem Format:

IP:USER:PASS

Beispiel:
Code:
888.888.888:username:passwort
533.45.2342.3:usr2:pw123
223.234.123.3:usss:pwww
Ich versuche momentan halt anhand des doppelpunktes die IP, den USERNAME und das PASSWORT auseinander zu halten.

Problematik liegt halt an meinen Kenntnissen. Ich zeige euch mal wie ichs mit meinen wenigen Kenntnissen versucht habe zu Lösen:

Also im Idealfall sollte mein Kod so aussehen:

Code:
888.888.888:username:passwort:
533.45.2342.3:usr2:pw123:
223.234.123.3:usss:pwww:
Wenn ich davon ausgehe, dann läuft mein Prog. so:

Ich entferne zunächst mal "#$D#$A" in dem Memo mit stringreplace und schreibe den neuen Inhalt in einen String.
Dieser String sieht dann ja so aus:

Code:
888.888.888:username:passwort:533.45.2342.3:usr2:pw123:223.234.123.3:usss:pwww:
Nun ermittle ich mit Pos() den ersten Doppelpunkt und kopiere mit Copy() die IP (also die "888.888.888") und schreibe sie in meine Variable (sIP).

Nun lösche ich per Delete() die IP und den dazugehörigen Doppelpunkt (888.888.888:).

Ja und in einem Schleifendurchgang werden immer "IP,USERNAME,PASSWORD" ermittelt und auf Verbindung getestet. Wenn eine Verbindung möglich war, so wird in eine Strinlist die Daten hinzugefügt.

Also "Strlist.add(IP+USER+PASS+#13#10);

Nun das Problem:

Wenn meine Liste nun so aussehen würde:

Code:
888.888.888:username:passwort
533.45.2342.3:usr2:pw123
223.234.123.3:usss:pwww
Dann muss ich ja noch Doppelpunkte setzen (vorher).
Und mit der eben genannten Methode, nerven wieder diese "#$D#$A".
Hat jemand eine Idee wie ich die Liste in mein Idealformat bekomme?
Oder weiß jemand, wie ich sowas vlt. auf eine ganz andere, viel bessere Art und Weise Lösen könnte?

MfG

Luckie 27. Dez 2011 20:29

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Gehe das Memo oder die Stringliste zeilenweise durch und wende auf jede Zeile Hier im Forum suchenExplode. Dann hast du die Bestandteile zerlegt in einem Array stehen.

Da durch, dass du die Zeilenumbrüche löschst, machst du es dir nur unnötig schwer, weil dann weißt du ja nicht mehr so einfach, wo ein neuer "Datensatz" anfängt und aufhört.

scrat1979 27. Dez 2011 20:30

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Nimm doch eine typisierte Textdatei und arbeite mit Records...

Eventuell würde es sich noch anbieten, das Passwort zu verschlüsseln bzw. "unkenntlich" zu machen - ohne jetzt hier wieder eine Diskussion über Verschlüsselung anzuzetteln :-)

Lyan 27. Dez 2011 20:35

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Zitat:

Zitat von Luckie (Beitrag 1143379)
Gehe das Memo oder die Stringliste zeilenweise durch und wende auf jede Zeile Hier im Forum suchenExplode. Dann hast du die Bestandteile zerlegt in einem Array stehen.

Da durch, dass du die Zeilenumbrüche löschst, machst du es dir nur unnötig schwer, weil dann weißt du ja nicht mehr so einfach, wo ein neuer "Datensatz" anfängt und aufhört.

Wenn ein Doppelpunkt gesetzt ist, weiß ich schon wo ein neuer Datensatz anfängt.

Denn das Format ist ja hart :"IP:USERNAME:PASS".

Und da ich ja die abgearbeiteten Daten immer nachlösche, ist somit mein nächster Datensatz immer der aktuelle.

Ich brauche nur eine Antwort darauf:

Wie kann ich an jedem Zeilenende ein ":" einfügen, ohne dass dabei die "#$D#$A" mitgelesen werden?

Aber vielen Dank für eure Mühe :)

Luckie 27. Dez 2011 20:36

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Ach das ist unnötig kompliziert. Warum guckst du dir meinen Vorschlag mit Explode nicht mal richtig an?

Sir Rufo 27. Dez 2011 20:41

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Es gab da mal ein paar kluge Leute, die haben sich viele Gedanken gemacht, wie man Daten in einer Textdatei speichert.
Diese Leute fanden es sehr geschickt ein Feldtrennzeichen und ein Satztrennzeichen zu benutzen.
Das Format nannten sie dann CSV.

Natürlich kann man das Rad neu erfinden ... aber ein Zwang besteht nicht

blauweiss 27. Dez 2011 21:29

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Zitat:

Zitat von Lyan (Beitrag 1143364)
Habe es nun so gemacht:

Code:
  for i := 1 to memo1.Lines.count do
  begin
    ...
    application.ProcessMessages;
  end;

Es ist nicht sinnvoll, application.ProcessMessages in jedem Schleifendurchlauf aufzurufen.
Genauer gesagt ist es überhaupt nicht sinnvoll, application.ProcessMessages zum alleinigen Zweck einer Anzeigeaktualisierung aufzurufen.

Gruss,
blauweiss

Mavarik 28. Dez 2011 01:52

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
WOW soviele Ideen!

Wie wäre es mit:

Delphi-Quellcode:
 Memo1.Lines.Text := StringReplace(Memo1.Lines.Text,#13#10,':'+#13#10,[rfReplaceAll]);
Mavarik

Furtbichler 28. Dez 2011 07:50

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Schreib das, was Du machen willst, doch einfach mal in der Sprache Delphi (statt Deutsch) auf:
Delphi-Quellcode:
For i:=0 to MyIPList.Count -1 do begin
  ExtractFromCode(MyIPList[i], IPAddress, UserName, Password)
    If CanReachIP(IPAddress) then
       MyStringList.Add(IPAddress+':'+UserName+':'+Password);
end;
Dann noch die beiden Methoden 'ExtractFromCode' und 'CanReachIP' schreiben.
ExtractFromCode nimmt einen String der Form IP:User: Pass[...] und extrahiert IP, User und Pass.
Sonderzeichen nach dem 'Pass' werden ignoriert.

CanReachIP prüft, op eine IP-Adresse erreichbar ist und liefert True, sonst False. Optional könnte ein Logeintrag erzeugt werden.

Lyan 29. Dez 2011 01:25

AW: Delphi an das Ende eines memo's einen doppelpunkt setzen
 
Habe ganz vergessen mich bei euch allen ganz herzlich zu bedanken!
Ich habe viele eurer Ideen wahrgenommen und ein paar Dinge miteinander kombiniert.

Bin mit dem Ergebnis sehr zufrieden!

Danke euch allen vielmals! :)


MfG

Lyan


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 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