Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zeichen umwandeln


xan553 - Mi 24.01.07 16:31
Titel: Zeichen umwandeln
Hy ich bins mal wieder :wink:

Ich habe mir mit en paar freunden ma gedacht es wäre doch ganz witzig ein programm zu machen, bei dem man in einem fenster einen text eingibt,

dann auf einen button klickt und dann der text in einem layout mit bestimmten zeichen wieder ausgegeben wird,

ich weiß aber leider nicht, wie ich anfangen soll, und auch nicht welchen code ich dem button geben muss das er allen buchstaben bestimmte zeichenfolgen zuordnet.

bitte um hilfe

mfg michse


perry5 - Mi 24.01.07 16:43

ähm, du hast einfach eine Tabelle.
Wenn du immer genau EIN Zeichen ind eine Zeichenkette umwandeln wilslt, also aus 'W' beispielsweise '\/\/' machen wilslt geht das einfach.
Ein Array, das du über das Zeichen indizeirne kannst, in dem einfach nur strings gespeichert werden.
Dann kansnte die Eingabe-Zeichenkette durchgehen und für jedes Zeichen der UasgabeZeichenkette den entsprechenden String aus dem Array anhängen.


xan553 - Mi 24.01.07 16:45

könnte mir mal jemand dazu einen beispielcode zeigen?


Marc. - Mi 24.01.07 16:46

Nicht ein wenig umständlich?
Ich hätte es mit StringReplace(); gemacht ;)


xan553 - Mi 24.01.07 16:49

ich ahbe kaum ahnung von delphi, sprecht bitte deutsch mit mir *fleh* ^^


Marc. - Mi 24.01.07 16:56

Kein Problem. ;)
Wenn ich dich richtig verstanden habe, willst du bestimmte "Buchstaben" bzw. Zeichen durch andere ersetzen. Right?
Dies geht zB. mit Stringreplace();!
Kleines Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
 s: String;
begin
 s := 'abcdef';
 s := StringReplace('c','D',[rfreplaceall]); // in s steht nun 'abDef'
end;


grüße marc


xan553 - Mi 24.01.07 17:08

fast richtig, ich möchte in ein feld einen text eingeben dann sollte der text mit einem klick auf codieren im label unter "Ausgabe"
Wieder ausgegeben werden und das selbe soll auf mit einem klick auf decodieren möglich sein.


xan553 - Mi 24.01.07 21:35

kann mir denn keiner helfen?


jakobwenzel - Mi 24.01.07 21:38

Dir fehlen anscheinend Grundlagen: http://crashkurs.christian-stelzmann.de/


joker0000 - Mi 24.01.07 21:40

also ich denke, den rest kannst du auch alleine machen. einfach n memo. dann den inhalt des memos in nen string. dann solltest du mit stringreplace schon was auf die reihe bekommen.


jaenicke - Mi 24.01.07 21:43

Schiebepostings früher als 24 Stunden nach deiner letzten Frage sind hier im Forum unerwünscht, das mal so als Hinweis...
user profile iconxan553 hat folgendes geschrieben:
kann mir denn keiner helfen?
Naja, helfen könnten sicherlich viele, aber aus deinen Aussagen wird nicht wirklich deutlich, wo eigentlich dein Problem liegt...
Was hast du denn bisher versucht? Zeig mal deinen Code...

Ich seh grad, dass user profile iconjakobwenzel bereits den Link gebracht hat, den ich auch grad noch dazuschreiben wollte... ;-)


xan553 - Mi 24.01.07 21:53

eben das ist es ja, ich komme nicht auf den richtigen code,

Zitat:


Kein Problem. ;)
Wenn ich dich richtig verstanden habe, willst du bestimmte "Buchstaben" bzw. Zeichen durch andere ersetzen. Right?
Dies geht zB. mit Stringreplace();!
Kleines Beispiel:
ausblenden anzeigen Delphi-Quelltext
ausgeblendet markieren
1:
2:
3:
4:
5:
6:

var
s: String;
begin
s := 'abcdef';
s := StringReplace('c','D',[rfreplaceall]); // in s steht nun 'abDef'
end;



funktioniert nicht, ich suche einen code der mir zum beispiel alle buchstaben a,A raussucht und durch 001101 ersetzt


jaenicke - Mi 24.01.07 21:56

Aber genau das macht doch StringReplace? :gruebel:
Das Beispiel hier ist etwas falsch, so ists richtig:

Delphi-Quelltext
1:
s := StringReplace(s'c','D',[rfreplaceall]); // in s steht nun 'abDef'                    


Robinator - Mi 24.01.07 21:57

user profile iconxan553 hat folgendes geschrieben:
eben das ist es ja, ich komme nicht auf den richtigen code,

Zitat:


Kein Problem. ;)
Wenn ich dich richtig verstanden habe, willst du bestimmte "Buchstaben" bzw. Zeichen durch andere ersetzen. Right?
Dies geht zB. mit Stringreplace();!
Kleines Beispiel:
ausblenden anzeigen Delphi-Quelltext
ausgeblendet markieren
1:
2:
3:
4:
5:
6:

var
s: String;
begin
s := 'abcdef';
s := StringReplace('c','D',[rfreplaceall]); // in s steht nun 'abDef'
end;



funktioniert nicht, ich suche einen code der mir zum beispiel alle buchstaben a,A raussucht und durch 001101 ersetzt


dann solltest du evtl mal lesen, was du da gequotet hast :roll:


Saubäär - Mi 24.01.07 22:02

Hi xan,

so wie ich das verstanden habe, willst du nen String verschlüsseln - oder?

Wenn ja, so würde es gehen (ist aber relativ leicht zu knacken):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
    s: String;
begin
 s := Edit1.Text;
 for i := 1 to Length(s) do
  s[i] := char(i xOr Ord(s[i]));
 Edit1.Text := s;
end;


Gruß

Saubäär


xan553 - Do 25.01.07 07:07

richtig nur eben in von mir gewählte zeichen


jaenicke - Do 25.01.07 07:53

Du willst doch einfach nur, dass ein bestimmter Buchstabe durch eine bestimmte Buchstabenfolge ersetzt wird, oder?
Nun ja, und genau das macht ja StringReplace!
Hast du dir mal angesehen, was es macht?


xan553 - Do 25.01.07 12:50

ja habe ich, das müsste ich doch mit IF befehlen hinbekommen oder?


jaenicke - Do 25.01.07 13:01

Du brauchst kein if! Du musst nur StringReplace aufrufen. Das ersetzt dir dann doch den Buchstaben durch einen anderen String und fertig.
Ist dir denn klar, was StringReplace macht und wie du es benutzt?

Eine andere in diesem Fall vielleicht passendere Lösung wäre folgende, dann gibts auch kein Problem mit zirkulären Ersetzungen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  i: Integer;
  OriginalText, NewText: String;
begin
  OriginalText := 'Ein Test';
  NewText := '';
  for i := 1 to Length(OriginalText) do
    case OriginalText[i] of
      'E': NewText := NewText + '10010101';
      'T': NewText := NewText + 'casdfasd';
      's': NewText := NewText + '10000001';
    else NewText := NewText + OriginalText[i];
    end;
  ShowMessage(NewText);


Blackheart666 - Do 25.01.07 13:02

Dann probier doch auch mal was den code stellst Du dann hier rein, und man wird Dir dann sicherlich weiterhelfen können.
Bis jetzt sieht es so aus als wolltest Du nur nur eine fertige Lösung, obwohl sie ja eigentlich hier schon genannt wurde.


xan553 - Do 25.01.07 13:25

also ich habe mir jetzt mal das mit dem code eingestellt wie ich ihn möchte


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1Click(Sender: TObject);

var
  i: Integer;
  OriginalText, NewText: String;
