Autor Beitrag
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.01.03 14:03 
*wink* ... Bin wieder da!

Obwohl ich meine Mfa schon abgeben musste, will ich die dennoch weitermachen ... habe allerdings ein Problem.

@ Peter Lustig und MathiasSimmack:
Ihr wisst wohl, was ich meine.

@ Alle anderen: Ich erklärs euch.

Also ich habe ein Memo zur Eingabe und ein Memo zur verschlüsselten Ausgabe des Textes. Nun will ich aber den Ausgabetext in Viererblöcken anordnen. Also jeweils nach vier Buchstaben soll eine Leerstelle kommen.
Im Ausgabefeld klappt es auch problemlos. Nur im Eingabefeld nicht.

ausblenden volle Höhe 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:
var  ViererBlock : Integer = 0;
     KodierterText: String  = '';

procedure TForm1.KlartextKeyPress(Sender: TObject; var GedrueckteTaste: Char);
begin

   if (GedrueckteTaste in ['a'..'z', 'A'..'Z', #13, #32]) then begin

      GedrueckteTaste := UpCase(GedrueckteTaste);
      case GedrueckteTaste of

         'A'..'Z' : begin

            { Verschlüsselung }

          Inc(ViererBlock);
          if (ViererBlock >= 4) then begin
              KodierterText := KodierterText + ' ';
               Dec(ViererBlock, 4);
            end;
       
         end;
   
      end;

      Kodierung.Text := KodierterText;

   end

   else GedrueckteTaste := #0;

end;


Wie kriege ich das auch im Eingabefeld hin? So wie im Ausgabefeld jedenfalls nicht. Würde ich es so machen, käme es zu einem Durcheinander der eingegebenen Buchstaben.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 04.01.03 17:05 
Zitat:
@ Peter Lustig und MathiasSimmack:
Ihr wisst wohl, was ich meine.
Ich kann mich ganz düster dran erinnern. Das war dieser Mini-Thread, oder? :wink:

Könntest Du nicht einfach an der Stelle, an der Du an den kodierten Text ein Leerzeichen drang hängst, auch an KlarText.Text ein Leerzeichen dranhängen? Sollte gehen und sollte auch kein KeyPress-Ereignis auslösen. Hab's mal ausprobiert:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if (key in ['a'..'z', 'A'..'Z', #13, #32]) then
  begin
    if ((length(Memo1.text)+1) mod 5 =0)then
    begin
      Memo1.Text:=Memo1.Text+#32;
      Memo1.SelStart:=Length(Memo1.Text);
    end;
  end;
end;


MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.01.03 18:22 
Zitat:
Ich kann mich ganz düster dran erinnern. Das war dieser Mini-Thread, oder? :wink:

Jetzt wo du es sagst. Ich glaub der bestand nur aus 6 Seiten und ca. 100 Antworten. ^^"

Ja, das mit dem Leerzeichen hatte ich auch ausprobiert, allerdings ohne SelStart. Ist ja auch logisch, dass das noch rein muss. :oops:

Aber ein Problemchen ist da noch ... [edit] das ich selbst habe lösen können! :) [/edit]

Trotzdem noch eine Frage: Ich möchte für die "Sperrung" der ComboBoxeinträge eine TStringList verwenden. In der Delphihilfe und hier im Forum habe ich dazu auch was gefunden. Allerdings nicht, wie ich einer TStringListvariable von vornerein Werte zuordnen kann.
Wenn ich es richtig verstanden habe, dann ist eine TStringList einfach eine Art Text, bei dem jede Zeile einen Wert repräsentiert.
Klar könnte ich es mit einer Textdatei machen, aber für acht Werte eine Textdatei zu verwenden, ist mir zu dumm. Außerdem wäre es einfacher, wenn nachher zur Laufzeit ein Wert geändert wird, einen Wert in der TStrinListvariable zu ändern, als diesen erst in die Textdatei zu kopiren und dann die TStringList neu zu laden.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 04.01.03 18:37 
Mit der Methode Add kannst Du einer Stringlist während der Laufzeit neue Zeilen hinzufügen. Und mit der Eigenschaft Strings[i] kannst Du auf den i-ten String in der Liste zugreifen. Aber Achtung: dieser String muss existierten, sonst bekommst Du eine Fehlermeldung.
In der Delphihilfe steht unter Methoden noch einiges andere, was Dir helfen wird. Einfach mal durchklicken und anschauen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 06.01.03 12:44 
Danke erstmal für die Antwort!

Aber ein Problem bleibt immer noch, dass ich auch nach mehrstündigem Suchen in der Delphihilfe nicht lösen konnte.

Ich kann ja eine TStringList als (globale?) Variable definieren. var AlleWalzen : TStringlist;

Kann ich dieser globalen Variable nun auch von vornerein Werte zuweisen, wie das bei String- oder Integervariablen geht?
ausblenden Quelltext
1:
2:
3:
var Monat : String = 'Januar';
    Tag : Integer = 6;
    Allewalzen : StringList 0 "Walze Nr. " , "Walze Nr. I" , "Walze Nr. II" , "Walze Nr. III" , "Walze Nr. IV" , "Walze Nr. V" , "Walze Nr. VI" , "Walze Nr. VII" , "Walze Nr. VIII";


Vielleicht stelle ich mich auch nur dumm an, aber dazu habe ich noch nichts gefunden. Wie kann ich die Werte von Anfang an definieren?
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 06.01.03 14:41 
D0P3 F!$H hat folgendes geschrieben:
Wie kann ich die Werte von Anfang an definieren?

Wie wäre es direkt nach dem initialisieren der Variable:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
AlleWalzen := tStringList.Create;
With AlleWalzen Do
  Begin 
    Add ('Walze Nr.');
    Add ('Walze Nr. I);
    { ... }
  End;
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 06.01.03 15:38 
Ja, Tino, so hatte ich mir das auch gedacht.

Nur wollte ich wissen, ob es auch eine einfachere Lösung gibt.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 06.01.03 17:32 
@DOP3 F!$H
Mir fällt leider momentan auch keine andere Lösung ein.

Das Inititialisieren, wie Du es vorgeschlagen hast, kannst Du ja nicht anwenden, da es sich bei TStringList nicht um einen der Grunddatentypen, sondern um ein Objekt handelt, welches per Create erst erzeugt werden muss.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 15.01.03 20:52 
Also ich hab mich mal drangesetzt und bin jetzt fertig mit dem Programm.
Wenn ich mehr Zeit hab, werd ich auch weiterarbeiten, aber im Moment erstmal nicht.

Wollte gerne von euch wissen, ob es noch was am Quellcode zu verbessern gibt. Dann kann ich lernen in Zukunft besser zu programmieren.

ausblenden volle Höhe 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:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
unit Enigma;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, ExtCtrls, ComCtrls, Mask, Menus;

type
 TForm1= class(TForm)
  Klartext: TMemo;
    Kodierung: TMemo;
    BeginnWalze1: TComboBox;
    AuswahlWalze1: TComboBox;
    AuswahlWalze2: TComboBox;
    BeginnWalze2: TComboBox;
    AuswahlWalze3: TComboBox;
    BeginnWalze3: TComboBox;
    AuswahlReflektor: TComboBox;
 procedure KlartextKeyPress(Sender: TObject; var GedrueckteTaste: Char);
    procedure WalzenAuswahl(Sender: TObject);
    procedure AnfangsPositionen(Sender: TObject);
    procedure KlartextKeyDown(Sender: TObject; var GedrueckteTaste: Word; SpezialTasten: TShiftState);
 private
  { Private declarations }
 public
  { Public declarations }
 end;

var
 Form1: TForm1;
 KodierterChar: Char;
 DrehungenWalze1: Integer = 10;
 DrehungenWalze2: Integer = 15;
 DrehungenWalze3: Integer = 19;
 NummerWalze1: Integer = 2;
 NummerWalze2: Integer = 6;
 NummerWalze3: Integer = 0;
 NummerReflektor: Integer = 0;
 PositionWalze1, PositionWalze2, PositionWalze3, PositionReflektor : Integer;
 KodierterText: String  = '';
 AlleReflektoren: String  = 'YRUHQSLDPXNGOKMIEBFZCWVJATFVPJIAOYEDRZXWGCTKUQSBNMHL';
 AlleWalzen := '     EKMFLGDQVZNTOWYHXUSPAIBRCJAJDKSIRUXBLHWTMCQGZNPYFVOE
                   BDFHJLCPRTXVZNYEIWGAKMUSQOESOVPZJAYQUIRHXLNFTGKDCMWB
                    VZBRGITYUPSDNHLXAWMJQOFECKJPGVOUMFYQBENHZRDKASXLICTW
                    NZJHGRCXMYSWBOUFAIVLPEKQDTFKQHTLXOCBJSPDZRAMEWNIUYGV';
 AlleWalzenNummern:  String = '"Walze Nr. I", "Walze Nr. II", "Walze Nr. III", "Walze Nr. IV", 
                              "Walze Nr. V", "Walze Nr. VI", "Walze Nr. VII", "Walze Nr. VIII"';
 Reflektor: String  = 'YRUHQSLDPXNGOKMIEBFZCWVJAT';
 Walze1: String  = 'BDFHJLCPRTXVZNYEIWGAKMUSQO';
 Walze2: String  = 'NZJHGRCXMYSWBOUFAIVLPEKQDT';
 Walze3: String  = 'EKMFLGDQVZNTOWYHXUSPAIBRCJ';
 AngezeigteWalzen: TStringList;

implementation
{$R *.dfm}

function Verschluesselung(Buchstabe: Char; WalzenDrehungen: Integer; Walze, Status: String): Char;
var WalzenPosition: Integer;
begin
 if (Status = 'Hinweg') then WalzenPosition := Ord(Buchstabe) - 64 + WalzenDrehungen
 else WalzenPosition := Pos(Buchstabe, Walze) + (26 - WalzenDrehungen);
 if (WalzenPosition >= 27) then Dec(WalzenPosition, 26);
 if (Status = 'Hinweg') then Result := Walze[WalzenPosition]
 else Result := Chr(WalzenPosition + 64);
end;

procedure TForm1.KlartextKeyPress(Sender: TObject; var GedrueckteTaste: Char);
begin
 if (GedrueckteTaste in ['a'..'z', 'A'..'Z', #13, #32]) then begin
  if (KodierterText = '') then begin
   AuswahlReflektor.Enabled := false;
   AuswahlWalze1.Enabled := false;
   AuswahlWalze2.Enabled := false;
   AuswahlWalze3.Enabled := false;
   BeginnWalze1.Enabled := false;
   BeginnWalze2.Enabled := false;
   BeginnWalze3.Enabled := false;
  end;
  GedrueckteTaste := UpCase(GedrueckteTaste);
  case GedrueckteTaste of
   'A'..'Z' : begin

    KodierterChar := Verschluesselung(GedrueckteTaste, DrehungenWalze1, Walze1, 'Hinweg');
    KodierterChar := Verschluesselung(KodierterChar, DrehungenWalze2, Walze2, 'Hinweg');
    KodierterChar := Verschluesselung(KodierterChar, DrehungenWalze3, Walze3, 'Hinweg');

    KodierterChar := Verschluesselung(KodierterChar, 0, Reflektor, 'Hinweg');

    KodierterChar := Verschluesselung(KodierterChar, DrehungenWalze3, Walze3, 'Rückweg');
    KodierterChar := Verschluesselung(KodierterChar, DrehungenWalze2, Walze2, 'Rückweg');

    if ((Length(Klartext.text) + 1) mod 5 = 0) then begin
     KodierterText := KodierterText + ' ' + Verschluesselung(KodierterChar, DrehungenWalze1, Walze1, 'Rückweg');
     Klartext.Text := Klartext.Text + ' ';
     Klartext.SelStart := Length(Klartext.Text);
    end
    else KodierterText := KodierterText + Verschluesselung(KodierterChar, DrehungenWalze1, Walze1, 'Rückweg');

    if (DrehungenWalze1 >= 27) then begin
     Dec(DrehungenWalze1, 26);
     Inc(DrehungenWalze2);
    end
    else Inc(DrehungenWalze1);
    if (DrehungenWalze2 >= 27) then begin
     Dec(DrehungenWalze2, 26);
     Inc(DrehungenWalze3);
    end;
    if (DrehungenWalze3 >= 27) then Dec(DrehungenWalze3, 26);
    end;

   #13 : KodierterText := KodierterText + #13#10;

   #32 : KodierterText := KodierterText + ' ';
  end;

  Kodierung.Text := KodierterText;

  with Kodierung do begin
   SelStart := Length(Kodierung.Text);
   SendMessage(Kodierung.Handle, EM_Scrollcaret, 0, 0);
  end;

 end
 else GedrueckteTaste := #0;
end;

procedure TForm1.WalzenAuswahl(Sender: TObject);
var i, WalzenNummer : Integer;
    AusgewaehlteWalze : String;
begin
 AlleReflektoren := 'YRUHQSLDPXNGOKMIEBFZCWVJATFVPJIAOYEDRZXWGCTKUQSBNMHL';
 AlleWalzen := '     EKMFLGDQVZNTOWYHXUSPAIBRCJAJDKSIRUXBLHWTMCQGZNPYFVOE
                   BDFHJLCPRTXVZNYEIWGAKMUSQOESOVPZJAYQUIRHXLNFTGKDCMWB
                    VZBRGITYUPSDNHLXAWMJQOFECKJPGVOUMFYQBENHZRDKASXLICTW
                    NZJHGRCXMYSWBOUFAIVLPEKQDTFKQHTLXOCBJSPDZRAMEWNIUYGV';
 if TComboBox(Sender).Name = 'AuswahlReflektor' then 
   for i := 1 to 26 do Reflektor[i] := AlleReflektoren[i + 26 * AuswahlReflektor.ItemIndex]
 else begin
  AngezeigteWalzen := TStringList.Create;
  try
   AngezeigteWalzen.LoadFromFile('WalzenListe.txt');
   AusgewaehlteWalze := TComboBox(Sender).Items[TComboBox(Sender).ItemIndex];
   WalzenNummer := AngezeigteWalzen.IndexOf(AusgewaehlteWalze);
   if TComboBox(Sender).Name = 'AuswahlWalze1' then begin
    AngezeigteWalzen.Delete(AuswahlWalze2.ItemIndex);
    AngezeigteWalzen.Delete(AuswahlWalze3.ItemIndex);
    for i := 1 to 26 do Walze1[i] := AlleWalzen[i + 26 * WalzenNummer];
   end;

   if TComboBox(Sender).Name = 'AuswahlWalze2' then begin
    AngezeigteWalzen.Delete(AuswahlWalze1.ItemIndex);
    AngezeigteWalzen.Delete(AuswahlWalze3.ItemIndex);
    for i := 1 to 26 do Walze2[i] := AlleWalzen[i + 26 * WalzenNummer];
   end;

   if TComboBox(Sender).Name = 'AuswahlWalze3' then begin
    AngezeigteWalzen.Delete(AuswahlWalze1.ItemIndex);
    AngezeigteWalzen.Delete(AuswahlWalze2.ItemIndex);
    for i := 1 to 26 do Walze3[i] := AlleWalzen[i + 26 * WalzenNummer];
   end;
   TComboBox(Sender).Items := AngezeigteWalzen;
   TComboBox(Sender).ItemIndex := TComboBox(Sender).Items.IndexOf(AusgewaehlteWalze);
  finally
   AngezeigteWalzen.Free;
  end;
 end;
end;

procedure TForm1.AnfangsPositionen(Sender: TObject);
begin
 if TComboBox(Sender).Name = 'BeginnWalze1' then DrehungenWalze1 := BeginnWalze1.ItemIndex;
 if TComboBox(Sender).Name = 'BeginnWalze2' then DrehungenWalze2 := BeginnWalze2.ItemIndex;
 if TComboBox(Sender).Name = 'BeginnWalze3' then DrehungenWalze3 := BeginnWalze3.ItemIndex;
end;

procedure TForm1.KlartextKeyDown(Sender: TObject; var GedrueckteTaste: Word; SpezialTasten: TShiftState);
begin
 if (GedrueckteTaste in [vk_Down, vk_Home, vk_Left, vk_Next, vk_Prior, vk_Right, vk_Up]) or 
   (ssShift in SpezialTasten) or (ssAlt in SpezialTasten) or (ssCtrl in SpezialTasten) then GedrueckteTaste := 0;
end;

end.
Ist die Frage beantwortet? Das Problem gelöst?

Dann klicke hier, um das Thema entsprechend zu markieren!