Autor Beitrag
M. Raab
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Sa 17.08.02 15:57 
Hallo NG,

irgendwas mache ich falsch: :oops:

Hier mal die Prozedur:
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:
Procedure PROFILE_SCREEN;

  Var  lauf1     : integer;

   procedure form_loeschen;
     begin
       profil[lauf1].destroy;
       profil[lauf1]:=nil;
     end;


   procedure form_anlegen;
     begin
       Application.CreateForm(TForm,Profil[lauf1]);
       with profil[lauf1] do
         begin
           caption:=inttostr(lauf1)+'. Profil von : '+form1.table1.FieldByName('BEZ').asstring;
           autosize:=false;
           borderstyle:=bssingle;
           clientheight:=550;
           clientwidth:=750;
           constraints.maxheight:=600;
           constraints.maxwidth:=800;
           constraints.minheight:=600;
           constraints.minwidth:=800;
           cursor:=crHandPoint;

           weiter:=TButton.Create(Profil[lauf1]);
           weiter.parent:=profil[lauf1];
           weiter.top:=1;
           weiter.left:=100;
           weiter.width:=100;
           weiter.caption:='Profil vorwärts';
           weiter.visible:=true;
           weiter.onclick:=weiterclick;

           Bild:=TImage.Create(Profil[lauf1]);
           bild.parent:=profil[lauf1];
           bild.cursor:=crHandPoint;
           Bild.visible:=true;
           Bild.Top:=8;
           Bild.Left:=20;
           Bild.height:=550;
           bild.width:=750;
           bild.visible:=true;
           bild.visible:=true;
           bild.enabled:=true;
           bild.canvas.Pen.width:=2;

           profil_zeichnen(lauf1);

           windowstate:=wsminimized;
           show;
         end;
     end;

begin

  setlength(profil,BLMAX+1);

  for lauf1:=1 to BLMAX do
    if profil[lauf1]=nil then
      begin
        form_anlegen;
      end else begin
        form_loeschen;
        form_anlegen;
      end;

end;

TPROFIL habe ich am Programmanfang wie folgt definiert:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
  TProfil = class(Tform)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

BILD und WEITER sind global definiert und vom Typ TImage bzw. TBUtton

Mit dem Programm sollen mehrere Fenster geöffnet werden, in dem sich verschiedene Profile befinden. Mit dem Button WEITER möchte ich, dass man auch schnell weiterblättern kann. Also das Profil 1 (=PROFIL[1]) schließt sich, und Nr.2 öffnet sich. Der Benutzer kann dies auch manuell üner die SYstemknöpfe machen. Das hier soll das ein wenig erleichetern.

Problem nun: ich schaffe es nicht, dem Button das Ereignis zuzuordnen. Entwerder meldet er, dass weiterclick nicht existiert oder aber nur eine normale PRozedur sei oder eine ungenügende FORWARD Klausel hat.

Kann mir jemand helfen ?

Gruß

Markus :?: :roll:
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: So 18.08.02 09:52 
Iss ne ganze weile her, aber ich dachte es geht so:
1:Prozedur deklarieren (im var Bereich der Unit), sie muss identisch mit Button1.click sein!!!(Parameter!!!)
2:Button1.onclick := procname;

Das müsste funzen.

wieso überhaupt mehrere Fenster, man könnte das ganze do in so ne Tab Sheet-Kompo oä reinbasteln, oder willst du unbedignt mehrere Profile sync anzeigen?

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: So 18.08.02 10:31 
Hallo

vielen Dank - aber das funzt nicht.

Wenn ich die Prozedur deklariere, kommt immer die Fehlermeldung: ungenügende Forward Klausel bzw. External Deklaration.

Deklariere ich sie in der Subroutine kommt die Fehlermeldung: inkompatible Typen Methodenzeiger und reguläre Prozedur.

Zweck dieser Fenster ist, dass dort Schnitte aus einem Scanner dargestellt werden und man so mehere gleichzeitig sehen kann. Gleichzeitig kann man dann die Fenster übereinander schieben und so Unterschiede betrachten.

