Erstmal ein gutes neues Jahr!
So richtig verinnerlicht habe ich das mit der tcontrol-Property zwar noch nicht (da muss erst noch der Knoten platzen), dennoch habe ich es einfliessen lassen und auch ansonsten noch am Code geschraubt.
Immer unter der Prämisse dass bei _meiner_ Anwendung nur Labels für die Eingabe Verwendung finden und es auch ausgeschlossen ist, dass andere Zeichen als Zahlen auftreten. Den Test auf Zahlen habe ich also entfernt.
Die Änderungen:
- Die Labels von der Eingabeform sind jetzt von links (=1000er Stelle) nach rechts (=1er Stelle) nur noch von Label1 - Label4 durchnummeriert, warum seht ihr gleich.
- Weiterhin sind die oberen 'Up'-Grafiken von Image1 - Image4 und die unteren 'Down'-Grafiken von Image5 - Image8 durchnummeriert, auch da seht ihr gleich den Grund.
Also zunächst die Änderung in der Typ-Deklaration der zweiten Unit:
Code: Alles auswählen
private
QuellLabel: Tcontrol;
public
property Quelle: tcontrol read QuellLabel write QuellLabel;
end;
Aufruf der zweiten Form aus der ersten heraus:
Code: Alles auswählen
procedure TForm1.Label1Click(Sender: TObject);
begin
Eingabe.quelle := TControl(Sender);
Unit2.Eingabe.visible := true;
end;
Im FormActivate der zweiten Form wird zunächst die Länge des übermittelten Captions ermittelt und bei Bedarf mit führenden Nullen aufgefüllt...
Code: Alles auswählen
procedure TEingabe.FormActivate(Sender: TObject);
var i : integer;
dummy : string;
begin
rueckgabe := QuellLabel;
dummy := (rueckgabe as tlabel).caption;
i := length(dummy);
case i of
1: begin
dummy := '000' + dummy;
end;
2: begin
dummy := '00' + dummy;
end;
3: begin
dummy := '0' + dummy;
end;
end;
Label1.caption := copy(dummy,1,1);
Label2.caption := copy(dummy,2,1);
Label3.caption := copy(dummy,3,1);
Label4.caption := copy(dummy,4,1);
end;
...und vorm Zurückschreiben eventuelle führende Nullen wieder entfernt.
Code: Alles auswählen
procedure TEingabe.Button1Click(Sender: TObject);
var i : integer;
begin
labeltext := Label1.caption + Label2.caption + Label3.caption + Label4.caption;
i := strtoint(labeltext);
labeltext := inttostr(i);
QuellLabel.Caption := labelText;
Eingabe.visible := false;
end;
Was mich ja gestört hatte waren die vielen OnClick-Events der Up/Down-Images, das habe ich nun in einem einzigen Event zusammengefasst welches für alle Up/Down-Grafiken gilt.
Code: Alles auswählen
procedure TEingabe.ImageClick(Sender: TObject);
var
UpDown : tobject;
ImageName : string;
ImageNummer, LabelNummer : integer;
ZielLabel : tobject;
begin
UpDown := sender;
ImageName := (UpDown as Timage).name;
ImageNummer := strtoint(copy(ImageName,6,1));
if ImageNummer < 5 then LabelNummer := ImageNummer else LabelNummer := ImageNummer - 4;
Ziellabel := TLabel(FindComponent('Label'+inttostr(LabelNummer)));
case ImageNummer of
1..4:
begin
if strtoint((Ziellabel as TLabel).Caption) < 9 then (Ziellabel as TLabel).Caption := inttostr(strtoint((Ziellabel as TLabel).Caption) + 1) else (Ziellabel as TLabel).Caption := '0';
end;
5..8:
begin
if strtoint((Ziellabel as TLabel).Caption) > 0 then (Ziellabel as TLabel).Caption := inttostr(strtoint((Ziellabel as TLabel).Caption) - 1) else (Ziellabel as TLabel).Caption := '9';
end;
end;
end;
Ich prüfe also erstmal die Nummer des auslösenden Images indem ich vom Namen die letzte Stelle als Integer sichere.
1 - 4 heisst Plus, 5 - 8 heisst Minus.
Dann suche ich nach einem Label auf der Form, dessen laufende Nummer der des Up-Images entspricht bzw. der des Down-Images minus 4.
Und dieses Label wird dann hoch- bzw. runtergeblättert.
Funktioniert zu meiner grossen Verblüffung tadellos
.
So, jetzt liegt es wieder an euch die Hände über dem Kopf zusammenzuschlagen
.
Gruss
Anton