Autor Beitrag
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: 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.)( :wink: ) 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Di 11.10.05 11:21 
Zitat: ...Dein Weg berechnet 3x und Du nutzt nur immer einen Teil...

Was meinst Du damit?
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 11.10.05 11:31 
du rufst 3mal berechne auf um die Werte anzuzeigen
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Di 11.10.05 11:36 
user profile iconmexx 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



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Function berechne(a,b,c,d):TErg;
begin
..
..
..// Algorithmus

berechne.erg1:= // dann das ergebnis das du als erstes zurückgeben willst
berechne.erg2:= // dann das ergebnis das du als zweites zurückgeben willst
berechne.erg3:= // dann das ergebnis das du als drittes zurückgeben willst

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 user profile iconraziel: Delphi-Tags hinzugefügt.
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Di 11.10.05 11:53 
Ich habe die Komponente wie folgt geändert. Geändertes wird gekennzeichnet.

ausblenden volle Höhe Delphi-Quelltext
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;


    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
   function Berechne: String;
    { Public-Deklarationen }
  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;
    { Published-Deklarationen }

  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;            //24 - 04 = 20
  FEndHour        := 24 - FEndHour;              //24 - 13 = 11
  FStartMin       := 60 - FStartMin;             //60 - 45 = 15
  FEndMin         := FEndMin;                    //30      = 30

  DuraHour        := FStartHour - FEndHour;     //Gesamtstunden 20 - 11 = 9
 end
  else
   begin
    FStartHour    := 24 - FStartHour;
    FEndHour      := FEndHour;
    FStartMin     := 60 - FStartMin;
    FEndMin       := FEndMin;

    DuraHour      := FStartHour + FEndHour;    //Gesamtstunden
   end;

DuraMin := FStartMin + FEndMin;     //Gesamtminuten  15 + 30 = 45

DuraHelp:= DuraHour * 60;           //Gesamtstunden in Minuten 9 * 60 = 540


IF FBreakTime > 0 then               //Abzug der Pausenzeit von Gesamtminuten
 begin
  DuraMin := DuraHelp + DuraMin - FBreakTime;  //540 + 45 - 30 = 555
 end
  else
   begin
    DuraMin := DuraHelp + DuraMin;
   end;


Q := DuraMin div 60;             //Quotient der Stunden  555 div 60 = 9,25

DuraHour := 0;

  for i:=1 to Q do               //Mit jeder 60. Minute wird eine Stunde addiert
   begin
    DuraHour := DuraHour + 1;
    DuraMin  := DuraMin - 60
   end;

DuraMin := DuraMin;              //Ergebniss Minuten  Rest: 15
DuraHour:= DuraHour - 1;         //Ergebniss Stunden  9 - 1 = 8 <-- verwirrend, muss aber gemacht werden

dez := DuraMin * 100 div 60;     //Dezimal   DuraHour,dez

result := IntToStr(DuraHour) + ':' + IntToStr(DuraMin); // 8 Stunden und 15 Minuten


end;


Im Prog. wird einen Label lediglich das result zugewiesen.

ausblenden 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 user profile iconraziel: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconraziel: Color- durch Highlight-Tags ersetzt.
Amateur
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 777

(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
BeitragVerfasst: 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)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 11.10.05 14:42 
zum Testen:
ausblenden volle Höhe Delphi-Quelltext
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;


    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    function Berechne: String;
    { Public-Deklarationen }
  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;
    { Published-Deklarationen }

  end;
type
{-- Type: --}
  TNewTimeRec = record
    Hour,Min: Word;
  end;
{-- Class: --}
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;            //24 - 04 = 20
  FEndHour        := 24 - FEndHour;              //24 - 13 = 11
  FStartMin       := 60 - FStartMin;             //60 - 45 = 15
  FEndMin         := FEndMin;                    //[highlighte]30      = 30
  DuraHour        := FStartHour - FEndHour;     //Gesamtstunden 20 - 11 = 9
 end
  else
   begin
    FStartHour    := 24 - FStartHour;
    FEndHour      := FEndHour;
    FStartMin     := 60 - FStartMin;
    FEndMin       := FEndMin;

    DuraHour      := FStartHour + FEndHour;    //Gesamtstunden
   end;

DuraMin := FStartMin + FEndMin;     //Gesamtminuten  15 + 30 = 45
DuraHelp:= DuraHour * 60;           //Gesamtstunden in Minuten 9 * 60 = 540

IF FBreakTime > 0 then               //Abzug der Pausenzeit von Gesamtminuten
 begin
  DuraMin := DuraHelp + DuraMin - FBreakTime;  //540 + 45 - 30 = 555
 end
  else
   begin
    DuraMin := DuraHelp + DuraMin;
   end;


Q := DuraMin div 60;             //Quotient der Stunden  555 div 60 = 9,25
DuraHour := 0;

  for i:=1 to Q do               //Mit jeder 60. Minute wird eine Stunde addiert
   begin
    DuraHour := DuraHour + 1;
    DuraMin  := DuraMin - 60
   end;

DuraMin := DuraMin;              //Ergebniss Minuten  Rest: 15
DuraHour:= DuraHour - 1;         //Ergebniss Stunden  9 - 1 = 8 <-- verwirrend, muss aber gemacht werden
dez := DuraMin * 100 div 60;     //Dezimal   DuraHour,dez
result := IntToStr(DuraHour) + ':' + IntToStr(DuraMin); // 8 Stunden und 15 Minuten

end;

{ TNewWorkTime }

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
ausblenden 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 user profile iconraziel: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 777

(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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