Autor |
Beitrag |
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Di 11.10.05 10:33
Deinen Fehler kann ich jetzt nicht finden, aber Dein Weg berechnet 3x und Du nutzt nur immer einen Teil. Vielleicht noch mal bei Null mit der Klasse anfangen (s.o.)(  ) und langsam jeden Punkt wieder einbauen oder neu schreiben!
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 11.10.05 11:21
Zitat: ...Dein Weg berechnet 3x und Du nutzt nur immer einen Teil...
Was meinst Du damit?
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Di 11.10.05 11:31
du rufst 3mal berechne auf um die Werte anzuzeigen
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Label1.Caption:=
IntToStr(WorkTime1.Berechne(DuraHour, DuraMin, q, DuraHelp, dez).DuraHour) + ':' + IntToStr(WorkTime1.berechne(DuraHour, DuraMIn, q, DuraHelp, dez).DuraMin); end; |
oh Sorry nur zweimal,
berechne erst den Record und zeige es dann an
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| itemp := WorkTime1.Berechne(DuraHour, DuraMin, q, DuraHelp, dez); Label1.Caption:=
IntToStr(iTemp.DuraHour) + ':' + IntToStr(iTemp.DuraMin); end; |
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Di 11.10.05 11:36
mexx hat folgendes geschrieben: | Q und DuraHelp sind variablen die nur als Hilfe in der function benötigt werden. |
Wenn sie Hilfsvariablen sind, warum nimmst du die dann in die Paramterliste und nicht unter die normale Variablendeklaration? Denn Parameter sollten nie der Berechnung dienen, sondern nur als Eingabewerte und Ergebnisse genommen werden.
@Funktionsweise deiner Funktion. Nimm mal anstatt deiner Variablen bei den Parametern (bei Aufruf!) festgelegte Werte und Überprüfe dann dein Ergebnis.
|
|
TommyK
Hält's aus hier
Beiträge: 8
|
Verfasst: Di 11.10.05 11:44
Also mir ist folgendes aufgefallen:
du hast in deiner Funktion den Rückgabewert nicht gesetzt...
das mußt du in der Function berechne(a,b,c,d):TErg;
machen... ind zwar wie folgt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Function berechne(a,b,c,d):TErg; begin .. .. .. berechne.erg1:= berechne.erg2:= berechne.erg3:= end; |
achso.. und ich habe mir deine Procedure nciht angesehen, in der du das alles aufrufst...
du mußt natürlich die WErte die du übergibst vorher gesetzt haben... und direkt auf die Variablen in einer Funktion zuzugereifen ist sehr schlechter Programmierstil - dafür hast du doch die ÜBergabeVariablen (a,b,c,d)
Du kriegst das jetzt bestimmt auch alleine hin - ich muß jetzt leider weg...
wenn du weitere Probleme haben solltest, kannst du dich bei mir nochmal per PN melden - dann erkläre ich dir das mit Funktionen und Procedure ausführlich - kannst auch ein Skript kriegen, wo alles wirklich sehr gut erläutert ist Von der FH WEdel *smile* eine der bestehen Fachhochschulen für Infomatik ...
CU
TK
Moderiert von raziel: Delphi-Tags hinzugefügt.
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 11.10.05 11:53
Ich habe die Komponente wie folgt geändert. Geändertes wird gekennzeichnet.
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: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101:
| unit WorkTime;
interface
uses SysUtils, Classes, Dialogs ;
type TErg = record DuraMin : integer; DuraHour : integer; dez : integer; end;
type TWorkTime = class(TComponent) private FStartHour: Integer; FStartMin : Integer; FEndHour : Integer; FEndMin : Integer; FBreakTime: Integer;
protected public function Berechne: String; published property StartHour: Integer read FStartHour write FStartHour; property StartMin: Integer read FStartMin write FStartMin; property EndHour: Integer read FEndHour write FEndHour; property EndMin: Integer read FEndMin write FEndMin; property BreakTime: Integer read FBreakTime write FBreakTime;
end;
procedure Register;
implementation
function TWorkTime.Berechne :String; var i, DuraMin, DuraHour, Q, DuraHelp, Dez: Integer; begin IF FStartHour < FEndHour Then begin FStartHour := 24 - FStartHour; FEndHour := 24 - FEndHour; FStartMin := 60 - FStartMin; FEndMin := FEndMin; DuraHour := FStartHour - FEndHour; end else begin FStartHour := 24 - FStartHour; FEndHour := FEndHour; FStartMin := 60 - FStartMin; FEndMin := FEndMin;
DuraHour := FStartHour + FEndHour; end;
DuraMin := FStartMin + FEndMin; DuraHelp:= DuraHour * 60;
IF FBreakTime > 0 then begin DuraMin := DuraHelp + DuraMin - FBreakTime; end else begin DuraMin := DuraHelp + DuraMin; end;
Q := DuraMin div 60; DuraHour := 0;
for i:=1 to Q do begin DuraHour := DuraHour + 1; DuraMin := DuraMin - 60; end;
DuraMin := DuraMin; DuraHour:= DuraHour - 1; dez := DuraMin * 100 div 60; result := IntToStr(DuraHour) + ':' + IntToStr(DuraMin);
end; |
Im Prog. wird einen Label lediglich das result zugewiesen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.FormCreate(Sender: TObject); begin WorkTime1.StartHour := 4; WorkTime1.StartMin := 45;
WorkTime1.EndHour := 13; WorkTime1.EndMin := 30;
WorkTime1.BreakTime := 30;
Label1.Caption:=WorkTime1.Berechne; end; |
Mit den Werten 04:45 Uhr - 13:30 abzüglich 30 Minuten Pause erhalte ich das Ergebniss von 08:15 (Stunden:Minuten).
Das heist, die Werte DuraHour und DuraMin werden von der Funktion richtig berechnet und über das result ausgeliefert. Jeoch mit der Record-Variante bekomme ich falsche Werte.
THX, mexx
Moderiert von raziel: Code- durch Delphi-Tags ersetzt
Moderiert von raziel: Color- durch Highlight-Tags ersetzt.
|
|
Amateur
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: Di 11.10.05 12:09
dann mach es ohne function aber mit record un gib in deiner berechne procedure die ergnisse an den record. und die ergebnise aus dem record gibste dann im label aus. is zwar etwas mehr code aber wenn du das so machst liegt es ganz bestimmt nicht am record.
z.b. sowas: (pseudocode, ungetestet)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| meinrecord = reocrd ergebnis:integer;
procedure berechne(a,b); var ergebnis:integer; begin ergebnis:=a*b; meinrecord.ergebnis:=ergebnis; end;
procedure ... begin berechne(1,2); label1.caption:=inttostr(meinrecord.ergebnis); end; |
das müsste gehen. viell hab ich nen fehler bei der record deklaration gemacht aber das prinzip sollte klar sein und funktioniert 100%ig
ps: der algorythmus sit ja nicht das problem also versuchs erstma mit nur wenig parametern und einem ergebnis und wenn das funzt mach den rest dazu und bei deinen algorithmus ein. sonst kommste mit den variablen und parametern durcheinander und siehst den fehler in der recordsache nicht
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Di 11.10.05 14:42
zum Testen:
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: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212:
| unit Unit1;
interface
uses SysUtils, Classes, Dialogs ;
type TErg = record DuraMin : integer; DuraHour : integer; dez : integer; end;
type TWorkTime = class(TComponent) private FStartHour: Integer; FStartMin : Integer; FEndHour : Integer; FEndMin : Integer; FBreakTime: Integer;
protected public function Berechne: String; published property StartHour: Integer read FStartHour write FStartHour; property StartMin: Integer read FStartMin write FStartMin; property EndHour: Integer read FEndHour write FEndHour; property EndMin: Integer read FEndMin write FEndMin; property BreakTime: Integer read FBreakTime write FBreakTime;
end; type
TNewTimeRec = record Hour,Min: Word; end;
TNewWorkTime = class constructor Create; destructor Destroy; override; private FStart, FEnde, FDauer, FPause: TNewTimeRec; FOnTimeChange: TNotifyEvent;
procedure Calc; function GetDauerStr: String; function GetEndStr: String; function GetStartStr: String; function Minuten (R: TNewTimeRec): Integer; function OwnString(ATime: TNewTimeRec): String; function GetPauseStr: String; protected public procedure NewStartTime (AHour,AMin: Integer); procedure NewEndTime (AHour,AMin: Integer); procedure NewPauseTime (AHour,AMin: Integer); property StartStr: String read GetStartStr; property EndStr: String read GetEndStr; property DauerStr: String read GetDauerStr; property PauseStr: String read GetPauseStr; property OnTimeChange: TNotifyEvent read FOnTimeChange write FOnTimeChange; published end;
implementation
function TWorkTime.Berechne :String; var i, DuraMin, DuraHour, Q, DuraHelp, Dez: Integer; begin IF FStartHour < FEndHour Then begin FStartHour := 24 - FStartHour; FEndHour := 24 - FEndHour; FStartMin := 60 - FStartMin; FEndMin := FEndMin; DuraHour := FStartHour - FEndHour; end else begin FStartHour := 24 - FStartHour; FEndHour := FEndHour; FStartMin := 60 - FStartMin; FEndMin := FEndMin;
DuraHour := FStartHour + FEndHour; end;
DuraMin := FStartMin + FEndMin; DuraHelp:= DuraHour * 60; IF FBreakTime > 0 then begin DuraMin := DuraHelp + DuraMin - FBreakTime; end else begin DuraMin := DuraHelp + DuraMin; end;
Q := DuraMin div 60; DuraHour := 0;
for i:=1 to Q do begin DuraHour := DuraHour + 1; DuraMin := DuraMin - 60; end;
DuraMin := DuraMin; DuraHour:= DuraHour - 1; dez := DuraMin * 100 div 60; result := IntToStr(DuraHour) + ':' + IntToStr(DuraMin); end;
constructor TNewWorkTime.Create; begin inherited Create; end;
destructor TNewWorkTime.Destroy; begin
inherited; end;
procedure TNewWorkTime.NewStartTime(AHour, AMin: Integer); begin FStart.Hour := AHour; FStart.Min := AMin; Calc; end;
procedure TNewWorkTime.NewEndTime(AHour, AMin: Integer); begin FEnde.Hour := AHour; FEnde.Min := AMin; Calc; end;
procedure TNewWorkTime.Calc; var H,OldH: Integer; begin H := Minuten (FEnde)-Minuten (FStart)-Minuten(FPause); OldH := Minuten(FDauer); if OldH<>H then begin while H<0 do Inc (H,24*60); FDauer.Hour := H div 60; FDauer.Min := H-FDauer.Hour*60; if Assigned (FOnTimeChange) then FOnTimeChange(Self); end; end;
function TNewWorkTime.GetDauerStr: String; begin Result := OwnString(FDauer); end;
function TNewWorkTime.GetEndStr: String; begin Result := OwnString(FEnde); end;
function TNewWorkTime.GetStartStr: String; begin Result := OwnString(FStart); end;
function TNewWorkTime.OwnString(ATime: TNewTimeRec): String; var S: String; begin S := IntToStr(ATime.Min); if Length(S)=1 then S := '0'+S; Result := IntToStr(ATime.Hour)+':'+S; end;
function TNewWorkTime.Minuten(R: TNewTimeRec): Integer; begin Result := R.Hour*60+R.Min; end;
function TNewWorkTime.GetPauseStr: String; begin Result := OwnString(FPause); end;
procedure TNewWorkTime.NewPauseTime(AHour, AMin: Integer); begin FPause.Hour := AHour; FPause.Min := Amin; Calc; end;
end. |
und die Testroutine
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var WN: TNewWorkTime; begin WN := TNewWorkTime.Create; Wn.NewStartTime(8,30); WN.NewEndTime(10,30); Memo1.Lines.Add(WN.StartStr); Memo1.Lines.Add(WN.EndStr); Memo1.Lines.Add(WN.DauerStr); Wn.NewStartTime(10,30); WN.NewEndTime(8,30); WN.NewPauseTime(0,30); Memo1.Lines.Add(WN.StartStr); Memo1.Lines.Add(WN.EndStr); Memo1.Lines.Add(WN.DauerStr); Wn.Free; |
Moderiert von raziel: Color- durch Highlight-Tags ersetzt.
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 11.10.05 15:21
Damit ist der Beitrag beendet. Ich danke all denen, die mir geholfen haben. Hy Admin, warum kann man denen die Helfen keinen Stern verleihen???
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Di 11.10.05 15:45
Die werden automatisch verteilt, nach den Berecihen On- und Off-Topic. Die Bewertung links sagt also nicht wirklich was, nur das die anderen Wissen, wer viel im On- und Off-Topic-Bereich geschriben hat, aber nur prozentual.
|
|
Amateur
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: Di 11.10.05 15:57
wie wäre es wenn du wenigstens mal posten würdest wie du es gelöst hast damit andere davon profitieren? haste es mal mit nem record versucht? ist die einfachere variante da nur zahlen gespeichert werden sollen...
_________________ "Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Di 11.10.05 16:17
Nun, ich habe der Rückgabewert der Function von Integer zu String geändert. Den String bastel ich mir am Ende der Function zusammen und übergebe ihn mit einen result an das Programm. Am Ende muss der string h:m stehen. das ist das wichtigste. Und wenn ich es mir recht überlege, ist selbst das nicht zwingend notwendig. Ich wollte es nur wissen, weil ich Erfahrung sammeln wollte.
Die vorgeschlagenen Quelltexte probiere ich morgen. Aber sehen vielversprechend aus.
Trotzdem freut es mich immer wieder, dass man trotz nervender Fragen(meinerseits), noch freundliche Antworten erhält und trotzdem geholfen bekommt. Ein Dank an die Geduld.
PS: Es führen viele Wege nach Rom.
THX & Gruß, mexx
|
|
|