Vielleicht hast DU noch nen Tipp - langsam verzweifle ich...... :( :( :(


Danke und Gruß

Markus
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: So 18.08.02 13:09 
M. Raab hat folgendes geschrieben:
Wenn ich die Prozedur deklariere, kommt immer die Fehlermeldung: ungenügende Forward Klausel bzw. External Deklaration
Kannst Du mal den Code posten wie Du die Methode implementierst.

Gruß
TINO
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: So 18.08.02 14:36 
Hallo,

deine Procedure weiterclick muß innerhalb einer Klasse definiert sein,
z.B. in deinem TProfil

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
  TProfil = class(Tform)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure weiterclick(Sender: TObject);
  end;


und die Implementierung sieht sieht dann so aus

ausblenden Quelltext
1:
2:
3:
4:
procedure TProfil.weiterclick(Sender: TObject);
begin

end;



So sollte es wie gewünscht funktionieren.

bis denn,
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Sa 24.08.02 14:07 
Hallo

vielen Dank für Eure Hilfe - funzt immer noch nicht.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
  TProfil = class(Tform) 
  private 
    { Private-Deklarationen } 
  public 
    { Public-Deklarationen } 
-->    procedure weiterclick(Sender: TObject); 
  end;

Nun kommt dort sofort die Fehlermeldung ungenügende Forward bzw. External Klausel (also dort wo ich den Pfeil hin gemacht habe).

Die Implementierung der Prozedur mache ich am Anfang der Unit unter implementation, wo auch die anderen SRT sind.

Kann jemand noch helfen ?

Gruß

Markus
aogwaba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: Sa 24.08.02 14:25 
Wenn das eine Klassenmethode ist, musst du's machen wie
SvenAbeln geschrieben hat.
Wenn der Code nicht zu gross ist, lass doch mal was sehen, ist sicher
Erfolversprechender als dieses Rätselraten.

Was ist SRT?

cu
waba
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Sa 24.08.02 16:37 
Hallo,

hier der Code. Das Programm besteht z.Zt. nur aus einer Unit: WEST1, und die beginnt so:
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:
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:
unit WEST1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  comm_async, Grids, Math, Printers, DBTables, DBGrids, Mask, DBCtrls,
  Menus, StdCtrls,ExtCtrls,GIFCtrl, Db, RXClock, Animate;

type
  TProfil = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    Memo1: TMemo;
    Button3: TButton;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    ComboBox2: TComboBox;
    Button4: TButton;
    Button8: TButton;
    Button9: TButton;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Table1: TTable;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    Label3: TLabel;
    Label4: TLabel;
    RxGIFAnimator2: TRxGIFAnimator;
    Label5: TLabel;
    DBEdit3: TDBEdit;
    RxGIFAnimator1: TRxGIFAnimator;
    CommSer1: TCommSer;
    Timer1: TTimer;
    Label6: TLabel;
    Label7: TLabel;
    RxClock1: TRxClock;
    GroupBox2: TGroupBox;
    ComboBox3: TComboBox;
    ComboBox4: TComboBox;
    ComboBox5: TComboBox;
    Button5: TButton;
    Button6: TButton;
    Label8: TLabel;
    StringGrid1: TStringGrid;
    Label9: TLabel;

    procedure FormShow(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Comm1CharReceived(Sender: TObject; cbInQue: Cardinal);
    procedure Button8Click(Sender: TObject);
    procedure DBEdit1KeyPress(Sender: TObject; var Key: Char);
    procedure DBEdit2KeyPress(Sender: TObject; var Key: Char);
    procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button4Click(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure CommSer1CharReceived(Sender: TObject; cbInQue: Cardinal);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure DBEdit3KeyPress(Sender: TObject; var Key: Char);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure ComboBox4Change(Sender: TObject);
    procedure ComboBox4KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ComboBox5KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ComboBox3KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ComboBox4KeyPress(Sender: TObject; var Key: Char);
    procedure ComboBox5KeyPress(Sender: TObject; var Key: Char);
    procedure ComboBox3KeyPress(Sender: TObject; var Key: Char);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var

  PROFIl    : array of TProfil;
  Bild      : TImage;

  **** hier kommen dann die restlichen Variablendefs ****  
  **** diese Variablen sind auch global definiert *************
.
.
.
.

implementation

{$R *.DFM}


Procedure PROFILE_SCREEN;

  Var  lauf1     : integer;
        Weiter    : TButton;
       Zurueck   : TButton;

   procedure form_loeschen;
     begin
       profil[lauf1].destroy;
       profil[lauf1]:=nil;
     end;

   procedure form_anlegen;
     begin
       Application.CreateForm(TForm,Profil[lauf1]);
       with profil[lauf1] do
         begin
           caption:=inttostr(lauf1)+'. Profil von : '+form1.table1.FieldByName('BEZ').asstring;
           autosize:=false;
           borderstyle:=bssingle;
           clientheight:=550;
           clientwidth:=750;
           constraints.maxheight:=600;
           constraints.maxwidth:=800;
           constraints.minheight:=600;
           constraints.minwidth:=800;
           cursor:=crHandPoint;
           position:=poscreencenter;

           weiter:=TButton.Create(Profil[lauf1]);
           weiter.parent:=Profil[lauf1];
           weiter.top:=10;
           weiter.left:=100;
           weiter.width:=100;
           weiter.caption:='Profil vorwärts';
           weiter.visible:=true;

           zurueck:=TButton.Create(Profil[lauf1]);
           zurueck.parent:=Profil[lauf1];
           zurueck.top:=10;
           zurueck.left:=201;
           zurueck.width:=100;
           zurueck.caption:='Profil zurück';
           zurueck.visible:=true;


           Bild:=TImage.Create(Profil[lauf1]);
           bild.parent:=profil[lauf1];
           bild.cursor:=crHandPoint;
           Bild.visible:=true;
           Bild.Top:=8;
           Bild.Left:=20;
           Bild.height:=550;
           bild.width:=750;
           bild.visible:=true;
           bild.visible:=true;
           bild.enabled:=true;
           bild.canvas.Pen.width:=2;

           profil_zeichnen(lauf1);
           windowstate:=wsminimized;
           show;
         end;
     end;

begin

  setlength(profil,BLMAX+1);

  for lauf1:=1 to BLMAX do
    if profil[lauf1]=nil then
      begin
        form_anlegen;
      end else begin
        form_loeschen;
        form_anlegen;
      end;

  profil[1].windowstate:=wsnormal;

end;

Die Sache von Sven habe ich bereits ausprobiert - da kam dann die vorhin gepostete Meldung.

Sorry wegen der Abkürzung: SRT=Subroutine.

Ich hoffe, mir kann jemand helfen.

Gruß und vielen Dank für Eure Bemühungen. Ich habe selten ein so nettes und hilfsbereites Forum gesehen.

Gruß


Markus :D :D :D :D :D :D :D :D
aogwaba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: Sa 24.08.02 17:37 
und wo ist die 'weiterclick' Implementation...
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: So 25.08.02 10:16 
Hallo,

die Definition habe ich wieder raus genommen, da immer dieser FORWARD Fehler kommt. Ich habe es aber so gemacht, wie Sven das beschrieben hat.

Also:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  TProfil = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure weiterclick(Sender: TObject); <---hier kommt Fehlermeldung
  end;


Säter dann:

implementation

{$R *.DFM}

procedure weiterclick(Sender: Tobject);
  begin
   application.messagebox(...);  <-- zum Testen habe ich hier nur ne Box
  end;

Und in meiner Subroutine FORM_ANLEGEN in der Routine PROFILE_SCREEN käme eine Zeile hinzu:
ausblenden Quelltext
1:
2:
3:
4:
weiter.width:=100;
weiter.caption:='Profil vorwärts';
weiter.visible:=true;
weiter.onclick:=weiterclick(Sender:TObject);

So: so hätte ich das gemacht.

Dazu noch eine Frage:

Wenn ich meine zur Laufzeit erzeugten Forms (also PROFILE) schließe, möchte ich auf das Ereignis onclosequery reagieren. Wie kann man dann das machen ? Analog also so:
ausblenden Quelltext
1:
profil[lauf1].onclosequery:=aus(Sender:Profil[lauf1]);					

Und die Definition von aus(Sender:TProfil) wieder so wie weiterclick(..) ?

Danke und Gruß


Markus

:D :D :D :D :D :D :D :D :D
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: So 25.08.02 10:52 
M. Raab hat folgendes geschrieben:
Ich habe es aber so gemacht, wie Sven das beschrieben hat.

Nein hast Du nicht! Lies Dir noch mal das Posting von Sven durch.


M. Raab hat folgendes geschrieben:
Und in meiner Subroutine FORM_ANLEGEN in der Routine PROFILE_SCREEN käme eine Zeile hinzu:

Code:
ausblenden Quelltext
1:
2:
3:
4:
weiter.width:=100; 
weiter.caption:='Profil vorwärts'; 
weiter.visible:=true; 
weiter.onclick:=weiterclick(Sender:TObject);

Nein. Die Zuweiseung des OnClick-Events erfolgt genauso wie jede andere Objektzuweisung auch:
ausblenden Quelltext
1:
weiter.onclick:=weiterclick;					


M. Raab hat folgendes geschrieben:
Wenn ich meine zur Laufzeit erzeugten Forms (also PROFILE) schließe, möchte ich auf das Ereignis onclosequery reagieren. Wie kann man dann das machen ?

Genau so wie bei "weiterclick"!

M. Raab hat folgendes geschrieben:
Und die Definition von aus(Sender:TProfil) wieder so wie weiterclick(..) ?

wie gesagt: ließ Dir noch mal das Posting von Sven durch dann weißt Du auch wie Du das mit "aus" machen musst :-D

Gruß
TINO
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: So 25.08.02 12:27 
:oops: :oops: :? :?

Hallo NG,


vielen Dank - es funzt !!!!!

Ich glaub, ich hätte da noch 10x drüber gelesen..... :evil:

Ansonsten --- D A N K E !!!


Gruß


Markus