Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Eigene Prozeduren verwenden.


Nightfly - Di 07.10.03 12:05
Titel: Eigene Prozeduren verwenden.
:oops: Ja, ich schäme mich das zu fragen, aber ich weiß wirklich nich weiter. Ich will mir jetzt einen besseren Programmierstiel angewöhnen, und in meiner Naivität hab ich gedacht: Fängst erstmal an Zeug was du oft machst in eine eigene Prozedur zu packen. Konkret: Folgenden Code fand ich in meinem Programm 3 mal:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Table2.FindFirst;
maxRec := Table2.RecordCount;
for loop := 0 to maxRec do
    begin
    Table2.Edit;
    Table2Summe.Value := Table2Jan.Value
                    +Table2Feb.Value
                    +Table2Mar.Value
                    +Table2Apr.Value
                    +Table2Mai.Value
                    +Table2Jun.Value
                    +Table2Jul.Value
                    +Table2Aug.Value
                    +Table2Sept.Value
                    +Table2Okt.Value
                    +Table2Nov.Value
                    +Table2Dez.Value;
    Table2.FindNext;


Also, Code gelöscht, und an den Anfang meines Programmes folgende Prozedur geschrieben(also nich direkt an den anfang, schon NACH implementation):

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:
Procedure Berechne;
Var
loop,maxRec : Integer;
Begin
Table2.FindFirst;
maxRec := Table2.RecordCount;
for loop := 0 to maxRec do
    begin
    Table2.Edit;
    Table2Summe.Value := Table2Jan.Value
                    +Table2Feb.Value
                    +Table2Mar.Value
                    +Table2Apr.Value
                    +Table2Mai.Value
                    +Table2Jun.Value
                    +Table2Jul.Value
                    +Table2Aug.Value
                    +Table2Sept.Value
                    +Table2Okt.Value
                    +Table2Nov.Value
                    +Table2Dez.Value;
    Table2.FindNext;

    end;

end;

So..aber wer ein bissel mehr Ahnung hat kann sich'S vielleicht schon denken: Undefinierter Bezeichner: Table2. Aber der Gleiche Code in einer Button Click Prozedur geht..und ich weiß nich wieso :(

Moderiert von user profile iconKlabautermann: Code- in Delphi-Tags geändert.


Motzi - Di 07.10.03 12:57

Das liegt daran, dass deine Button-Click Prozedur keine einfache Prozedur sondern eine Methode deiner Form ist, daher kannst du von dieser Methode auf die Objekte deiner Form zugreifen. Du hast jetzt also 2 Möglichkeiten - entweder du machst aus deiner Prozedur eine Methode (würde ich empfehlen) oder aber du greifst über die globale Variable deiner Form auf die einzelnen Objekte und Felder zu.

Zu 1)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TForm1 = class(TForm)
    {...}
  public
    procedure Berechne; // <- musst du hinzufügen
  end;

implementation

procedure TForm1.Berechne; // wichtig ist das "TForm1."
begin
  // .... dein Code
end;


smiegel - Di 07.10.03 13:00

Hallo,

da der Code der Procedure außerhalb Deines Objektes liegt, musst Du die betroffenen Tabellen als Parameter mitgeben:


Delphi-Quelltext
1:
2:
3:
Procedure Berechne(Table2, Table2Summe:TTable); // od. TADOTable od. TADODataSet od. sonstwas?
...
...


Noch ein paar Anmerkungen: muss Deine Schleife nicht von 1 bis RecordCount laufen? Was soll das Table2.Edit? Muss es nicht Table2Summe.Edit lauten?


HTTL - Di 07.10.03 13:14

ohoh da is einer über die oop gestoplert.

Du könnntest auch einfach das Formular auf dem die table steht mit angeben dann würde dein sourcecode wie folgt ausehen



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:
Procedure Berechne; 
Var 
loop,maxRec : Integer; 
Begin 
form1.Table2.FindFirst; 
maxRec := form1.Table2.RecordCount; 
for loop := 0 to maxRec do 
    begin 
    form1.Table2.Edit; 
    form1.Table2Summe.Value := Table2Jan.Value 
                    +form1.Table2Feb.Value 
                    +form1.Table2Mar.Value 
                    +form1.Table2Apr.Value 
                    +form1.Table2Mai.Value 
                    +form1.Table2Jun.Value 
                    +form1.Table2Jul.Value 
                    +form1.Table2Aug.Value 
                    +form1.Table2Sept.Value 
                    +form1.Table2Okt.Value 
                    +form1.Table2Nov.Value 
                    +form1.Table2Dez.Value; 
    form1.Table2.FindNext; 

    end

end;


das ist jetzt exemplarisch für formular 1. wenn du die Table auf form2 hast isses analog. Wenn du das form umbenannthast setz den namen davor ;)


Ich persönlich löse solche sachen aber auch lieber so wie smiegel es macht, für einfache Anwendungen brauchste des aber nicht =)

mfg httl

Moderiert von user profile iconKlabautermann: Code- in Delphi-Tags geändert.


Nightfly - Di 07.10.03 13:39

Hmmm, hab's jetzt so gemacht wie von Motzi vorgeschlagen, scheint mir das Übersichtlichste zu sein..hat das gravierende Nachteile?

Kann mir jemand den unterschied zwischen Prozedur und Methode klar machen?

@HTTL

Frag mich nich warum, aber dein Vorschlag geht nicht. Das ich das Formular davor schreibe kenn ich, aber das Problem mit der Prozedur hier findet ja in der Unit statt die zu dem Formular gehört,wo Table2 auch liegt. Ich konnte ja auch in jeder Methode (wie ich grad gelernt hab) drauf zugreifen,jedoch nicht in meiner Prozedur.

@smiegel (hmm, will da immer Smeagol schreiben, ich sollte weniger herr der ringe gucken) Table2.Edit versetzt einfach die TAbelle in den edit Modus, Table2Summe ist ja bloß ein Feld.


smiegel - Di 07.10.03 13:52

Hallo,

@nightfly:

Mich hat Table2Summe.Value stutzig gemacht. Was ist das für eine Variable?

Warum musst Du die Tabelle in den Edit-Modus versetzen, wenn Du nur lesend auf die Felder zugreifts?


Nightfly - Di 07.10.03 14:04

Das ist meine Art auf Werte in der Tabelle zuzugreifen. Table2Summe ist ein Feldname (nämlich das Feld Summe in der Tabelle2) und .Value enthält dann den wert.
Also greife ich ja nicht nur lesend auf die TAbelle zu, denn Table2Summe.Value bekommt ja was zugewiesen...


smiegel - Di 07.10.03 14:17

Hallo,

ich glaube jetzt verstehe ich was Du meinst. Du hast jedem Feld Deiner Tabelle einen eigenen Namen vergeben. Warum greifst Du nicht mit Fields['Feldname'] auf die Feldbezeichner zu?

Damit lässt sich auch Dein Problem, die Auslagerung des Codes in eine Procedure, leichter lösen.

Sicherlich wäre es auch hilfreich zu wissen, mit welchem Mechanismus Du auf die Tabelle zugreifst (ADODataset, _RecordSet, ...)?


Motzi - Di 07.10.03 14:20

Nein, es hat keine Nachteile, im Gegenteil.. es das naheliegendste und sinnvollste das ganze in einer Methode zu kapseln!

Der Unterschied zwischen einer Methode und einer Prozedur ist im großen und ganzen nur, dass eine Methode intern einen versteckten Parameter mehr mitführt (die Self-Referenz).

Schau dir vielleicht mal meine OOP-Ausarbeitung an: http://www.x-spy.net/personal


HTTL - Di 07.10.03 15:11

Night du solltest wenn du ein problem hast mal dran denken etwas genauere Angaben zur struktur zu geben. Hab gedacht das läuft alles über eine unit. Es ist bedingt möglich (ich weiß nicht genau in welchen fällen) die unit vor den Parameter zu schreiben dann würde das exemplarisch so aussehen

Quelltext
1:
2:
3:
4:
5:
6:
7:
unit x

uses unity

...

unity.form1.table...dosomething


Da du aber keine Kreuzlinks verankern kannst kann es sein das es bei dir nicht Funktioniert (du kannst nur von einer unit zur andern linken, nicht umgekehrt), aber ich kann mich erinnern das ich das mal innem Programm von mir gemacht hab.

Zum Thema OOP, schau es dir an, es hilft wenn man die ganze Struktur eines Formulares versteht =)