begin
  OriginalText := 'a';
  NewText := '000101';
  for i := 1 to Length(OriginalText) do
    case OriginalText[i] of
      'E': NewText := NewText + '10010101';
      'T': NewText := NewText + 'casdfasd';
      's': NewText := NewText + '10000001';
    else NewText := NewText;
    end;
  edit1.text;
end.




er würde mit mit dem


Delphi-Quelltext
1:
ShowMessage(NewText);                    


funktionieren aber wenn ich


Delphi-Quelltext
1:
edit1.text;                    


schreibe, kann ich sooft ich will auf meinen buttom klicken aber es passiert nichts.


jaenicke - Do 25.01.07 13:37

Sieh dir bitte mal den bereits in einer früheren Antwort verlinkten Crashkurs an!!! Dir fehlen offenbar die elemntarsten Grundlagen! Edit1.Text ist kein Befehl, den du einfach so hinschreiben kannst. Das nur als Beispiel.
Hier nochmal der Link zum Crashkurs:
http://crashkurs.christian-stelzmann.de/


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  for i := 1 to Length(OriginalText) do  
    case OriginalText[i] of  
      'E': NewText := NewText + '10010101';  
      'T': NewText := NewText + 'casdfasd';  
      's': NewText := NewText + '10000001';  
    else NewText := NewText;  
    end;

Was das macht ist folgendes: Es geht zeichenweise durch den Originaltext, also den Text, in dem die Zeichen ersetzt werden sollen, und siehst dann nach, was das aktuelle Zeichen für ein Zeichen ist. Hier im Beispiel sieht er nach, ob es ein E, T oder s ist. Und abhängig davon, was für ein Buchstabe an der aktuellen Stelle steht, wird entweder eine Ersetzung oder der Buchstabe selbst (else) in den neuen Text, also das, was dabei herauskommen soll, geschrieben.


Miri - Do 25.01.07 13:44

user profile iconjaenicke hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  for i := 1 to Length(OriginalText) do  
    case OriginalText[i] of  
      'E': NewText := NewText + '10010101';  
      'T': NewText := NewText + 'casdfasd';  
      's': NewText := NewText + '10000001';  
    else NewText := NewText + OriginalText[i];  
    end;



das dürfte da noch gefehlt haben ;-)


jaenicke - Do 25.01.07 13:46

Darauf habe ich ja gar nicht geachtet, dass er das auch noch gelöscht hat... :roll:
Im Originalpost von mir wars noch drin... *seufz*

Ich hab jetzt einfach den Code genommen, den er grad gepostet hat...


xan553 - Do 25.01.07 14:41

ok bin schon viel weiter dank eurer hilfe, aber wenn ich nun


Delphi-Quelltext
1:
2:
3:
      'E': NewText := '000111';
      'T': NewText := '111111';
      's': NewText := '000000';


habe und ich: "ETS" eingebe, dann erhalte ich "111111S"
müsste ich normal nicht "000111111111S" erhalten?


Miri - Do 25.01.07 14:46

Super...

wie viele Leute hier haben dir jetzt schon den Crashkurs ans Herz gelegt?! Und warum fängst du nicht von vorne an, wenn du programmieren lernen willst?
Und noch ne Frage: ist selbst ABSCHREIBEN sooo schwer?

user profile iconjaenicke hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  for i := 1 to Length(OriginalText) do  
    case OriginalText[i] of  
      'E': NewText := NewText + '10010101';  
      'T': NewText := NewText + 'casdfasd';  
      's': NewText := NewText + '10000001';  
    else NewText := NewText + OriginalText[i];  
    end;



azubi_20 - Do 25.01.07 15:00

user profile iconxan553 hat folgendes geschrieben:
ok bin schon viel weiter dank eurer hilfe, aber wenn ich nun


Delphi-Quelltext
1:
2:
3:
      'E': NewText := '000111';
      'T': NewText := '111111';
      's': NewText := '000000';


habe und ich: "ETS" eingebe, dann erhalte ich "111111S"
müsste ich normal nicht "000111111111S" erhalten?


na guck mal genau hin :
aus E wird 000111
aus T wird 111111
aus s wird 000000

