Autor Beitrag
Evil-Zwergie
Hält's aus hier
Beiträge: 15

win xp
Delphi
BeitragVerfasst: Mo 23.03.09 09:25 
hallo liebe community
ich hab folgendes problem:
hab ein Editfeld und buttons von 0-9(geben diese zahlen im edit wieder)

nun möchte ich eine zahlenkette schreiben können(bei mir wird der wert gelöscht und neuer geschrieben)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
{ord(key):= ord('0');
Form1.Edit1.text := inttostr(ord(key));
while ord(key)> ord(0) do
ord(key) := 10*key + ord(key)-ord(0); }

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
With form1.edit1 do
text := Chr(49)
end;

nur ein kleiner ausschnitt!
- mein edit (zur zeit ausgestellt)
- button für die zahl 1

vielen dank für die bearbeitung im voraus

Moderiert von user profile iconNarses: Titel geändert.
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 23.03.2009 um 11:16
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 23.03.09 09:31 
Also mir fällt grad nur folgendes ein:

ausblenden Delphi-Quelltext
1:
 Form1.Edit1.Text := Form1.Edit1.Text + inttostr(Beliebiger Wert);					


oder was noch funktioniert, allerdings Denke ich sprengt das den Rahmen:

ausblenden Delphi-Quelltext
1:
 PostMessage(Form1.Edit1.Handle, WM_KEYDOWN, VK_NUMPAD1, 0);					


damit würdest du dann einen Tastendruck im Editfeld simulieren.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 23.03.09 11:21 
Moin!

Lösche mal alle deine Ereignismethoden für die Buttons. Dann machst du einen Doppelklick auf dem ersten Button und fügst diesen Code ein:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text :=  Edit1.Text +(Sender as TButton).Caption;
end;
Dann wählst du den zweiten Button aus, drückst Shift (festhalten) und markierst alle weiteren Buttons dazu. Jetzt im ObjektInspektor beim Ereignis OnClick aus dem Dropdownmenü die Methode des ersten Buttons (für alle anderen) einstellen. Damit wird bei einem Klick auf einen der Buttons immer diese eine Methode aufgerufen.

In der Methode bekommst du im Parameter Sender das Control übergeben, welches das Ereignis ausgelöst hat. Wir gehen mal davon aus, dass das hier nur ein Button tut und lesen dann dessen Beschriftung aus, um diese zum Editfeld hinzuzufügen. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Di 24.03.09 09:52 
Hi,

folgendes wäre noch möglich dann müsstest du dich auch nicht um die Onclick Ereignisse kümmern:
ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
 
  private
    procedure Btn_Zahl_Add(var MyHandle: HWND);
    Procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
  public
  // usw

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  // Prüft ob Message = Tastendruck und die Taste (Enter oder Leer)
  if (msg.message = WM_KEYDOWN) then
    if (Msg.wParam = vk_Return) or (Msg.wParam = VK_SPACE) then
      Btn_Zahl_Add(msg.Hwnd);
  // Prüft ob Message = LinkerMaustastendruck
  if (msg.message = WM_LBUTTONDOWN) or (msg.message = WM_LBUTTONDBLCLK) then
    Btn_Zahl_Add(msg.HWND);
end;

procedure TForm1.Btn_Zahl_Add(var MyHandle: HWND);
var mysender: TObject;
var SNDCPT: String;
begin
  // Prüft ob das Handle ein TButton ist fals ja ob die Caption zwischen 0 - 9 liegt
     fügt den Text hinzu
  mysender := FindControl(MyHandle);
  try
    SNDCPT := (mysender as TButton).Caption;
    if (StrToInt(SNDCPT) >= 0) and (StrToInt(SNDCPT) <= 9) then
      Edit1.Text := Edit1.Text + SNDCPT;
  except
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
end;


Das ganze hat den Vorteil das du dich danach um nichts mehr Kümmern musst fals du einen Button rausnimmst hinzufügst oder ähnliches. Soll auch ein Koma oder ähnliches hinzugefügt werden musst du das bei der if Frage beachten z.b.
ausblenden Delphi-Quelltext
1:
 SNDCPT = ',' then ....					


mfg nic
Evil-Zwergie Threadstarter
Hält's aus hier
Beiträge: 15

win xp
Delphi
BeitragVerfasst: Mo 30.03.09 08:31 
das wird wohl etwas zu aufwendig für meinen unterricht sein^^
hab die version narses genommen

thx an alle die geantwortet ham
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 30.03.09 08:58 
Dachte ich mir dann auch, für den Unterricht? Dann ist sie zu komplex stimmt. Bitteschön =)

mfg nic
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 30.03.09 09:41 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
 
26:
27:
28:
29:
30:
31:
{ ... }
  try
    SNDCPT := (mysender as TButton).Caption;
    if (StrToInt(SNDCPT) >= 0) and (StrToInt(SNDCPT) <= 9) then
      Edit1.Text := Edit1.Text + SNDCPT;
  except
  end;

