Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Procedure in Procedure


Tiga - Di 13.12.05 14:17
Titel: Procedure in Procedure
Hallo!
Formulire ich meine Frage etwas anders. In dem Beispiel unten, sollen, so fordert unser Lehrer, alle SetzePunkt...proceduren zu einer zusammengefasst werden, aber trotzdem noch einzeln bei TForm1.FormMouseDown... aufgerufen werden können.
Hat dafür einer eine Idee?

Danke für eure Hilfe
Tiga


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:
213:
214:
215:
216:
217:
218:
219:
220:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    BnEnde: TButton;
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BnEndeClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  durchgezogen:boolean;

implementation

{$R *.dfm}

type
 TPunkt=record  //Var a:TPunkt; begin a.x:=20; a.y:=100;
  x,y:integer;
 end;

 TZeichnen=object
  anfang,ende,aSchliessen:TPunkt;
  anfangistfestgelegt:Boolean;
  procedure Initialisieren;
  procedure SetzePunkt(x,y:integer);
  procedure Linie;
  procedure SetzePunktFuerRechteck(x,y:integer);
  procedure Rechteck;
  procedure SetzePunktFuerDreieck(x,y:integer);
  procedure Dreieck;
  procedure fuellen(x,y,hintergrundfarbe,fuellfarbe:integer);
 end;

var zeichnen:TZeichnen;
  procedure TZeichnen.Initialisieren;
    begin
    anfangistfestgelegt:=false;     //Es gibt noch keinen Anfangspunkt
    end;

  procedure TZeichnen.SetzePunkt(x,y:integer);
    begin
    if not (anfangistfestgelegt) then
      begin
      anfang.x:=x;
      anfang.y:=y;
      anfangistfestgelegt:=true;
      aSchliessen.x:=x;
      aSchliessen.y:=y;
      end
    else
      begin
      if not (durchgezogen) then
      begin
      ende.x:=aSchliessen.x;
      ende.y:=aSchliessen.y;
      linie;
      anfangistfestgelegt:=false;
      end
    else
      begin
      ende.x:=x;
      ende.y:=y;
      linie;
      anfang.x:=ende.x;
      anfang.y:=ende.y;
      end;
    end;
  end;

  procedure TZeichnen.Linie;
    begin
    Form1.Canvas.MoveTo(anfang.x,anfang.y);
    Form1.Canvas.LineTo(ende.x,ende.y);
    anfang.x:=ende.x;
    anfang.y:=ende.y;
    end;

  procedure TZeichnen.SetzePunktFuerRechteck(x,y:integer);
    begin
    if not (anfangistfestgelegt) then
      begin
      anfang.x:=x;
      anfang.y:=y;
      anfangistfestgelegt:=true;
      end
    else
      begin
      ende.x:=x;
      ende.y:=y;
      Rechteck;
      anfangistfestgelegt:=false;
      end;
    end;

  procedure TZeichnen.Rechteck;
    begin
    Form1.Canvas.MoveTo(anfang.x,anfang.y);
    Form1.Canvas.LineTo(ende.x,anfang.y);
    Form1.Canvas.LineTo(ende.x,ende.y);
    Form1.Canvas.LineTo(anfang.x,ende.y);
    Form1.Canvas.LineTo(anfang.x,anfang.y);
    end;

   procedure TZeichnen.SetzePunktFuerDreieck(x,y:integer);
    begin
    if not (anfangistfestgelegt) then
      begin
      anfang.x:=x;
      anfang.y:=y;
      anfangistfestgelegt:=true;
      end
    else
      begin
      ende.x:=x;
      ende.y:=y;
      Dreieck;
      anfangistfestgelegt:=false;
      end;
    end;

  procedure TZeichnen.Dreieck;
    begin
    Form1.Canvas.MoveTo(anfang.x,anfang.y);
    Form1.Canvas.LineTo(ende.x,anfang.y);
    Form1.Canvas.LineTo(ende.x,ende.y);
    Form1.Canvas.LineTo(anfang.x,ende.y);
    Form1.Canvas.LineTo(anfang.x,anfang.y);
    Form1.Canvas.MoveTo(anfang.x,anfang.y);
    Form1.Canvas.LineTo(round((anfang.x+ende.x)/2),ende.y);
    Form1.Canvas.LineTo(ende.x,anfang.y);
    end;

    procedure TZeichnen.fuellen(x,y,hintergrundfarbe,fuellfarbe:integer);
    begin
    Form1.Canvas.Pixels[x,y]:=fuellfarbe;
    Form1.Canvas.Refresh;

    if Form1.Canvas.Pixels[x,y+1]=hintergrundfarbe then
      fuellen(x,y+1,hintergrundfarbe,fuellfarbe);

    if Form1.Canvas.Pixels[x,y-1]=hintergrundfarbe then
      fuellen(x,y-1,hintergrundfarbe,fuellfarbe);

    if Form1.Canvas.Pixels[x+1,y]=hintergrundfarbe then
      fuellen(x+1,y,hintergrundfarbe,fuellfarbe);

    if Form1.Canvas.Pixels[x-1,y]=hintergrundfarbe then
      fuellen(x-1,y,hintergrundfarbe,fuellfarbe);
    end;
  
  procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
   begin
    if (button=mbleft) and not (ssshift in shift) then
      begin
      durchgezogen:=true;
      zeichnen.SetzePunkt(x,y);
      end;

    if (button=mbleft) and (ssshift in shift) then
      begin
     zeichnen.SetzePunktFuerRechteck(x,y);
     end;

    if (button=mbmiddle) and not (ssshift in shift) then
     begin
     durchgezogen:=true;
     zeichnen.fuellen(x,y,Form1.Canvas.Pixels[x,y],clred);
     end;

   if (button=mbmiddle) and (ssshift in shift) then
     begin
     durchgezogen:=true;
     zeichnen.fuellen(x,y,Form1.Canvas.Pixels[x,y],clgreen);
     end;

    if (button=mbright) and not (ssshift in shift) then
      begin
      durchgezogen:=false;
      zeichnen.SetzePunkt(x,y);
      end;

    if (button=mbright) and (ssshift in shift) then
      begin
      zeichnen.SetzePunktFuerDreieck(x,y);
      end;
    end;

  procedure TForm1.BnEndeClick(Sender: TObject);
    begin
    close;
    end;

  procedure TForm1.FormCreate(Sender: TObject);
   begin
   Zeichnen.Initialisieren;
   end;