und dein Beispiel : "ETS"

was wird aus dem "S" ?
s ist nicht gleich S !

Tipp : such mal nach UpperCase()


Miri - Do 25.01.07 15:07

user profile iconxan553 hat folgendes geschrieben:
dann erhalte ich "111111S"
müsste ich normal nicht "000111111111S" erhalten?


Das mit dem S hat er scheinbar verstanden...
das Problem ist, dass er erst 000111 in den String packt und den kompletten String dann mit 111111 überschreibt...
Und ich vermute einfach mal, dass er den ELSE-Zweig tatsächlich richtig abgeschrieben hat, daher wird das S drangehängt anstatt den String wieder zu überschreiben ;-)


Blackheart666 - Do 25.01.07 15:09

user profile iconazubi_20 hat folgendes geschrieben:
user profile iconxan553 hat folgendes geschrieben:
ok bin schon viel weiter dank eurer hilfe, aber wenn ich nun


Delphi-Quelltext
1:
2:
3:
      'E': NewText := '000111';
      'T': NewText := '111111';
      's': NewText := '000000';


habe und ich: "ETS" eingebe, dann erhalte ich "111111S"
müsste ich normal nicht "000111111111S" erhalten?


na guck mal genau hin :
aus E wird 000111
aus T wird 111111
aus s wird 000000

und dein Beispiel : "ETS"

was wird aus dem "S" ?
s ist nicht gleich S !

Tipp : such mal nach UpperCase()


Ich glaube das kleine s war beabsichtigt, er wollte nur E und T sollten ersetzt werden klein s ignoriert.
000111111111S


xan553 - Do 25.01.07 16:00

so habs endlich ^^

muss nurnoch das script umscvhreiben zum umwandeln und dann isses fertig


Danke an alle


xan553 - Do 25.01.07 16:03

achso nochmal was

mit diesder zeile


Delphi-Quelltext
1:
'000101': NewText := NewText + 'A';                    


bekomme ich den fehler

[Error] Codierer.pas(118): Incompatible types: 'Char' and 'String'

edit:
habe aber auch gemerkt, das es nur bei


Delphi-Quelltext
1:
'0': NewText := NewText + 'A';                    


geht

ich denke das man da nur ein zeichen einsetzen kann oder?


Marc. - Do 25.01.07 16:10

Heyho
Bitte(!!) editier deine Beiträge!
Und zu deinem Problem: Bei im Falle von Case Of lassen sich nur ordinale Typen verwenden!
D.h. 1,2,3,4,5,8,9... Zahlen; a,b,c,d,e,f... und Buchstaben(=Zeichen) alias "Char"!
Mfg


xan553 - Do 25.01.07 16:15

hm

das heißt ich kann das ganze nur wieder rückgängig machen indem ich stringreplace benutze oder gibt es da noch andere möglichkeiten


Blackheart666 - Do 25.01.07 16:30


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.CodierenClick(Sender: TObject);
var TmpStr: string;
begin
  TmpStr:= Edit1.Text;
  TmpStr := StringReplace(TmpStr, 'E''000111', [rfReplaceAll, rfIgnoreCase]);
  TmpStr := StringReplace(TmpStr, 'T''111111', [rfReplaceAll, rfIgnoreCase]);
  TmpStr := StringReplace(TmpStr, 'S''000000', [rfReplaceAll, rfIgnoreCase]);
  Edit1.Text:=TmpStr;
end;

procedure TForm1.EncodierenClick(Sender: TObject);
var TmpStr: string;
begin
  TmpStr:= Edit1.Text;
  TmpStr := StringReplace(TmpStr, '000111''E', [rfReplaceAll, rfIgnoreCase]);
  TmpStr := StringReplace(TmpStr, '111111''T', [rfReplaceAll, rfIgnoreCase]);
  TmpStr := StringReplace(TmpStr, '000000''S', [rfReplaceAll, rfIgnoreCase]);
  Edit1.Text:=TmpStr;
end;


Ich hoffe Du verstehts auch was da Steht :wink: