AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Zeichen in Memo ersetzten und Formatierung beibehalten?!

Zeichen in Memo ersetzten und Formatierung beibehalten?!

Ein Thema von Rawsche · begonnen am 14. Aug 2018 · letzter Beitrag vom 16. Aug 2018
Antwort Antwort
Seite 1 von 3  1 23   
Rawsche

Registriert seit: 18. Jul 2018
16 Beiträge
 
#1

Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 16:19
Hallo zusammen,

ich habe leider ein Problem. Ich möchte die Zeichen in einer Memo ändern doch es tritt ein Fehler auf, aus dem ich leider nicht schlau werde.

Delphi-Quellcode:
      
for i:=1 to Length(Memo1.lines.text) do
      begin
        x:=aendern(memo1.lines.Strings[i]);
        memo2.lines.Strings[i]:=x;
      end;
Die Prozedur "aendern" tauscht gewisse Zeichen aus Memo1 gegen andere aus. Diese veränderten Zeichen sollen, dann in Memo2 ausgegeben werden.

Die Fehlermeldung sieht wie folgt aus:


Projekt kompilieren, Ziel: project1.exe: Exit code 1, Fehler: 2
unit1.pas(60,44) Error: Can't take the address of constant expressions
unit1.pas(61,28) Fatal: Syntax error, "identifier" expected but "STRING" found



Ich versteh leider den Fehler nicht so richtig. Darf ich so nicht auf eine Memo zugreifen? Wie soll ich dann ein Zeichen ansprechen?


Und eine 2. Frage drängt sich mir noch auf. Wie kann ich Absätze aus einer Memo übernehmen? Ich möchte gern, dass Memo2 genau so aussieht wie Memo1 nur das z.B. Änderungen wie Sonderzeichen oder Großbuchstaben geändert werden. Deren sonstige Formatierung (Absätze) sollte aber beibehalten werden.

Ich würde mich sehr über eure Hilfe freuen.

Lg
Rawsche
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.288 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 16:30
Arbeitet schnarchlangsam aber erfüllt Sinn und Zweck.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
// Memo2.Text := Memo1.Text;
// Memo2.Text := StringReplace(Memo2.Text,'ErsetzeDas','MitDemHier',[rfReplaceAll]);
  Memo2.Text := StringReplace(Memo1.Text,'ErsetzeDas','MitDemHier',[rfReplaceAll]);
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Aug 2018 um 16:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.426 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 16:45
Zitat:
Length(Memo1.lines.text)
Wirklich die Anzahl der Zeichen oder doch lieber nur die Anzahl der Zeilen?
Memo1.Lines.Count

Und die Fehlermeldung passt zu keiner der gezeigten Codezeilen.
Was ist denn in Zeile 60?

Und hat Memo2 überhaupt genug Zeilen? (vielleicht besser vorher Lines.Clear und dann Lines.Add )

Außerdem ist ein Memo sehr langsam, vorallem wenn man kein Lines.BeginUpdate und Lines.EndUpdate drumrum macht.
Oder besser in eine StringList umkopieren, da drin ändern und "einmal" deren Text dann an Memo2 zuweisen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (14. Aug 2018 um 16:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.288 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 16:59
Ich habe mal was gebastelt was auch mehrere Änderungen zulässt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  iLines, iString: Integer;
  tmp, finish: string;
begin
  finish := '';
  for iLines := 0 to Memo1.Lines.Count -1 do // -1 eingefügt @ himitsu
  begin
    tmp := Memo1.Lines.Strings[iLines];
    for iString := 1 to Length(tmp) do
    begin
      case tmp[iString] of
        Char('e'): tmp[iString] := 'E'; // Das dient mir als Beispiel, mach aus kleinem "e" ein Großes "E"
                                        // füge beliebig viele Vergleiche/Ersetze hier ein
        Char('E'): tmp[iString] := 'e'; // so wie hier, mach aus Großem "E" ein kleines "e"
      end;
    end;
    finish := finish + tmp + sLineBreak; // #13#10; ersetzt @ himitsu
  end;
  Memo2.Text := finish;
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Aug 2018 um 18:50 Uhr) Grund: himitsu hat Fehler entdeckt
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.037 Beiträge
 