Wenn du schon solche hochkomplexen Codekonstruktionen postest, könnte man doch erwarten, dass auch die Typenumwandlung sauber geschrieben ist - aber nein, du lässt das Auto lieber erstmal gegen die Wand fahren, nur um den Hilfeschrei des Insassen zu ignorieren :roll:

Besser wäre:
ausblenden Delphi-Quelltext
1:
2:
3:
SNDCPT := (mysender as TButton).Caption;
if (StrToIntDef(SNDCPT, -1) >= 0) and (StrToIntDef(SNDCPT, 10) <= 9) then
  Edit1.Text := Edit1.Text + SNDCPT;
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 30.03.09 11:10 
Nope du hast da was falsch verstanden. :wink:

Das Try except ist mit absicht gewählt.
Wenn du deine Jetzt testen würdest hättest du ruck zuck ein Error. =)
( außer das Try except soll da noch ausenrum stehen )
Muss dazu sagen das ich das kurz abgetippt habe und da passieren flüchtigkeits Denkfehler danke für deinen Hinweis.
In dem moment dachte ich sicher wenn ich schon ein Try except habe kann ich das auch so lösen. ^^
Wenn du es so meinst klar:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
   
try    SNDCPT := (mysender as TButton).Caption;    
if (StrToIntDef(SNDCPT, -1) >= 0) and (StrToIntDef(SNDCPT, 10) <= 9) then   
  Edit1.Text := Edit1.Text + SNDCPT;  
except  
end;


Frage am Rande programmiere erst seit 6 Monaten, vorher nie was damit zu tun gehabt und was empfiehlt sich?
Try except oder deine Variante was ist verträglicher ? bzw. schneller?

mfg Nic

ps: Man lernt immer wieder was neues :D
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 30.03.09 11:22 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Das Try except ist mit absicht gewählt.

Das hätte ich mir fast gedacht ;)

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du deine Jetzt testen würdest hättest du ruck zuck ein Error. =) ( außer das Try except soll da noch ausenrum stehen )

Nur, um das nochmal klar zu stellen: Jede Exception ist ein Fehler. Ein try ... except end; versteckt ihn nur, aber er tritt trotzdem auf, und solch ein Konstrukt ist ehr unsauber (mir hat das auch erstmal einer erklären müssen, vorher hab ich genau das gleiche auch gemacht ;))

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
   
try    SNDCPT := (mysender as TButton).Caption;    
if (StrToIntDef(SNDCPT, -1) >= 0) and (StrToIntDef(SNDCPT, 10) <= 9) then   
  Edit1.Text := Edit1.Text + SNDCPT;  
except  
end;

Nein, lass das try ... except end; weg. Ich hab mir nicht genau angeschaut, wo noch ein Fehler auftreten kann, aber jetzt fällt es mir auch auf: Du prüfst nicht, ob mysender auch ein Button ist. Stattdessen quetschst du es in die Vorlage eines Buttons, und erst wenn es von selber wieder herausspringt, lässt du es sein. Stattdessen könntest du einfach mal beide - mysender und TButton anschauen, und herausfinden, ob die ineinanderpassen. Das geht so:

ausblenden Delphi-Quelltext
1:
if mysender is TButton then ...					

Jetzt brauchst du auch gar keine Fehlerbehandlung mehr, denn es sollten keine mehr auftreten (außer natürlich echter Ausnahmen ;)).

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Frage am Rande programmiere erst seit 6 Monaten, vorher nie was damit zu tun gehabt und was empfiehlt sich?
Try except oder deine Variante was ist verträglicher ? bzw. schneller?

try RaiseAnException except end; ist nicht nur unsauber, sondern auch etwas langsamer, da ein Ausnahmefall auftritt und Delphi das nötige einleitet. Obwohl es gar nicht nötig wäre. Also, zum merken: In die except-Klausel gehört immer etwas rein. Sonst macht das ganze keinen Sinn.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 30.03.09 12:49 
Super, Vielen dank für die Erklärung dann werde ich in zukunft darauf achten.
Klingt auch sehr einleuchtend. :P
(Mysender is Tbutton) danach hab ich verzweifelt gesucht... hatte von dem ganzen vorher keine Ahnung :P hab mir das über die Delphi Hilfe zusammen gebastelt und nichts gefunden um das ganze zu prüfen.

Aber ich bin ja froh wenn ich was lernen kann.
Funktioniert auch einwandfrei mit deiner Methode. :)
Eine Frage zwingt sich mir schon länger auf und zwar:

Kann man herausfinden welche Klasse mysender ist? (Also Tbutton oder Trichedit usw... )
Vielleicht hat darauf ja noch jemand eine Antwort.

mfg nic
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 30.03.09 13:13 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Kann man herausfinden welche Klasse mysender ist? (Also Tbutton oder Trichedit usw... )

mysender.ClassType, mysender.ClassName :lupe: :les: :think: ;)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 30.03.09 13:17 
Moin!

@user profile iconthepaine91: bitte erstelle für eine neue Frage auch ein neues Topic, da die Diskussion mehrerer Fragen in einem Topic für gewöhnlich für Verwirrung und Durcheinander sorgt. Daher:
*geschlossen*
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.