Autor |
Beitrag |
Method_Man
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.10.04 17:01
Hi Leute!
Ich weiss nicht wie ich es erreichen kann, dass mir das Programm bei jedem Click auf SpeedButton1 ein anderen Buchstaben zeigt und spricht.
Jetzt wenn ich auf SpeedButton1 clicke zeigt er mir nur den letzten Buchstaben an.
Was müsste ich dazwischen schreiben, dass er nur bei jedem Click wechselt?
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:
| procedure TForm1.SpeedButton1Click(Sender: TObject); begin Edit1.text:='A'; Edit1.text:='B'; Edit1.text:='C'; Edit1.text:='D'; Edit1.text:='E'; Edit1.text:='F'; Edit1.text:='G'; Edit1.text:='H'; Edit1.text:='I'; Edit1.text:='J'; Edit1.text:='K'; Edit1.text:='L'; Edit1.text:='M'; Edit1.text:='N'; Edit1.text:='O'; Edit1.text:='P'; Edit1.text:='Q'; Edit1.text:='R'; Edit1.text:='S'; Edit1.text:='T'; Edit1.text:='U'; Edit1.text:='V'; Edit1.text:='W'; Edit1.text:='X'; Edit1.text:='Y'; Edit1.Text:='Z'; Timer.Interval := 500; Timer.Tag := 0; Timer.Enabled := True; end; |
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Mi 27.10.04 17:04
Dein Ansatz ist falsch. Du musst eine globale Variable nehmen, die initialisierst du mit 64 (Ascii-Code vom großen A). Ich nenn sie mal Counter. Und dann muss ins OnClick folgendes:
Delphi-Quelltext 1: 2: 3: 4:
| begin Edit1.Text:=chr(Counter); Inc(Counter); end; |
Gruß,
Jörg
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
Method_Man
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 27.10.04 22:59
Hi Chef danke für deine Antwort.
Aber ich verstehe deine Methode nicht.
Hier noch mal alles.
Wenn ich jetzt auf Button1 clicke zeigt er mir Z an und spricht auch gleichzeitig Z aus.
Ich möchte aber das er mir zuerst A anzeigt und gleichzeitig auspricht, dann beim nächsten click B usw.
Wie kann ich das erreichen, ich denke es geht einfacher, denn deine Lösung habe ich nicht verstanden.
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:
| unit uMain;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, OleCtrls, ACTIVEVOICEPROJECTLib_TLB;
type TForm1 = class(TForm) Edit1: TEdit; Bevel1: TBevel; Button1: TButton; Image1: TImage; Bevel2: TBevel; DirectSS1: TDirectSS; SpeedButton1: TSpeedButton; Timer: TTimer; procedure FormPaint(Sender: TObject); procedure Button1Click(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure TimerTimer(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.DFM} {$R hbild.res}
procedure TForm1.Button1Click(Sender: TObject); begin form1.timer.Enabled:=true; end;
procedure TForm1.FormPaint(Sender: TObject); var Bmp: TBitmap; x, y: Word; begin Bmp := TBitmap.Create; try Bmp.LoadFromResourceName(HInstance,'LOTTO'); if (Bmp.Width = 0) or (Bmp.Height = 0) then Exit; for x := 0 to ClientWidth div Bmp.Width do for y := 0 to ClientHeight div Bmp.Height do Canvas.Draw(x * Bmp.Width, y * Bmp.Height, Bmp); finally Bmp.Free end; end;
procedure TForm1.SpeedButton1Click(Sender: TObject); begin Timer.Interval := 500; Timer.Tag := 0; Timer.Enabled := True; end;
procedure TForm1.TimerTimer(Sender: TObject); begin Edit1.text:='A'; Edit1.text:='B'; Edit1.text:='C'; Edit1.text:='D'; Edit1.text:='E'; Edit1.text:='F'; Edit1.text:='G'; Edit1.text:='H'; Edit1.text:='I'; Edit1.text:='J'; Edit1.text:='K'; Edit1.text:='L'; Edit1.text:='M'; Edit1.text:='N'; Edit1.text:='O'; Edit1.text:='P'; Edit1.text:='Q'; Edit1.text:='R'; Edit1.text:='S'; Edit1.text:='T'; Edit1.text:='U'; Edit1.text:='V'; Edit1.text:='W'; Edit1.text:='X'; Edit1.text:='Y'; Edit1.Text:='Z';
Timer.Tag := Timer.Tag + 1;
DirectSS1.Speak(TEdit(FindComponent('Edit' + IntToStr(Timer.Tag))).Text);
if Timer.Tag >= 6 then Timer.Enabled := False; end;
end. |
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Mi 27.10.04 23:12
Method_Man hat folgendes geschrieben: | Ich möchte aber das er mir zuerst A anzeigt und gleichzeitig auspricht, dann beim nächsten click B usw. |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.SpeedButton1Click(Sender: TObject); {$J+} const Counter: Byte = 64; {$J-} begin
Inc(Counter);
if Counter > 90 then Counter := 65;
Edit1.Text := Chr(Counter);
end; |
_________________ Ciao, Sprint.
|
|
Alni
      
Beiträge: 205
Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
|
Verfasst: Mi 27.10.04 23:51
Sprint hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.SpeedButton1Click(Sender: TObject); {$J+} const Counter: Byte = 64; {$J-} begin
Inc(Counter);
if Counter > 90 then Counter := 65;
Edit1.Text := Chr(Counter);
end; | |
der Compilerschalter J ist zur Abwärtskompatibilität mit Delphi 1.0 gedacht nicht mehr und nicht weniger, wenn man kein Delphi 1.0 braucht sollte man ihn auch wieder vergessen. Du definierst eine [b]Konstante und veränderst sie dann, dass das gar nicht schön ist sollte doch klar sein, da ist selbst eine globale Variable noch wesentlich schöner.
_________________ MfG Alex
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Do 28.10.04 00:06
Alni hat folgendes geschrieben: | Du definierst eine Konstante und veränderst sie dann, dass das gar nicht schön ist sollte doch klar sein, da ist selbst eine globale Variable noch wesentlich schöner. |
Was soll daran nicht schön sein? Durch die Direktive $J ist es keine feste Konstante mehr, sondern eine statische Variable die aber bei Borland heißt es halt anders. Weil's hier ja um (Object) Pascal geht und nicht um Visual Basic oder Visual C++. Jetzt zeig mir doch mal bitte einen Auszug aus der Delphi Hilfe, das das so nicht korrekt ist!
_________________ Ciao, Sprint.
|
|
Alni
      
Beiträge: 205
Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
|
Verfasst: Do 28.10.04 00:12
Delphi-hilfe hat folgendes geschrieben: |
Enable this for backward compatibility with Delphi 1.0 on Windows. When enabled, the compiler allows assignments to typed constants. ...
In early versions of Delphi and Borland Pascal, typed constants were always writeable, corresponding to the {$J+} state. Old source code that uses writeable typed constants must be compiled in the {$J+} state, but for new applications it is recommended that you use initialized variables and compile your code in the {$J-} state.
|
_________________ MfG Alex
Zuletzt bearbeitet von Alni am Do 28.10.04 00:14, insgesamt 1-mal bearbeitet
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Do 28.10.04 00:14
Und wo steht nun das man das nicht machen sollte?
_________________ Ciao, Sprint.
|
|
Alni
      
Beiträge: 205
Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
|
Verfasst: Do 28.10.04 00:15
Habs extra dick markiert. Soll ich es übersetzen?
_________________ MfG Alex
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Do 28.10.04 00:49
Änderbare typisierte Konstanten sind für mich wie statische Variablen in anderen Sprachen. Ich sehe keinen Grund diese nicht zu benutzen. Natürlich kann ich auch eine globale Variable deklarieren. Aber in diesem Fall finde ich es sinnvoller es nicht zu tun.
Auszug aus meiner Delphi Hilfe:
Zitat: | Die Direktive $J legt fest, ob typisierte Konstanten geändert werden können. Im Status {$J+} ist eine Änderung möglich. Typisierte Konstanten sind in diesem Fall mit initialisierten Variablen vergleichbar. Im Status {$J-} sind typisierte Konstanten tatsächlich konstant. Jeder Versuch, sie zu ändern, führt zu einer Fehlermeldung durch den Compiler.
Als schreibbar werden typisierte Konstanten bezeichnet, die zur Laufzeit als Variablen verwendet und somit geändert werden können. Ein Beispiel:
const
foo: Integer = 12;
begin
foo := 14;
end.
Im Status $WRITEABLECONST OFF führt dieser Quelltext bei der Zuweisung an die Variable foo im begin..end-Block zu einem Compiler-Fehler. Sie können das Problem beheben, indem Sie foo nicht als const, sondern als var deklarieren.
In den früheren Versionen von Delphi und Borland Pascal konnten typisierte Konstanten immer geändert werden (wie im Status {$J+}). Deshalb muss älterer Quelltext, der änderbare typisierte Konstanten enthält, im Status {$J+} compiliert werden. |
Hier lese ich niergends das ich keine änderbare typisierte Konstanten benutzen soll. Im Gegenteil, ich werde sogar dadurch angeregt sie zu benutzen.
Ich habe bis jetzt noch keinen Grund gefunden, warum ich sie nicht benutzen sollte. Warum sollte ich auch eine Variable die ausschließlich nur einer Prozedur benutzt wird global deklarieren. Nein, das mache ich lokal. Und wenn ich den Wert beim nächsten Aufruf wieder brauche, dann nehme ich halt eine statische Variable. Und das geht so wie ich es gezeigt habe.
Edit: Hier die Lösung mit der globalen Variable...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Counter: Byte = 64;
procedure TForm1.SpeedButton1Click(Sender: TObject); begin
Inc(Counter);
if Counter > 90 then Counter := 65;
Edit1.Text := Chr(Counter);
end; |
Jetzt kann sich der Fragesteller ja aussuchen was er benutzen möchte.
_________________ Ciao, Sprint.
|
|
Alni
      
Beiträge: 205
Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
|
Verfasst: Do 28.10.04 01:40
Ich frage mich warum gerade der letzte Satz in der deutschen Hilfe weggelassen wurde, ich selber hab nur die englische Version. Und grundsätzlich gehe ich davon aus, dass die englische weniger inhaltliche Fehler enthält. In dieser wird nun mal empfohlen in neuen Anwendungen darauf zu verzichten. Gründe werden nicht genannt aber ich denke da an folgende:
Zum einen kann der Schalter eventuell abgeschafft werden, er ist ja nur zur Abwärtskompatibilität. Keine Ahnung ob aber vielleicht geht das in delphi 8 schon nicht mehr. Zweitens es ist eine Konstante und der Name hat seinen Grund. Und nur weil man etwas irgendwie machen kann wird es nicht besser. Drittens ist es eine Frage der internen Darstellung. Ich kann mir gut vorstellen, dass intern aus der const mit Compilerschalter eine globale Variable wird (Nur vom Compiler nicht vom Parser). Ich werde leider nicht von deinem Auszug aus der "Delphi-Hilfe" angeregt den Schalter zu verwenden. Im Gegensatz dazu wird mir im letzten Satz der englischen Hilfe, die bis auf diesen mit der deutschen übereinstimmt, explizit davon abgeraten. Ich wollte ausserdem keinesfalls sagen, dass die globale Variante eine gute Alternative wäre nur eine, meiner Meinung nach, bessere. Eine gute Lösung wäre echte OOP in der man die Benutzeroberfläche von internen Funktionen und Variablen trennt und dabei nur Variablen in Objekten verwendet.
Es ist eben eine Frage des Programmierstils und dabei sollte man sich an die Empfehlungen von Borland halten. Eine solche statische Variable ist während der gesamten Programmlaufzeit aktiv und damit gehört die Deklaration eigentlich schon nicht mehr in eine Funktion.
Ausserdem sollte man auch keine alten Programmierkonstrukte verwenden, die nur beibehalten werden um Kompatibilität herzustellen. Das führt sonst nur zu Problemen wie bei C/C++. In C++ kann man nur deshalb c programme/teile verwenden damit der Umstieg von C auf C++ leichter fällt, und nicht weil es Sinn macht. Aber ich will nicht philosphieren und bin auch schon weit off topic.
_________________ MfG Alex
|
|
|