end.


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
Moderiert von user profile iconraziel: Titel geändert: Überflüssige Fragezeichen entfernt.


opfer.der.genauigkeit - Di 13.12.05 14:23

Hm?
Meinst du sowas?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure MyExample;
  procedure InlineProcedure1;
  begin
    { todo: add your code here }
  end;

  procedure InlineProcedure2;
  begin
    { todo: add your code here }
  end;
begin
  InlineProcedure1;
  InlineProcedure2;
end;


Lossy eX - Di 13.12.05 14:26


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure blah;

  procedure Troet;

    procedure Troet2;
    begin
    end;

  begin
    Troet2;
  end;

  procedure Blub;
  begin
    Troet;
  end;

begin
  blub;
end;


Das lässt sich noch beliebig verschachteln. Aber vorsicht. Man verliehrt sehr schnell den Überblick und ehrlich gesagt halte ich das nicht für die sinnvollste Art zu Programmieren. Hast du komplexe Sache zu tun, dann erstelle lieber ein Objekt und benutze private Methoden. Für kleine (3-4 Zeiler) Hilfsfunktionen spricht allerdings nichts gegen diese Proceduren. Aber auch dann würde ich es auf 1 Ebene und Maximal ca. 3 Methoden beschränken wollen. Bei allem anderen sollte man schon überlegen ob man das nicht anders machen sollte.

[edit] Massenpostings :twisted:


alias5000 - Di 13.12.05 14:26

Hä? Meinst du sowas?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Procedure MainProc;
  
  Procedure SubOne;
  var i: integer;
  begin
  {...}
  end;

  Procedure SubTwo;
  begin
  {...}
  end;

begin
SubOne;
SubTwo;
end;


Oder wie?

Gruß alias5000


F34r0fTh3D4rk - Di 13.12.05 15:47

oder so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Procedure MainProc(parameter: integer);
  
  Procedure SubOne;
  var i: integer;
  begin
  {...}
  end;

  Procedure SubTwo;
  begin
  {...}
  end;

begin
if parameter = 0 then
  SubOne;
if parameter = 1 then
SubTwo;
{...}
end;

oder ggflls überladene funktionen ;)