Autor |
Beitrag |
mexx
      
Beiträge: 1183
|
Verfasst: Mo 10.10.05 15:40
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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mo 10.10.05 15:42
den Prozeduren-Kopf musst du im Interface-Teil noch einmal reinschreiben.
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: Mo 10.10.05 15:48
Habe ich, aber wie Spreche ich im Prog. die Ergebnisse der Procedure der Komponente an?
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mo 10.10.05 15:49
Kannst du mal die gesamte Unit uns geben, dann sehe ich auch, was wirklich fehlt  .
|
|
mexx 
      
Beiträge: 1183
|
Verfasst: 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]
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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: 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
_________________ "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 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
Hält's aus hier
Beiträge: 8
|
Verfasst: 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 
      
Beiträge: 1183
|
Verfasst: 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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 
      
Beiträge: 1183
|
Verfasst: 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
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
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: 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 
_________________ 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 09:49
Hmm??? 
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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 
      
Beiträge: 1183
|
Verfasst: 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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 
      
Beiträge: 1183
|
Verfasst: 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
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Di 11.10.05 10:19
Kann es sein, dass Du mit deinen eigenen Variablen nicht mehr durch schaust
daher Vorschlag:
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; |
_________________ 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 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.
|
|
|