Autor Beitrag
GiuStyler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mo 22.09.14 14:05 
Hallo Leute,

wie im anderen Thread bereits besprochen (da ging es aber Hauptsächlich um die if-Verknüpfungen), habe ich immer noch einen Problem mit meinem Taschenrechner.

Ich habe nun fast zwei Wochen schon Versucht den Fehler bzw. den Code hinzubekommen, damit die Tasten der Tastatur das machen, was Sie machen sollen.

Habe nun die Datei inkl. exe mal eingefügt, damit man sehen kann wo das Problem liegt, wenn man es mit der Tastatur bedient.

im Endeffekt geht es nur darum, wie kriege ich es hin, dass das (,) nur einmal kommt, wenn es nicht vorhanden ist und wenn es vorhanden ist nicht mehr möglich ist dieses zu benutzen.

Mein Taschenrechner ist etwas unkonventionell. Bitte dies mal aussen vor lassen, da mein Taschenrechner zuerst nur aus dem oberen Teil bestand und dann noch die Buttons hinzukamen. Diese Funktionieren aber alle Einwadnfrei.

Es geht Hauptsächlich um diesen Codeabschnitt.

ausblenden Delphi-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:
procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; Eingabe: string);
begin
  if Length(Eingabefeld.Text) <= 9 then
    begin
      if (Eingabe = ','then
        if (pos (',',Eingabefeld.Text) > 0then
          Eingabe := '';
          if ((Eingabefeld.Text = ''and ((Eingabe = '0'or (Eingabe = ','))) then
              Eingabefeld.Text := '0,'
              else
              Eingabefeld.Text := Eingabefeld.Text+Eingabe;
    end;
end;

// Eigenschaften und Funktionen für die Button

// ANFANG - Eigenschaften für die Tastatur

procedure TFormTaschenrechner.EditZahlKeyPress(Sender: TObject;  var Key: Char);
begin
  Zeichenhinzu(TEdit(Sender), Key);
end;

// Eigenschaften für die Tastatur - ENDE


Der Code den man sieht ist das für die Buttons, aber dort muss nun auch der Code für die Tastatur hin, nur das kriege ich nicht wirklich so hin, dass es klappt. Kann mir da jemand sagen wie es sein soll. Den langsam raucht mein Kopf zuviel.

Wichtig ist, dass es entweder mit array of string oder array of Char gemacht wird, aber habe keine Idee wie.

PS: Blub, dein Vorschlag hat irgendwie nicht bei mir funktioniert oder ich habe sachen vergessen zu verändern.

PS²: Eigentlich wollte ich lange schon meinen Chef fragen, aber der ist immer noch auf Geschäftsreise da sich der Aufenthalt verlängert hat.

Mit freundlichen Grüßen
Einloggen, um Attachments anzusehen!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6388
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 22.09.14 14:31 
Ändere mal diese Zeile:
ausblenden Delphi-Quelltext
1:
procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; Eingabe: string);					

in
ausblenden Delphi-Quelltext
1:
procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; var Eingabe: string);					


In deinem Source setzt du zwar den Parameter "Eingabe" auf Leerstring (""), aber da es kein Var-Parameter ist, wird dieser Wert nicht an die KeyPress-Methode zurück gegeben. Dadurch wird dann trotzdem das Komma gesetzt.

Das müsste meiner Meinung nach das Problem beheben. Habe aber gerade kein Delphi zur Verfügung, um das zu prüfen.
GiuStyler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mo 22.09.14 14:35 
Hallo jasocul,

wenn ich das oben ändere, dann tauchen nach und nach überall im Code Fehler auf, denke nicht das es so sein sollte.

Mit freundlichen Grüßen
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6388
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 22.09.14 14:38 
Hallo GiuStyler,

hast du die Methode auch in deiner Klasse angepasst? Die Klassendeklaration muss natürlich damit übereinstimmen.
GiuStyler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mo 22.09.14 14:41 
Ich habe es im (type) geändert, dann in der (procedure), wenn ich dann starte taucht im case Bereich der Buttons ein Fehler auf

[dcc32 Fehler] aHaupt.pas(208): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

in diesem Bereich

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TFormTaschenrechner.ButtonZahlClick(Sender: TObject); // Button für die Zahlenfelder
begin
  if (Sender is TButton) then
    case (Sender as TButton).Tag  of
      0,1,2,3,4,5,6,7,8,9,21 : Zeichenhinzu(EditZahlA, TButton(Sender).Caption);
      10,11,12,13,14,15,16,17,18,19,22 : Zeichenhinzu(EditZahlB, TButton(Sender).Caption);
    end;
end;


ob weitere Fehler auftauchen weis ich nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6388
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 22.09.14 14:56 
OK, das liegt daran, dass die Parameter unterschiedliche Typen sind.
Ich würde es so lösen, dass ich zwei Methoden verwende. Die können sogar den selben Namen haben, da sie sich in den Parametern unterscheiden würden. Aber wenn du von "overload" noch nichts gehört hast, nimm 2 unterschiedliche Namen.

Due brauchst eine Methode, die als Var-Parameter einen Char übergeben bekommt. Also genauso, wie bei KeyPress. Du hast dort einen String. Das geht mit einem Var-Parameter nicht. Da müssen die Typen gleich sein. Es gibt auch noch andere Möglichkeiten, aber das würde an dieser Stelle zu weit führen.

Deine bisherige Methode kannst du so lassen.

Wichtig ist, dass die beiden Methoden im richtigen Kontext einsetzt. Beim KeyPress muss es diejenige mit dem Char sein. Die andere Methode sollte an den anderen Stellen benutzt werden, wo du keinen Rückgabe-Werte verarbeiten musst.

Ohne Delphi kann ich dir jetzt nicht mehr viel weiter helfen, aber ich hoffe, dass ich dich damit in die richtige Richtung stoßen konnte.
GiuStyler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mo 22.09.14 15:42 
Jain, ich bin noch relativ neu mit Delphi.

Was meinst Du mit Methode?
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mo 22.09.14 16:37 
Eine Methode ist eine Prozedur oder Funktion, die zu einer Klasse gehört. Wenn Du Deine Methode nun so deklariert hast:
ausblenden Delphi-Quelltext
1:
procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; var Eingabe: string);					

kannst Du keine Eigenschaft wie TButton.Caption direkt übergeben, sondern brauchst dafür eine Zwischenvariable.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TFormTaschenrechner.ButtonZahlClick(Sender: TObject); // Button für die Zahlenfelder
var
  Speicher: string;
begin  
  if (Sender is TButton) then
    begin
      Speicher := TButton(Sender).Caption;
      case (Sender as TButton).Tag  of
        0,1,2,3,4,5,6,7,8,9,21
          begin
            Zeichenhinzu(EditZahlA, Speicher);
            TButton(Sender).Caption := Speicher;
          end;
        10,11,12,13,14,15,16,17,18,19,22:
          begin
            Zeichenhinzu(EditZahlB, Speicher);
            TButton(Sender).Caption := Speicher;
          end;
      end;
    end;
end;
GiuStyler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mo 22.09.14 16:48 
Ah ok. Verstehe,

aber Leider behebt das nicht mein Problem was ich habe mit der Tastatur. Das komma wird immer noch unzählige male gemacht.


Edit: 23.09

Evtl. hat man mich Falsch verstanden. Ich brauche das gleiche wie im Zeichenhinzu nur eben bezogen auf die Tastatur und das muss wiederum in dem Zeichenhinzu intigriert werden. Kann mir da jemand helfen?
GiuStyler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Di 23.09.14 10:32 
Nach langem probieren, habe ich es endlich geschafft das, dass (,) auch über die Tastatur nur einmal erscheint und zwar so

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TFormTaschenrechner.EditZahlKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = '.' then
      Key := ',';
  if Key = ',' then
    if (pos(',', (Sender as TEdit).Text) > 0then
        Key := #0;
  if not (Key in [#8'0'..'9'',']) then
    Key := #0;
end;


Ich weiß zwar nun nicht ob die Reihenfolge richtig ist, aber es funktioniert. Meine Frage nun wie kriege ich es den hin, wenn das Feld leer ist und man zuerst ein (,) oder eine (0) drückt, dass automatisch (0,) erscheint?

Kann mir da jemand helfen, bevor ich wieder ne Weile dran sitze?
GiuStyler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mi 24.09.14 15:42 
Hm. Kann mir keiner ein Rat geben oder helfen? Es fehlt mir nur noch das eine.

MfG
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mi 24.09.14 16:21 
Schreib doch einen Ereignishandler für OnChange des Edits. Wenn da nur ',' oder '0' drinsteht, änderst Du den Text eben.
GiuStyler Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mi 24.09.14 16:43 
Das Problem ist ja, dass ja nicht vorher schon (0) oder (,) steht. Erst mit dem drücken der Taste auf der Tastatur soll ja (0,) erscheinen. Kann ich es dann trotzdem machen mit dem OnChange.

Wir schon mal erwähnt ich arbeite erst seit knapp 1,5 Monate mit Delphi.

MfG
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mi 24.09.14 16:58 
Versuch macht klug ;)