Autor Beitrag
Tiga
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 13.12.05 14:17 
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

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


Zuletzt bearbeitet von Tiga am Di 13.12.05 14:42, insgesamt 3-mal bearbeitet
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 13.12.05 14:23 
Hm?
Meinst du sowas?

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

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 13.12.05 14:26 
ausblenden 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:

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.


Zuletzt bearbeitet von Lossy eX am Di 13.12.05 14:27, insgesamt 1-mal bearbeitet
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Di 13.12.05 14:26 
Hä? Meinst du sowas?

ausblenden 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

_________________
Programmers never die, they just GOSUB without RETURN
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 13.12.05 15:47 
oder so:
ausblenden 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 ;)