Ich hab zwei kleine Probleme und komme momentan nicht weiter. Ich brauche einige neue Denkanstöße. Das ganze soll so funktionieren:
Klicke ich auf ein Editfeld (z.B. Edit2), dann wird eine ComboBox generiert die sich über das Editfeld legt. Was die ComboBox im einzelen macht spielt erstmal keine Rolle. Auf jeden Fall soll nach einem ENTER das Ergebnis an Edit2 übergeben, der Fokus auf die nächste Komponente gesetzt und die ComboBox zestört werden. Die Combobox hat den gleichen Namen wie das Editfeld, nur hat sie ein Unterstrich "_" vor dem Namen. Soviel zu der Theorie. Hier die Probleme.
Das erste Problem ist, daß ich den Text aus der ComboBox nicht an das Editfeld übergeben kann. Der Name des Editfelds ist bekannt (Name der ComboBox minus erstes Zeichen), nur kann ich nicht über FindComponent auf das Editfeld zugreifen. Das Ergebnis ist Nil. Also hab ich mir mit einer globalen TObjekt Variable beholfen. An die übergebe ich in der Prozedur EnterComboBox den Sender und benutze ihn später anstelle von FindComponent. Fürs erste funktioniert es, nur gefällt mir diese Methode nicht. Es muß doch möglich sein über den Namen an die Komponente zuzugreifen. Gibt es auch, nur funktioniert sie hier nicht. Irgendwo hab ich einen Fehler gemacht oder etwas übersehen.
Das zweite Problem. Wenn ich ENTER klicke, dann soll der Fockus an das nächste Editfeld übergeben werden. Das ganze hat schon funktioniert, nur hab ich das verschlimmertverbessert und krieg das nicht wieder hin. Das Problem ist, daß wenn ich den Fockus an das alte Editfeld übergebe, dieses wieder eine ComboBox generiert. Also muß ich den Fockus an das nächste Steuerelement übergeben.
Hier das Beispiel mit dem ich es Versuche habe. Ich hab alle meine Fehlversuche wieder entfernt und das Programm an den Anfangzustand gebracht, d.h. Text wird übergeben (mit der globalen TObjekt Variable), aber der Fockus nicht
Für das Beispiel braucht man ein leeres Projekt und vier Editfelder. Die Prozeduren ExitComboBox und EnterComboBox sind eigene Prozeduren, Edit2Enter und Edit2KeyPress automatisch generierte. Wobei Edit2KeyPress von allen Edit-Feldern genutzt wird.
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; procedure Edit2Enter(Sender: TObject); procedure Edit2KeyPress(Sender: TObject; var Key: Char); private { Private-Deklarationen } procedure ExitComboBox(Sender: TObject); procedure EnterComboBox(Sender: TObject); public { Public-Deklarationen } end;
var Form1: TForm1; Comp2: TObject;
implementation
{$R *.DFM}
procedure TForm1.ExitComboBox(Sender: TObject); var Comp: TComponent; begin if Sender is TComboBox then with Sender as TComboBox do if Name[1] = '_' then begin //Comp := FindComponent(Copy(Name, 2, 256)); //TEdit(Comp).Text := Text; TEdit(Comp2).Text := Text; Free; end; //Perform(WM_NEXTDLGCTL, 0, 0); //Edit3.SetFocus; end;
procedure TForm1.EnterComboBox(Sender: TObject); begin Comp2 := Sender; if Sender is TEdit then with TComboBox.Create(Self) do begin Parent := TEdit(Sender).Parent; Name:= '_' + TEdit(Sender).Name; BoundsRect := TEdit(Sender).BoundsRect; Text:= TEdit(Sender).Text; OnExit := ExitComboBox; OnKeyPress := TEdit(Sender).OnKeyPress; SetFocus; end; end;
procedure TForm1.Edit2Enter(Sender: TObject); begin if (Sender is TEdit) and not TEdit(Sender).ReadOnly then if TEdit(Sender).Name = 'Edit2' then EnterComboBox(Sender); end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then {if (Sender is TEdit) then }begin Perform(WM_NEXTDLGCTL, 0, 0); Key := #0 end; end;
end. |
Bitte nicht fragen wieso ich nicht gleich eine ComboBox anstelle des Editfelds nehme. Das hat schon seine Richtigkeit hat.