| Autor |
Beitrag |
aLex18
Hält's aus hier
Beiträge: 13
|
Verfasst: Di 14.01.03 18:46
Nabend! Erstmal mein Respekt für so ein geiles Board.
Jetzt zu meinen Fragen. Undzwar haben wir nach den Sommerferien in der 11 im InformatiK Unterricht mit dem programmieren mit Delphi 6 angefangen. Wir arbeiten gerade an einem Coder & DeCoder der Caesar Codes. Der Caesar Code ist relativ einfach, er geht einfach von einem Buchtaben 3 Buchstaben weiter also aus Hallo wird Kdoor.
Das Coden und Entcoden klappt auch schon aber ich habe ein paar Spielereien mit eingebaut wobei ich allerdings Probleme habe.
Ich habe einen Timer eingebaut der Buchtaben generiert und im Edit 1 Fensten anzeigt. Er zeigt jedoch nur Großbuchstaben an, Meine Frage jetz wie bekomme ich das hin das Groß und KLeinbuchstaben generiert werden und nach ner bestimmten Zeit immer der passende Buchstabe stehenbleibt und das Wort richtig Codiert ist. Ich habe mein Quelltext beigefügt der euch ein wenig helfen kann fals ihr mich ncht richtig versteht. Danke im Vorraus. Alex
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; Button2: TButton; Timer1: TTimer; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private t:string; { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var x,z :integer; begin t :=''; For x :=1 to length(edit1.Text) do Begin z:= ORD(Edit1.Text[x]); z:= z+3; if (z > ORD('Z')) and (z < 97) then z :=z-26; if z > ORD('z') then z :=z-26; t :=t + CHR(z); end; //edit1.Text :=t; timer1.Enabled :=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); var i :integer; s :string; begin s := ''; For i := 1 to length(edit1.Text) do s := s+chr(ord('A')+random(26)); edit1.Text :=s; end; end. |
P.S. das decodieren mit Button 2 habe ich erstmal weggelassen
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Di 14.01.03 19:19
wenn du
Quelltext 1: 2: 3:
| randomize; i:=random(2); if i=0 then stringvariable:=ansilowercase(stringvariable) else stringvariable:=ansiuppercase(stringvariable); |
so kannst du zufällig die Buchstaben klein oder große machen...
Fiji-Fighter
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Di 14.01.03 19:24
zu | aLex18 hat folgendes geschrieben: | | nach ner bestimmten Zeit immer der passende Buchstabe stehenbleibt |
:
du könntest ne globale variable z.B. Zaehler:Integer; deklarieren, die du jedesmal wenn dein Timer aufgerufen wird erhöhst
Quelltext 1: 2: 3:
| inc(zahler); //entspricht zaehler:=zaehler+1; |
dann überprüfst du im timerereignis ob zaehler>x ist und wenn ja, dann setzt du einfach den zufälligen Buchstaben gleich dem Buchstaben den du haben willst...
so einfach ist das
Fiji-Fighter
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 14.01.03 19:29
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Timer1Timer(Sender: TObject); VAR s: STRING; i,k:Integer; begin s := ''; For i := 1 to length(edit1.Text) do begin if UpCase(edit1.Text[i]) = UpCase(t[i]) then s:=s+t[i] else begin k:=Random(2); if k mod 2 = 0 then s := s+chr(ord('A')+random(26)) else s := s+LowerCase(chr(ord('A')+random(26))); end; end; edit1.Text :=s; if edit1.text=t then timer1.Enabled:=False; end; |
Wie wäre es hiermit? Vorsicht! Funktioniert nicht bei Zahlen!
MfG,
Peter
P.S.: Bitte einen aussagekräftigeren Titel wählen!
edit{
@Fiji-Fighter: habe ihn wohl falsch verstanden. Ich dachte es sollten ganz oft zufällige Zeichenfolgen durchlaufen und nach und nach die richtigen Buchstaben in den Zeichenfolgen stehen bleiben.
}edit
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Di 14.01.03 19:35
vielleicht habe ich ihn ja auch falsch verstanden!
Na ja irgendwas wird ihm schon helfen...
Fiji-Fighter
|
|
aLex18 
Hält's aus hier
Beiträge: 13
|
Verfasst: Di 14.01.03 19:43
Danke Peterlustig und den anderen es Funzt. WIe kann ich das Jetzt ncoh machen, dass die Zahlen langsamer stehenbleiben, also das das generieren länger dauert und ich wollte eine TGauge mit einbauen. die von 0-100% geht .
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 14.01.03 20:10
Dass es langsamer geht, gibt es natürlich erstmal die Lösung, das Intervall vom Timer abzuändern. Aber das meinst Du sicher nicht, oder? Du könntest es so machen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Timer1Timer(Sender: TObject); VAR s: STRING; i,k:Integer; begin s := ''; For i := 1 to length(edit1.Text) do begin k:=Random(3)+1; if (UpCase(edit1.Text[i]) = UpCase(t[i])) and (k mod 3 = 0) then s:=s+t[i] else begin k:=Random(2); if k mod 2 = 0 then s := s+chr(ord('A')+random(26)) else s := s+LowerCase(chr(ord('A')+random(26))); end; end; edit1.Text :=s; if edit1.text=t then timer1.Enabled:=False; end; |
Dass heißt, Du erzeugts (mal wieder) eine Zufallszahl im Bereich von 1 bis 3 und prüfst, ob diese durch 3 Teilbar ist. Und nur dann wird der "richtige" Buchstabe beibehalten.
Die Prozentanzeige kannst Du so realsieren: du führst eine globale Variable ein (z.B. 'geschafft'), die Du im Button-Click-Ereignis auf Null setzt. Jedesmal, wenn ein "richtiger" Buchstabe stehen bleibt, erhöhst Du 'geschafft' um 1. geschafft / Length(t) *100 gibt Dir dann die Prozent an Zeichen an, die schon "richtig" dargestellt werden. Den Wert kannst Du dann im TGauge verbraten.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
aLex18 
Hält's aus hier
Beiträge: 13
|
Verfasst: Di 14.01.03 20:22
Sorry das verstehe ich nicht so ganz also ich verstehe es aber ich weiß nicht wie ich das in die Tat umsetzten muss.
Ich habe noch nciht soviel Erfahrung mit Delphi.
Kannst du es mir aufschreiebn plz.
Danke PS. habe ncoh andere Fragen gehabt die sind habe ich schon gepostet.
Und wo kann ich die Hilfen zu den verwendeten Wörtern wie UpCase nachlesen. Weil ich muss ja schliesslich auch ihren Sinn verstehen udn kann nicht einfach alles hier abschreiben.
Danke danke danke
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 14.01.03 21:02
| aLex18 hat folgendes geschrieben: | | Und wo kann ich die Hilfen zu den verwendeten Wörtern wie UpCase nachlesen. Weil ich muss ja schliesslich auch ihren Sinn verstehen udn kann nicht einfach alles hier abschreiben. |
Das ist ein guter Vorsatz. Aber abschreiben müsstest du es schon erst einmal, dann gehst du mit dem Cursor auf das gewünschte Wort ... drückst F1 ... und hoffst, dass du die Hilfedatei installiert hast ...
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 14.01.03 21:08
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.Timer1Timer(Sender: TObject); VAR s: STRING; i,k, geschaftt:Integer; begin s := ''; geschafft:=0; For i := 1 to length(edit1.Text) do begin if UpCase(edit1.Text[i]) = UpCase(t[i]) then s:=s+t[i] else begin k:=Random(2); if k mod 2 = 0 then s := s+chr(ord('A')+random(26)) else s := s+LowerCase(chr(ord('A')+random(26))); end; end;
for i:=1 to length(s) do if s[i]=t[i] then inc(geschafft); progressbar1.position:=Round(geschafft/Length(t)*100);
edit1.Text :=s; if edit1.text=t then timer1.Enabled:=False; end; |
Das ist für den Gauge. (Bei mir ist es ProgressBar, aber das macht ja nichts.) Was die Geschwindigkeit angeht, mit der der Text dort erscheinen soll: das scheint schwieriger zu sein, als ich dachte, oder aber ich im Moment ein Brett vorm Kopf. Werde mal drüber nachdenken. Könnte sein, dass mir da gerade eine Idee kommt.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Di 14.01.03 21:12
| MathiasSimmack hat folgendes geschrieben: | | Aber abschreiben müsstest du es schon erst einmal, dann gehst du mit dem Cursor auf das gewünschte Wort ... drückst F1 ... und hoffst, dass du die Hilfedatei installiert hast ... |
oder du gehst auf Hilfe->Delphi-Hilfe
dann musst du suchen anklicken und kannst dort deine suchwörter eingeben
Fiji-Fighter
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Di 14.01.03 21:16
damit auch Umlaute und ähnliches in Großbuchstaben umgewandelt werden benutzt du besser (falls du es benötigst):
Quelltext 1:
| ansiuppercase(stringvariable); |
statt
Quelltext 1:
| uppercase(stringvariable); |
Fiji-Fighter
|
|
aLex18 
Hält's aus hier
Beiträge: 13
|
Verfasst: Di 14.01.03 23:15
KLappt jetzzt alles super. Peter dass mit der schnelligkeit ist so schion super. Ich will jetzt nur noch wissen wie ich Zahlen und Satzzeichen mit einbringen kann ohne das die verändert werden.
mfg Alex
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 15.01.03 17:39
Hi!
Prima, dass das mit der Geschwindigkeit so reicht, denn mir ist nichts Neues eingefallen.
Das mit den Zahlen und Satzzeichen funktioniert so:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); var x,z :integer; begin t :=''; For x :=1 to length(edit1.Text) do Begin if AnsiUpperCase(edit1.text[x])[1] IN ['A'..'Z'] then begin z:= ORD(Edit1.Text[x]); z:= z+3; if (z > ORD('Z')) and (z < 97) then z :=z-26; if z > ORD('z') then z :=z-26; t :=t + CHR(z); end else t:=t+edit1.text[x]; end; //edit1.Text :=t; timer1.Enabled :=true; end; |
Die ergänzte Zeile schaut einfach nach, ob das zu ersetzende Zeichen ein gültiger Buchstabe ist. Wenn dem nicht so ist, wird er nicht ersetzt. An der Prozedur für den Timer muss nichts geändert werden.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
aLex18 
Hält's aus hier
Beiträge: 13
|
Verfasst: Mi 15.01.03 23:11
Danke es Klappt fast alles. Aber wenn ich ein z codiere wird daraus ein c das ist ja richtig aber wenn ich er decodiere wird hierraus ein F.??
Und wenn ich ein Z codiere wird daraus ein C das stimmt auch aber beim decodieren wird überhaupt keine ZAhl angezeigt und das Tool läuft ununterbrochen weiter.
AM Ende hätte ich ncoh die Frage wie ich das machen aknn das wenn jemand nichts ein gibt und dann codieren oder decodieren drückt eine selbererstellte Fehlermessage kommt und der Timer erst dann startet wenn man wirklich was ins Edit feld eingegeben hat.
mfg Alex
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:
| procedure TForm1.Button1Click(Sender: TObject); var x,z :integer; begin t :=''; For x :=1 to length(edit1.Text) do Begin if AnsiUpperCase(edit1.text[x])[1] IN ['A'..'Z'] then begin z:= ORD(Edit1.Text[x]); z:= z+3; if (z > ORD('Z')) and (z < 97) then z :=z-26; if z > ORD('z') then z :=z-26; t :=t + CHR(z); end else t:=t+edit1.text[x]; end; //edit1.Text :=t; timer1.Enabled :=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); VAR s: STRING; i,k,m :Integer; begin s := ''; m:=0; For i := 1 to length(edit1.Text) do begin if UpCase(edit1.Text[i]) = UpCase(t[i]) then s:=s+t[i] else begin k:=Random(2); if k mod 2 = 0 then s := s+chr(ord('A')+random(26)) else s := s+LowerCase(chr(ord('A')+random(26))); end; end;
for i:=1 to length(s) do if s[i]=t[i] then inc(m); gauge1.Progress:=Round(m/Length(t)*100);
edit1.Text :=s; if edit1.text=t then timer1.Enabled:=False; beep; end;
procedure TForm1.Button2Click(Sender: TObject); var x,z :integer; begin t :=''; For x :=1 to length(edit1.Text) do Begin if AnsiUpperCase(edit1.text[x])[1] IN ['A'..'Z'] then begin z:= ORD(Edit1.Text[x]); z:= z-3; if (z > ORD('Z')) and (z < 97) then z :=z-26; if z > ORD('z') then z :=z-26; t :=t + CHR(z); end else t:=t+edit1.text[x]; end; //edit1.Text :=t; timer1.Enabled :=true; end; end. |
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 16.01.03 17:47
Die Sache, dass das Tool nicht mehr weiterläuft, ist einfach zu lösen: in deiner Button2Click-Prozedur musst Du vor t:=t+Chr(z) noch folgendes setzen:
Quelltext 1:
| if z<ORD('A') then z:=z+26; |
Genau wie das, was Du dort schon stehen hast, verhindert, dass Dein z nach oben über die Zeichnnummerierung hinaus schießt, verhindert dies, dass Dein z nach unten heraus schießt.
Dein erstes Problem habe ich nicht ganz verstanden!
Was die Überprüfung auf ein leeres Editfeld angeht: der Befehl für eine selbstgebaute Fehlermeldung, wie Du sie brauchst ist:
Quelltext 1:
| ShowMessage('Dein Text kommt hier rein. Der wird dann angezeigt'); |
Wie Du den Rest machst, sollte doch eigentlich klar sein, oder?
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
aLex18 
Hält's aus hier
Beiträge: 13
|
Verfasst: Do 16.01.03 18:16
Danke also zum Problem 1 nochmal das decodieren funzt nicht bei c und C denn hierraus werden kein z bzw Z sondern ein F.
Das darf aber nicht sein. denn bei der Caesar codierung ist das so
aus c wird Z denn c - 3 Buchstaben b,a,z also aber das funktioniert irgendwie nicht.
Beim codieren von z auf c und von Z auf C das geht einwandfrei.
Nur das decodieren halt nicht.
mfg Alex
|
|
aLex18 
Hält's aus hier
Beiträge: 13
|
Verfasst: Do 16.01.03 18:23
Peter es klappt doch jetzt ich habe einfach if z<ORD('A') then z:=z+26; zugefügt wie du es mir gesagt hast nun funzt alles vielen dank leute.
Besonders dir Peter 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 16.01.03 18:35
Ah, jetzt sehe ich das Problem.
Und hier ist die Lösung. Die Änderung solltest Du auch in Button1Click übernehmen, damit es konsistenter ist.
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:
| procedure TForm1.Button2Click(Sender: TObject); var x,z :integer; begin t :=''; For x :=1 to length(edit1.Text) do Begin if AnsiUpperCase(edit1.text[x])[1] IN ['A'..'Z'] then begin z:= ORD(Edit1.Text[x]); z:= z-3; if AnsiUpperCase(edit1.text[x])[1]=edit1.text[x] then //großer Buchstabe begin if z<Ord('A') then z:=z+26; if z>Ord('Z') then z:=z-26; end else begin //kleiner Buchstabe if z<Ord('a') then z:=z+26; if z>Ord('z') then z:=z-26; end; t :=t + CHR(z); end else t:=t+edit1.text[x]; end; //edit1.Text :=t; timer1.Enabled :=true; end; |
MfG,
Peter
edit{
Habe Dein Posting zu spät gesehen. Ich finde aber, dass obiger Quelltext "schöner" als der bisherige ist. Und besser zu verstehen!
}edit
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
aLex18 
Hält's aus hier
Beiträge: 13
|
Verfasst: Do 16.01.03 19:14
So das geht jetzt danke jetzt habe ich aber nochh ein anderes Problem ich hoffe das Letzte will euch nicht weiter strapauieren  . ALso
Ich habe bei dem Tool ein 2tes Form hinzugefügt und alles richtig bei Uses und so eingestellt. wenn man jetzt beim Programm auf Button 3 drückt öffnet sich Form2 dort habe ich 2 Edit Fenster, die jeweils das was in Edit1 von Form1 mit Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm2.FormShow(Sender: TObject); var x,z :integer; begin edit1.text:=form1.edit1.text; edit2.text:=form1.edit1.text; end; | wiedergeben. aber ich möchte mit einem Timer das so machen das sobald Form2 aufgerufen wird und in Edit1 und Edit2 der Inhalt von Edit1 von Form1 wiedergegeben wird der Timer anfängt in Edit2 von Form2 den Inhalt zu codieren aber in Edit1 muss alles stehenbleiben also uncodiert.
Danke im orraus ich hoffe ihr konntet das verstehen.
|
|