PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delphi-Prob; Fehler in Source Code und ich raff ihn nicht :|


007
2003-10-11, 22:25:18
Hab mir vorgenommen zur Übung einen kleinen Wecker zu fabrizieren, der dann nach und nach ausgebaut wird, momentan ist er noch recht simpel gehalten. Wenn ich das Programm starte krieg ich nach kurzer Zeit die Fehlermeldung die unten angehängt ist. Bitte helft mir...


unit wecker;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Grids;

type
TUhrFormular = class(TForm)
Panel1: TPanel;
AlarmEdit: TEdit;
TimeText: TLabel;
FontButton: TButton;
Label2: TLabel;
FontDialog: TFontDialog;
Timer: TTimer;
AlarmActive: TCheckBox;
AlarmList: TStringGrid;
SizeButton: TButton;
procedure TimerTimer(Sender: TObject);
procedure FontButtonClick(Sender: TObject);
procedure SizeButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure AlarmListKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
SmallSize: Boolean;
function IsTimeOver(Alarm: string): Boolean;
procedure AlarmMessage(Alarm: string);

procedure SetBigSize;
procedure SetSmallSize;

public
{ Public declarations }
end;

var
UhrFormular: TUhrFormular;

implementation

{$R *.dfm}

function TUhrFormular.IsTimeOver(Alarm: string):Boolean;
var
AlarmTime: TDateTime;
begin
Result := False;
if Alarm <> '' then begin
AlarmTime := StrToTime(Alarm);
Result := Time > AlarmTime;
end;
end;

procedure TUhrFormular.AlarmMessage(Alarm: string);
begin
Application.BringToFront;
MessageBeep($FFFF);
ShowMessage('Alarm');
end;


