Delphi Abfrage der aktuell angeklickten Komponente

Br0t

Lieutenant
Registriert
Sep. 2006
Beiträge
799
Hey!
Ich habe folgendes Problem: Ich möchte einen Rechner für Brüche schreiben, der diese anschließend auch wieder in Nenner + Zähler ausgibt. Aufgrund der 4 Edit-eingabe-Felder (2x Nenner, 2x Zähler) habe ich nun das Problem, dass ich mein eigentliches Vorhaben, nämlich die Eingabe über Zahlfelder wie beim konventionellen Taschenrechner durchzuführen nicht so ohne weiteres möglich ist, wenn ich alles mit einem Zahlen / Zeichenblock erledigen will.

Nun meine Frage: Gibt es einen Befehl, der herausfindet, welches Editfeld gerade angeklickt wurde? Falls ja wie lautet dieser?

MfG Br0t :) Vielen Dank schonmal
 
In welcher Sprache willste du denn das ganze wissen?
 
Form.ActiveControl wenn ich dich richtig verstanden habe!
 
Br0t schrieb:
Nun meine Frage: Gibt es einen Befehl, der herausfindet, welches Editfeld gerade angeklickt wurde? Falls ja wie lautet dieser?
du könntest in jeder onkeydown methode der edit-felder auf eine allgemein überprüfungsfunktion verweisen.

im c++ builder würde das wiefolgt aussehen (meine delphi-kenntnis ist leider sehr eingerostet :)):
Code:
void Formular::UeberpruefeTasten( TObject *Sender, WORD &Key, TShiftState Shift )
{
  if( Sender == Edit1 ) { ... }
  else if( Sender == Edit2 ) { ... }
  else if( Sender == Edit3 ) { ... }
  else if( Sender == Edit4 ) { ... }
  else
  {
    ...
  }
}
void __fastcall TFormular::Edit1KeyDown( TObject *Sender, WORD &Key, TShiftState Shift )
{
  UeberpruefeTasten( Sender, Key, Shift );
}
void __fastcall TFormular::Edit2KeyDown( TObject *Sender, WORD &Key, TShiftState Shift )
{
  UeberpruefeTasten( Sender, Key, Shift );
}
void __fastcall TFormular::Edit3KeyDown( TObject *Sender, WORD &Key, TShiftState Shift )
{
  UeberpruefeTasten( Sender, Key, Shift );
}
void __fastcall TFormular::Edit4KeyDown( TObject *Sender, WORD &Key, TShiftState Shift )
{
  UeberpruefeTasten( Sender, Key, Shift );
}
wenn du schreiben würdest, was genau du vor hast (zahlen abfangen oder was genau?), dann könnten wir dir besser helfen.

ansonsten ist es die eigenschaft ActiveControl, wie es 2Sharp4U schon gesagt hat.
 
Ja genau diese Eigenschaft wollte ich nur wissen. Vielen Dank. ^^
Ich will dort Zahlen eintragen für einen Bruchrechner. Wenn das Projekt fertig ist lade ichs mal als Anhang hier im Thread hoch, wer möchte kann sichs ja mal anschauen...

MfG und vielen Dank Br0t

Ich habe die Eigenschaft, jetzt mal ausprobiert und zwar habe ich geschrieben:

Code:
procedure TForm1.Button1Click(Sender: TObject);
  var Active:TWinControl;
  begin
  Active := Form1.ActiveControl;
  if Active = Form1.eZahl1 then
    eZahl1.Text := 'Markiert'
  else
    if Active = Form1.eZahl2 then
      eZahl2.Text := 'Markiert';
  end;
er startet das Programm, aber wenn ich den Button klicke kommt nichts, auch nicht wenn ich natürlich vorher ein Edit-Feld markiere... Ich habe mal gedebuggt und die Werte, die Active annimmt stimmen schon mit den Edit-Feldern überein, jedoch geht es trotzdem nicht...

Ich brauche eure Hilfe nochmal ^^ #*push
 
Zuletzt bearbeitet:
das wird wohl auch nicht funktionieren, denn sobald du auf den button klickst hat dieser den fokus, wodurch du deine variante vergessen kannst. wenn musst du dir eine zusätzliche variable anschaffen, welche das letzte aktive objekt speichert und du diesen wert abfragst.
 
ah vielen Dank, soweit hatte ich noch gar nicht gedacht :)

EDIT: Wie kann man denn Variablen speichern, die nicht nur für eine Prozedur gelten? Also ich habe mir überlegt, wenn man auf ein Editfeld klickt, wird es disabled aber man kann halt anhand der Variable "Active" feststellen welches Objekt im Formular angeklickt wurde und folglich über die Zahlenbuttons eingeben. Hat jemand eine Idee?
 
Zuletzt bearbeitet:
dazu musst du die variable nur außerhalb der funktion deklarieren (hier eine gute veranschaulichung). globale variablen solltest du aber mitunter tunlichst vermeiden.
 
Ja, aber der Wert einer Variable innerhalb einer Prozedur gilt auch nur für diese, selbst wenn die Variable Global ist oder?
 
Du kannst bei einer Prozedur einen Wert verändern, z.B. einer globalen Variablen, indem du im Prozedurkopf ein "var" vor dem Parameter angibst, der für die globale Variable steht...alles klar?^^
Weil ohne nimmt die Prozedur lediglich eine Kopie des Wertes der Variable und nicht die Variable selbst.
Also hast du recht^^
 
Nun, also ich schildere nochmal ganz klar mein Problem, vielleicht wird dann deutlicher worauf ich hinaus will.

Ich möchte, dass das von mir geschriebene Programm die Möglichkeit bietet, eine angeklickte Komponente in einer Variable über Form.ActiveControl zu speichern, bevor ich einen Klick auf einen Button mache, denn der Klick auf den Button würden den Focus ja auf ihn setzen. Da ich aber keine Idee habe, wie ich eine globale Variable einfügen kann, auf die alle Prozeduren Zugriff haben, habe ich ein Problem....

Ich habe halt gedacht, dass sobald man auf eins von den 4 Eingabe-Editfeldern klickt, die oben erwähnte Variable, nennen wir sie mal "Active", dieses Editfeld als ActiveControl - Wert speichert und anschließend von der Click-Prozedur auf einen von den Zahlenbuttons abgefragt werden kann.
Wenn jemand eine konkrete Idee hätte, wäre ich überaus dankbar! Andererseits, falls es auf gar keinen Fall gehen kann, so wie ich es will, dann könntet ihr mir ja auch bescheid sagen :).

Grüße Br0t

EDIT: Kann mir denn niemand helfen? ^^
 
Zuletzt bearbeitet:
Zurück
Oben