Entwickler-Ecke
Sonstiges (Delphi) - Probleme bei Programmieren
aLex18 - Di 14.01.03 18:46
Titel: Probleme bei Programmieren
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
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: 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. - 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. - 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 :wink:
Fiji-Fighter
Christian S. - 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
Raphael O. - Di 14.01.03 19:35
vielleicht habe ich ihn ja auch falsch verstanden! :?: :?: :?:
Na ja irgendwas wird ihm schon helfen... :lol:
Fiji-Fighter
aLex18 - 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. - 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
aLex18 - 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
Delete - 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. - 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
Raphael O. - 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. - 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 - 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. - Mi 15.01.03 17:39
Hi!
Prima, dass das mit der Geschwindigkeit so reicht, denn mir ist nichts Neues eingefallen. :wink:
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
aLex18 - 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
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: 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. - 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
aLex18 - 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 - 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. - 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
aLex18 - 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.
Christian S. - Do 16.01.03 20:21
Ich bin mir nicht sicher, ob ich Dein Problem richtig verstanden habe.
Aber folgende Tipps:
1. Das, was bisher Button1Click erledigt hat, solltest Du jetzt in Form2Show packen.
2. Ein Timer auf Form2, der nicht auf Edit1, sondern auf Edit2 zugreift, sollte funktionieren.
3. Auch die Variable t solltest Du in der Unit zu Form2 noch einmal deklarieren.
MfG,
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!