procedure TUhrFormular.TimerTimer(Sender: TObject);
var
i: Byte;
FoundAlarm: string;
begin
TimeText.Caption := TimeToStr(Time);
try
if AlarmActive.Checked then begin
if IsTimeOver(AlarmEdit.Text) then begin
FoundAlarm := AlarmEdit.Text;
AlarmEdit.Text := '';
AlarmMessage('Primärer Alarm: '+FoundAlarm);
end;
for i := 1 to AlarmList.RowCount-1 do
if IsTimeOver(AlarmList.Cells[0, i]) then begin
FoundAlarm := AlarmList.Cells[0, i];
AlarmList.Cells[0, i] := '';
FoundAlarm := 'Alarmzeit: '+FoundAlarm+' ('+AlarmList.Cells[1, i]+')';
AlarmMessage(FoundAlarm);
end;
end;
except
on E: EConvertError do begin
AlarmActive.Checked := False;
MessageDlg('Ungültige Eingabe, bitte korrigieren:'#13#10 + E.Message, mtError, [mbOk], 0);
end;
end;
end;

procedure TUhrFormular.FontButtonClick(Sender: TObject);
begin
FontDialog.Font := TimeText.Font;
FontDialog.Execute;
TimeText.Font := FontDialog.Font
end;

procedure TUhrFormular.SetBigSize;
begin
ClientWidth := AlarmList.Left+AlarmList.Width+10;
ClientHeight := Panel1.Top+Panel1.Height+10;
SmallSize := false;
SizeButton.Caption := '<<<<';
AlarmList.Enabled := true;
AlarmEdit.Enabled := true;
AlarmActive.Enabled := true;
end;

procedure TUhrFormular.SetSmallSize;
begin
ClientHeight := Panel1.Top-1;
ClientWidth := AlarmList.Left-1;
SmallSize := true;
SizeButton.Caption := 'Wecker >>>>';
end;

procedure TUhrFormular.SizeButtonClick(Sender: TObject);
begin
if SmallSize then SetBigSize
else SetSmallSize;
end;

procedure TUhrFormular.FormCreate(Sender: TObject);
begin
AlarmList.Cells[0,0] := 'Alarmzeit';
AlarmList.Cells[1,0] := 'Alarmhinweis';
SetSmallSize;
end;

procedure TUhrFormular.AlarmListKeyPress(Sender: TObject; var Key: Char);
begin
AlarmActive.Checked := False;
end;

end.


Wo ist mein Fehler *nixmehrkapier*

Ganon
2003-10-12, 00:15:57
In deinem Objekt AlarmEdit scheint kein gültiger Zeit-Wert zu stehen. Ich weiß ja nicht was für ein Feld das ist, aber vielleicht liegt es daran:


if IsTimeOver(AlarmEdit.Text) then begin
FoundAlarm := AlarmEdit.Text;
AlarmEdit.Text := '';
AlarmMessage('Primärer Alarm: '+FoundAlarm);
end;


Kann es sein das dort etwas falsches drinnen steht?

007
2003-10-12, 00:36:34
Mhhh, du hattest recht, das script shcmiert ab, wenn man die uhrzeit nicht absolut korrekt angibt, da muss ich noch ne bedingung reinschreiben. Thx...

Crushinator
2003-10-12, 02:02:14
^^ Für die Time-Prüfung:


(*$HINTS OFF*)
function IsNumeric(s: String): Boolean;
Var
Code: Integer;
Value: Double;
begin
val(s, Value, Code);
Result := (Code = 0)
end;
(*$HINTS ON*)

Function GetTimeDelimiter:String;
Var s1:String; i:Integer;
Begin
s1 := DateTimeToStr(Now);
For i := Length(s1) downto 1 do Begin
If Not (s1[i] in ['0'..'9']) Then Begin
Result := s1[i];
Break;
End;
End;
End;

Function IsTime(s1:String):Boolean;
Var i,k,p1,p2:Integer; sStd,sMin,sSec,ss:String;
Begin
Result := false;
ss := GetTimeDelimiter;
k := Length(s1);
If k > 0 Then Begin
p1 := 0;
p2 := 0;
For i := 1 to k do Begin
If p1 = 0 Then Begin
If s1[i] = ss Then p1 := i;
End Else Begin
If s1[i] = ss Then p2 := i;
End;
End;
If p1 > 0 Then Begin
If p2 > 0 Then Begin
If p2 > p1 Then Begin
sStd := Copy(s1,1,p1-1);
sMin := Copy(s1,p1+1,p2-p1-1);
sSec := Copy(s1,p2+1,k-p2);
If IsNumeric(sStd) Then Begin
If IsNumeric(sMin) Then Begin
If IsNumeric(sSec) Then Begin
p1 := StrToInt(sStd);
If (p1 >= 0) and (p1 < 24) Then Begin
p1 := StrToInt(sMin);
If (p1 >= 0) and (p1 < 60) Then Begin
p1 := StrToInt(sSec);
If (p1 >= 0) and (p1 < 60) Then Result := true;
End;
End;
End;
End;
End;
End;
End;
End;
End;
End;


...diese und vielleicht weitere nützliche Funktionen wurden hier (http://home.t-online.de/home/uwe.mnich/Wissen/Delphi/Utilities/Utilities.html) gesichtet.

Dann müßte Dein Code so aussehen:

(...)
if Alarm <> '' and IsTime(Alarm) then begin
AlarmTime := StrToTime(Alarm);
Result := Time > AlarmTime;
end;
(...)

Xmas
2003-10-12, 03:56:34
Original geschrieben von crushinator
^^ Für die Time-Prüfung:


snip


Boa, also statt den langen Schmu zu verwenden, ist es doch viel einfacher die Exception zu behandeln ;)

Dafür sind Exceptions doch da!

Crushinator
2003-10-12, 07:11:32
Original geschrieben von Xmas
Boa, also statt den langen Schmu zu verwenden, ist es doch viel einfacher die Exception zu behandeln ;) (...) =)
OK, dann für ganz faule:


function TUhrFormular.IsTimeOver(Alarm: string):Boolean;
var
MyTime, AlarmTime: TDateTime;
begin
Result := False;
if Alarm <> '' then begin
MyTime := Time;
try
AlarmTime := StrToTime(Alarm);
except
AlarmTime := MyTime;
end;
Result := MyTime > AlarmTime;
end;
end;

...und wenn einem die Exception beim Debuggen auf den Sack geht, schaltet man die Nervensäge unter Tools -> Debugger -> Language Exceptions -> Stop on Delphi Exceptions (oder ähnlich) aus. http://home.t-online.de/home/bullitt667/smilies/data/uglywave.gif

007
2003-10-12, 08:55:23
Danke an euch Delphi Götter :massa: