Ich habe mir zur Übung ein Programm geschrieben, das mir ausrechnen soll, in welcher Zeit eine bestimmte Dateigröße mit einer bestimmten Übertragungsmethode übertragen wird. Das hat zuerst auch gut geklappt: In einem Edit gebe ich die Dateigröße ein, in zwei Comboboxen wähle ich die Einheit (KB, MB etc.) bzw. die Übertragungstechnik (Ethernet, USB2.0, FW etc.) aus. Durch Klick auf einen "Berechnen"-Button wird mir das Ergebnis in Sekunden oder Minuten in einem zweiten Edit angezeigt.
Dann habe ich herausgefunden, dass ich den Berechnen-Button gar nicht brauche: Ich kann die Prozedur Button1Click auch allein durch Ändern des Edit1-Feldes oder der Comboboxen aufrufen. Also wollte ich das Programm umschreiben, so dass es keinen Berechnen-Button mehr gibt. So habe ich in völlig neues Formular genommen und alle Komponenten neu eingefügt. Dann habe ich den Inhalt der Button1Click-Methode in eine neue Prozedur hineinkopiert, die ich CalculateSeconds genannt habe. Diese soll nun bei den jeweiligen Ereignissen aufgerufen werden.
Leider klappt das nicht, ich bekomme nur Fehlermeldungen, wenn ich es laufen lasse: Die Identifier Edit1 und Combobox1 werden nicht gefunden, Constant and Case types do not match, usw.
Ich hoffe, ihr könnt mir folgen. Was passt da nicht? Was muss ich tun, damit die Prozedur fehlerfrei ausgeführt wird ? Wäre für jede Hilfe dankbar. Hier mal der Code:
Code: Alles auswählen
unit BR2_unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
procedure ComboBox1Change(Sender: TObject);
procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
Eingabe, Sekunden: Real;
implementation
{$R *.lfm}
procedure CalculateSeconds;
begin
Eingabe := StrToFloat(Edit1.text);
case combobox1.ItemIndex of
0 : case combobox2.ItemIndex of //KByte selected
0 : begin // Ethernet
Sekunden := 1 / 1250 * Eingabe;
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
1 : begin // Fast Ethernet
Sekunden := 1 / 12500 * Eingabe;
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
2 : begin // FW 400
Sekunden := 1 / 50000 * Eingabe;
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
3 : begin // FW 800
Sekunden := 1 / 100000 * Eingabe;
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
4 : begin // USB 1.1
Sekunden := 1 / 1500 * Eingabe;
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
5 : begin // USB 2.0
Sekunden := 1 / 30000 * Eingabe; // I always get only 30 MB/s with USB 2.0...
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
end;
1 : case combobox2.ItemIndex of // MByte selected
0 : begin // Ethernet
Sekunden := 1 / 1250 * (Eingabe*1000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
1 : begin // Fast Ethernet
Sekunden := 1 / 12500 * (Eingabe*1000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
2 : begin // FW 400
Sekunden := 1 / 50000 * (Eingabe*1000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
3 : begin // FW 800
Sekunden := 1 / 100000 * (Eingabe*1000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
4 : begin // USB 1.1
Sekunden := 1 / 1500 * (Eingabe*1000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
5 : begin // USB 2.0
Sekunden := 1 / 30000 * (Eingabe*1000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
end;
2 : case combobox2.ItemIndex of // GByte selected
0 : begin // Ethernet
Sekunden := 1 / 1250 * (Eingabe*1000000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
1 : begin // Fast Ethernet
Sekunden := 1 / 12500 * (Eingabe*1000000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
2 : begin // FW 400
Sekunden := 1 / 50000 * (Eingabe*1000000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
3 : begin // FW 800
Sekunden := 1 / 100000 * (Eingabe*1000000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
4 : begin // USB 1.1
Sekunden := 1 / 1500 * (Eingabe*1000000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
5 : begin // USB 2.0
Sekunden := 1 / 30000 * (Eingabe*1000000);
If Sekunden <= 60 then
Edit2.Text := FloatToStrF (Sekunden, ffFixed,6,2) + ' s'
else
Edit2.Text := FloatToStrF (Sekunden / 60, ffFixed,6,2) + ' min';
end;
end;
end;
end;
{ TForm1 }
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
CalculateSeconds;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Combobox1.ItemIndex := 0;
Combobox2.ItemIndex := 0;
Edit1.Text := '0';
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
CalculateSeconds;
end;
end.