Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TEdit(Sender)


colaka - Sa 13.10.12 12:35
Titel: TEdit(Sender)
Hallo,

ich habe viele Editfelder und möchte, dass man den Inhalt eines jeden Feldes in jedes andere einfügen kann. Dazu habe ich ein PopUpMenue und eine ActionList erstellt. In der ActionList gibt es die Aktion ANameKopieren und ANameEinfuegen. Doch der folgende Code erzeugt eine Zugriffsverletzung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TFKunden.ANameKopierenExecute(Sender: TObject);
begin
  TempText := TEdit(Sender).Text;
end;

procedure TFKunden.ANameEinfuegenExecute(Sender: TObject);
begin
  TEdit(Sender).Text := TempText;
end;


Was mache ich da wohl falsch?


bummi - Sa 13.10.12 12:59


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
  mi: TMenuItem;
begin
  if TAction(Sender).ActionComponent is TMenuItem then
  begin
      mi := TMenuItem(TAction(Sender).ActionComponent);
      if mi.GetParentMenu is TPopupMenu then
      begin
        if TPopupMenu(mi.GetParentMenu).PopupComponent is TEdit then
          TempText := TEdit(TPopupMenu(mi.GetParentMenu).PopupComponent).Text;

    end;
  end;
  Showmessage(TempText);

end;


colaka - Sa 13.10.12 14:11

Vielen Dank für die schnelle Antwort. Leider ist der Code etwas zu hoch für mich, deshalb habe ich ihn einfach abkopiert. Jetzt kommt zwar keine Fehlermeldung mehr, aber den Text des Editfeldes erhalte ich auch nicht. Die Messagebox zeigt nichts an. Um dem Fehler näher zukommen, habe ich den Code noch etwas abgewandelt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TFKunden.ANameKopierenExecute(Sender: TObject);
var
  mi: TMenuItem;
begin
  if TAction(Sender).ActionComponent is TMenuItem then
  begin
    mi := TMenuItem(TAction(Sender).ActionComponent);
    if mi.GetParentMenu is TPopupMenu then
    begin
      if TPopupMenu(mi.GetParentMenu).PopupComponent is TEdit then
      begin
        ShowMessage('Text');
        TempText := TEdit(TPopupMenu(mi.GetParentMenu).PopupComponent).Text;
      end else
        ShowMessage('kein Text');
    end;
  end;
  Showmessage(TempText);
end;


Es ist egal, ob ich den Text im Editfeld markiere oder nicht, es erscheint immer die Message "kein Text".


bummi - Sa 13.10.12 16:44

Ich gehe von einem Popupmenu aus dem Actions zugewiesen worden, den Edits wurden das Popupmenu zugewiesen.
Ansonsten einen Brechpunkt setzen und durchsteppen, da wo es nicht mehr passt den Klassennamen anzeigen lassen.


colaka - Sa 13.10.12 17:54

Ja,

ich hatte das PopUpMenue dem ganzen Panel zugewiesen. Jetzt habe ich es den einzelnen Editfeldern zugewiesen, und es funktioniert wunderbar.

Vielen Dank


bummi - So 14.10.12 01:02

Zitat:

Leider ist der Code etwas zu hoch für mich


Liest sich doch eigentlich recht einfach, die Frage ist ja nur "wer kennt wen"

Die Action weiß wer sie aufgerufen hat
Wenn es ein Menuitem eines Popupmenues war weiß dass Popupmenu wer es aufgerufen hat ....