Entwickler-Ecke
Sonstiges (Delphi) - Ergebnisse aus Procedure einer eigenen Komponente erhalten
mexx - Mo 10.10.05 15:40
Titel: Ergebnisse aus Procedure einer eigenen Komponente erhalten
Hallo,
ich habe eine eigene Komponente geschrieben. In dieser Komponente werden 5 Werte übergeben und berechnet. Am Ende habe ich 3 neue Werte, die ich auslesen will.
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Unit rechne;
...
implementation
procedure rechne.Berechne(a, b, c, d: Integer); var erg1, erg2, erg3: integer; begin
erg1 := a; erg2 := b; erg3 := c:
end; |
Wie kann ich jetzt in meinen Prog., in welchen ich die Komponente einfüge und die Werte a,b,c,d übergebe, die Werte erg1, erg2 und erg3 auslesen?
THX!
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt
Heiko - Mo 10.10.05 15:42
den Prozeduren-Kopf musst du im Interface-Teil noch einmal reinschreiben.
mexx - Mo 10.10.05 15:48
Habe ich, aber wie Spreche ich im Prog. die Ergebnisse der Procedure der Komponente an?
Heiko - Mo 10.10.05 15:49
Kannst du mal die gesamte Unit uns geben, dann sehe ich auch, was wirklich fehlt ;).
mexx - Mo 10.10.05 15:56
Das wird Dir nix bringen, weil es vom Prinzip das ist, was ich oben bereits geschrieben habe. Aber wie weise ich jetzt im Programm, in dem ich die Komponente einfüge, die ergebnisse Label's zu.
Halt irgendwie so: Label1.Caption := Rechne.Berechne.erg1;
Verstehst Du mich jetzt?
[2. Beitrag]
Es geht ja net um die Unit...die Funzt ja. Aber ich weis nicht, wie ich die erg's im Prog. anderen var's zuweise.
[3. Beitrag]
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, WorkTime, StdCtrls;
type TForm1 = class(TForm) Label1: TLabel; WorkTime1: TRechne; procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Rechne.a := 4; Rechne.b := 45; Rechne.c := 13; Rechne.d := 30;
end;
end. |
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt
Moderiert von
raziel: 3 Beiträge zusammengefasst.
Heiko - Mo 10.10.05 18:20
Mhm, ich musws mich wohl falsch ausgedrückt haben ;). Ich wollte eigentlich den Quelltext der Komponenten (also die Unit) haben.
Amateur - Mo 10.10.05 19:03
ich würd ma sagen ne eigene klasse deren methode das berechne is und 3 eigenschaften nämlich erg1 und so. oder nen record in den das eingespeichert wird. ansonsten kannst du keine lokalen variablen außerhalb der procedure ansprechen. dafür gibts ja dann auch globale variablen was noch ne methode wäre. musste dir überlegen was am sinnvollsten wäre. ich denke ne klasse oder nen record is das beste wenn du mehrere rechnen proceduren in die unit schreiben willst. außerdem ist berechne udn rechne kein sinnvoler name für sowas da es wenig über die funktin der procedure und der unit aussagt. aber das nur mal am rand
mexx - Di 11.10.05 07:53
Ich danke euch, für eure Antworten, aber nun bin ich immer noch nicht schlauer. Wie mache ich das den nun, dass ich die Variablen erg1, erg2 und erg3, welche die Ergebnisse der Procedure sind, in meinen Quelltext des Programms anspreche/zuweise.
TommyK - Di 11.10.05 08:22
Also nochmal zu deinem Problem!!
mit der Übergabe der Ergebnisse...
du erstellst dir zuerst einen benutzerdefinierten Typen
z.B:
type
TErg = record
erg1 = integer;
erg2 = integer;
erg3 = integer;
end;
und dann machst du aus deiner Prozedure eine Funktion
also function berechne (a,b,c,d : integer) : TErg;
dann kannst du aus deinem Hauptprogramm folgendes aufrufen:
label1.caption:=berechne.erg1;
so far...
hoffe ich habe dir geholfen !
TK
mexx - Di 11.10.05 09:13
Ok, ich habe jetzt aus der Procedure eine Function gemacht. Der Ergebnisstyp ist ein eigener Record. Funzt!
Wenn ich die Ergebnisse ansprechen will...
Label1.caption := Komponentenname.berechne.erg1
... bekomme ich die Fehlermeldung "Nicht genügend wirklich Parameter".
Woran liegt es? Die Records werden in dem Auswahlfenster angenach zeigt. Ich habe die Records nach deiner Vorgabe erstellt.
THX
Heiko - Di 11.10.05 09:24
Bei berechne fehlen die Parameterübergaben, zum Berechnen von Erg1 & Co.
Delphi-Quelltext
1:
| Label1.caption:=Komponentenname.berechne(a, b, c, d).erg1 |
mexx - Di 11.10.05 09:34
Ok, es funktioniert, aber das Ergebniss ist falsch. Da ich jedoch die Function bereits getestet habe, weis ich, dass die Ergebnisse stimmen müssen. Da ich aber was anderes bekomme, muss der Fehler irgendwo andere sein.
In der Komponente soll es um die Berechnung von der Dauer zwischen zewi Zeiten.
Komponente
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:
| 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(DuraHour, DuraMin, Q, DuraHelp, dez: Integer): Terg; { 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(DuraHour, DuraMin, Q, DuraHelp, dez: Integer) :Terg; var i: integer; begin IF FStartHour < FEndHour Then begin FStartHour := 24 - FStartHour; FEndHour := 24 - FEndHour; FStartMin := 60 - FStartMin; FEndMin := FEndMin;
DuraHour := FStartHour - FEndHour; //Gesamtstunden end else begin FStartHour := 24 - FStartHour; FEndHour := FEndHour; FStartMin := 60 - FStartMin; FEndMin := FEndMin;
DuraHour := FStartHour + FEndHour; //Gesamtstunden end;
DuraMin := FStartMin + FEndMin; //Gesamtminuten
DuraHelp:= DuraHour * 60; //Gesamtstunden in Minuten
IF FBreakTime > 0 then //Abzug der Pausenzeit von Gesamtminuten begin DuraMin := DuraHelp + DuraMin - FBreakTime; end else begin DuraMin := DuraHelp + DuraMin; end;
Q := DuraMin div 60; //Quotient der Stunden
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 DuraHour:= DuraHour - 1; //Ergebniss Stunden
dez := DuraMin * 100 div 60; //Dezimal DuraHour,dez
end;
procedure Register; begin RegisterComponents('test', [TWorkTime]); end;
end. |
Ich betone nochmals, dass die Ergebnisse stimmen müssten, da ich Sie bereits getestet habe mittels result. Aber beim Ansprechen muss was schief gehen, so dass ich falsche Werte bekomme.
Programm
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.FormCreate(Sender: TObject); var DuraHour, DuraMin, Dez, Q, DuraHelp :Integer; begin WorkTime1.StartHour := 4; WorkTime1.StartMin := 45;
WorkTime1.EndHour := 13; WorkTime1.EndMin := 30;
WorkTime1.BreakTime := 30;
Label1.Caption:=IntToStr(WorkTime1.Berechne(DuraHour, DuraMin, q, DuraHelp, dez).DuraHour) + ':' + IntToStr(WorkTime1.berechne(DuraHour, DuraMIn, q, DuraHelp, dez).DuraMin); end; |
Kroko - Di 11.10.05 09:46
mexx hat folgendes geschrieben: |
...
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.FormCreate(Sender: TObject); var DuraHour, DuraMin, Dez, Q, DuraHelp :Integer; begin WorkTime1.StartHour := 4; WorkTime1.StartMin := 45;
WorkTime1.EndHour := 13; WorkTime1.EndMin := 30;
WorkTime1.BreakTime := 30;
Label1.Caption:=IntToStr(WorkTime1.Berechne(DuraHour, DuraMin, q, DuraHelp, dez).DuraHour) + ':' + IntToStr(WorkTime1.berechne(DuraHour, DuraMIn, q, DuraHelp, dez).DuraMin); end; | |
Kann es sein, dass die Variablen
Delphi-Quelltext
1:
| DuraHour, DuraMin, Dez, Q, DuraHelp :Integer; |
nicht initialisiert sind :?:
mexx - Di 11.10.05 09:49
Hmm??? :?
Heiko - Di 11.10.05 09:55
Du musst den, von Kroko genannten, Variablen auch noch Werte zuordnen, mit denen die Prozedur arbeiten soll. Wenn du es nicht machst, nimmt er irgendwelche "zufälligen" Werte.
mexx - Di 11.10.05 10:00
Das ist das erste mal, dass ich eine eigene Komponente schreibe, daher frage ich...tue ich das nicht mit?
Quelltext
1:
| WorkTime1.StartHour := 4; |
Heiko - Di 11.10.05 10:06
Jupp, aber nicht die, die du brauchst. Die hervorgehobenen musst du initialisieren.
Delphi-Quelltext
1:
| Label1.Caption:=IntToStr(WorkTime1.Berechne(DuraHour, DuraMin, q, DuraHelp, dez).DuraHour) + ':' + IntToStr(WorkTime1.berechne(DuraHour, DuraMIn, q, DuraHelp, dez).DuraMin); |
mexx - Di 11.10.05 10:11
Aber diese Variablen sind Ergebnisse die entweder während oder am Ende der function auch Werte zugewiesen bekommen.
Ich weise beginnzeit, endzeit und pausenzeit der Komponente als Eigenschaft zu. Sie übernimmt dies in die function und liefert(soll) DuraHour, DuraMin und Dez als Ergebniss ausliefern. Q und DuraHelp sind variablen die nur als Hilfe in der function benötigt werden. Ich kann sie aber hier
Quelltext
1:
| Label1.Caption:=IntToStr(WorkTime1.Berechne(DuraHour, DuraMin, q, DuraHelp, dez).DuraHour) |
nicht weg lassen, weil ich dann die Fehlermeldung bekomme, dass nicht genug Parameter vorhanden seinen.
Kroko - Di 11.10.05 10:19
Kann es sein, dass Du mit deinen eigenen Variablen nicht mehr durch schaust :?:
daher Vorschlag:
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:
| type TNewWorkTime = class constructor Create (A,B,C,D,E: Integer); private FA,FB,FC,FD,FE, FErg1,FErg2,FErg3: Integer; procedure InternCalc; public procedure Berechne (A,B,C,D,E: Integer); property Erg1: Integer read FErg1; property Erg2: Integer read FErg2; property Erg3: Integer read FErg3; end;
procedure TNewWorkTime.Berechne(A, B, C, D, E: Integer); begin FA := A; FB := B; FC := C; FD := D; FE := E; InternCalc; end;
constructor TNewWorkTime.Create(A, B, C, D, E: Integer); begin inherited Create; Berechne (A,B,C,D,E); end;
procedure TNewWorkTime.InternCalc; begin
end; |
mexx - Di 11.10.05 10:29
Ich bin dir sehr dankbar für deine Hilfe, aber glaub mir bitte..ich blicke sehr wohl durch. Die Ergebnisse für DuraHour, DuraMin und Dez stimmen. Mit Result erhalte ich das richtige Ergebniss. Da ich aber alle 3 zuweisen will, brauchte ich die Hilfe mit den Record. Aber das Ergebniss ist nicht 8:15 wie es sein sollt sondern 1023:342424.
Und ich weis nicht, woran das liegt.
Kroko - 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!
mexx - Di 11.10.05 11:21
Zitat: ...Dein Weg berechnet 3x und Du nutzt nur immer einen Teil...
Was meinst Du damit?
Kroko - 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; |
Heiko - 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 - 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 - Di 11.10.05 11:53
Ich habe die Komponente wie folgt geändert. Geändertes wird gekennzeichnet.
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;
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 - 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 - Di 11.10.05 14:42
zum Testen:
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;
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.
mexx - 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 - 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 - 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...
mexx - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!