Delphi 7 Professional
 
#5

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 17:05
Der Zugrif auf Memo1.Lines.Text ist sehr langsam, vor allem, wenn im Memo viel Text drinne steht.

Etwas schneller wird es mit
Delphi-Quellcode:
Memo2.Lines.Clear;
for i := 0 to Memo1.Lines.Count - 1 do
begin
  Memo2.Lines.Add(StringReplace(Memo1.Lines[i],'ErsetzeDas','MitDemHier',[rfReplaceAll]));
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 17:59
Wie sieht den der Code von aendern aus? Da wird ja wahrscheinlich der Fehler liegen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.426 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 18:06
Außerdem 1 bis Count oder wohl eher 0 bis Count-1,
aber 0 bis Count ist definitiv falsch.

Wobei ihr froh sein könnt, dass Memo zufällig keine Exception wirft, wenn man auf nichtexistierende Zeilen zugreift. (gibt da nur einen Leerstring raus)

#13#10 = sLineBreak


Und wie Lucke ebenfalls nochmal erwähnte:
Wie sieht der restliche Code aus?
Denn die genannten Fehlermeldungen kommen nicht aus dem gezeigten Codestück.




@Delphi.Narium:
Falsch, Memo1.Lines.Text ist schneller, denn Delphi (und bestimmt auch Lazarus) leiten das direkt an das Memo und holen den kompletten Text mit Einmal ab oder weisen ihn direkt zu,
genau so wie bei Memo.Text

Der Zugriff auf Einzelzeilen (Lines[]) ist langsam, vor allem beim Ändern und wenn viel Text im Memo steht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (14. Aug 2018 um 18:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.288 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 18:47
Hab Fehler gefixt, Danke himitsu.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Rawsche

Registriert seit: 18. Jul 2018
16 Beiträge
 
#9

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 21:03
Ich werde mal die Karten komplett offen auf den Tisch legen. Bitte nicht lachen, falls ihr eine bessere Methode kennt, aber ich versuche in ein Programm eine Art Verschlüsselung einzubauen und habe daher zu Testzwecken das folgende Programm geschrieben.

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    procedure Coding(var x: string);
    procedure Decoding(var x: string);

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Coding(var x:string);
var i:integer;
begin
  for i:=0 to listbox1.items.count-1 do
  if x=listbox1.items[i] then x:=listbox2.items[i];
end;

procedure TForm1.Decoding(var x:string);
var i:integer;
begin
  for i:=0 to listbox2.items.count-1 do
  if x=listbox2.items[i] then x:=listbox1.items[i]
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
  x:string ;
begin
      for i:=1 to Length(Memo1.lines.text) do
      begin
        x:=coding(memo1.lines.Strings[i]);
        memo2.lines.Strings[i]:=x;
      end;
end;

end.
Anbei noch ein Bild meines Formulares.

Ich hoffe euch wird klar, was ich mir gedacht hatte. Ich würde, auch wenn es vielleicht einfacher geht, ungern anders vorgehen, weil ich gerade erst ins Verschlüsseln eingestiegen bin und gerne mit Tausch-Chiffrierung beginnen möchte.

Ich freue mich auf eure Ideen. Bitte berichtigt NICHT einfach den Code, sondern gebt mir vielleicht lieber Tipps, wie ich ihn selbst verbessern kann. Sonst lerne ich daraus leider nichts...


LG und Danke für die schon jetzt zahlreichen Antworten
Rawsche
Miniaturansicht angehängter Grafiken
vorschau.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Zeichen in Memo ersetzten und Formatierung beibehalten?!

  Alt 14. Aug 2018, 21:05
Und wieder fehlt der entscheidende Code: coding.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf