Autor Beitrag
Nightfly
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 163



BeitragVerfasst: Di 07.10.03 12:05 
: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:
ausblenden 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):
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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)
ausblenden 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;

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!


Zuletzt bearbeitet von Motzi am Di 07.10.03 13:02, insgesamt 1-mal bearbeitet
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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:

ausblenden 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?

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
HTTL
Hält's aus hier
Beiträge: 9



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


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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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?

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Nightfly Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 163



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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, ...)?

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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: www.x-spy.net/personal

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
HTTL
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ausblenden 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 =)