Autor Beitrag
mexx
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



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

ausblenden 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

//Algorithmus

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 user profile iconraziel: Code- durch Delphi-Tags ersetzt
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Mo 10.10.05 15:42 
den Prozeduren-Kopf musst du im Interface-Teil noch einmal reinschreiben.
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Mo 10.10.05 15:48 
Habe ich, aber wie Spreche ich im Prog. die Ergebnisse der Procedure der Komponente an?
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Mo 10.10.05 15:49 
Kannst du mal die gesamte Unit uns geben, dann sehe ich auch, was wirklich fehlt ;).
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: 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]
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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Rechne.a := 4;        //Hier übergebe ich der Komponente die Werte
Rechne.b  := 45;
Rechne.c   := 13;
Rechne.d    := 30;



//Hier will ich jetzt erg1, erg2, erg3 anderen Variablen zuweisen...nur WIE???
end;

end.


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconraziel: 3 Beiträge zusammengefasst.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



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



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



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



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



BeitragVerfasst: Di 11.10.05 09:24 
Bei berechne fehlen die Parameterübergaben, zum Berechnen von Erg1 & Co.

ausblenden Delphi-Quelltext
1:
Label1.caption:=Komponentenname.berechne(a, b, c, d).erg1					
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



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

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 11.10.05 09:46 
user profile iconmexx hat folgendes geschrieben:

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



BeitragVerfasst: Di 11.10.05 09:49 
Hmm??? :?
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



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



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

ausblenden Quelltext
1:
WorkTime1.StartHour := 4;					
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Di 11.10.05 10:06 
Jupp, aber nicht die, die du brauchst. Die hervorgehobenen musst du initialisieren.

ausblenden Delphi-Quelltext
1:
Label1.Caption:=IntToStr(WorkTime1.Berechne(DuraHour, DuraMin, q, DuraHelp, dez).DuraHour) + ':' + IntToStr(WorkTime1.berechne(DuraHour, DuraMIn, q, DuraHelp, dez).DuraMin);					
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 11.10.05 10:19 
Kann es sein, dass Du mit deinen eigenen Variablen nicht mehr durch schaust :?:
daher Vorschlag:
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:
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;


{ TNewWorkTime }

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



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