Brauche Hilfe mit Aufrufen einer Prozedur

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
stefankr77
Beiträge: 9
Registriert: Mo 13. Aug 2012, 20:16

Brauche Hilfe mit Aufrufen einer Prozedur

Beitrag von stefankr77 »

Hallo Ihr,

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. 

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Brauche Hilfe mit Aufrufen einer Prozedur

Beitrag von theo »

CalculateSeconds ist eine einfache Prozedur und keine Methode von TForm1

http://www.delphi-treff.de/tutorials/ob ... ammierung/

stefankr77
Beiträge: 9
Registriert: Mo 13. Aug 2012, 20:16

Re: Brauche Hilfe mit Aufrufen einer Prozedur

Beitrag von stefankr77 »

theo hat geschrieben:CalculateSeconds ist eine einfache Prozedur und keine Methode von TForm1

http://www.delphi-treff.de/tutorials/ob ... ammierung/
Haha, ich habe mir wieder alles viel zu einfach gemacht... Danke für den Link, das lese ich mir durch und schaue dann mal.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Brauche Hilfe mit Aufrufen einer Prozedur

Beitrag von DonMigos »

Eigentlich sind es ja nur 2 kleine Änderungen... (die Prozedur CalculateSeconds in eine Methode von TForm1 verwandeln)
Ach und Global brauchst du die Variablen hier nicht zu machen.
Und ein Filter für die Eingabe wäre vielleicht zusätzlich auch nicht schlecht, wenn man sich sonst einmal vertippt, hat man schon ne Meldung...

stefankr77
Beiträge: 9
Registriert: Mo 13. Aug 2012, 20:16

Re: Brauche Hilfe mit Aufrufen einer Prozedur

Beitrag von stefankr77 »

DonMigos hat geschrieben:Eigentlich sind es ja nur 2 kleine Änderungen... (die Prozedur CalculateSeconds in eine Methode von TForm1 verwandeln)
Ach und Global brauchst du die Variablen hier nicht zu machen.
Und ein Filter für die Eingabe wäre vielleicht zusätzlich auch nicht schlecht, wenn man sich sonst einmal vertippt, hat man schon ne Meldung...
Super, das war sehr hilfreich. Jetzt funktioniert alles! :) Ich muss noch viel lernen, hab jetzt aber etwas dazugelernt. :)

Danke und viele Grüße!

Antworten