Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - variable über 2 funktionen?


Besth - Di 01.12.09 00:22
Titel: variable über 2 funktionen?
hey ich brauch mal hilfe - bin relativ neu in delphi :)

ich will auf nen button klicken un dann soll ne funktion aufgerufen werden ...
aber er meckert in meinem 2. beispiel

Quelltext
1:
[Error] Unit1.pas(80): Undeclared identifier: 'txt_card2'                    

irgendwie muss ich also von der 1. funktion zur 2. diesen identifier übergeben - aber wie? und ich will das nicht über parameter machn weil das is ja das label - muss doch auch so gehn ...

warum geht das

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:
unit Unit1;

interface

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

type
  Tmain = class(TForm)
    txt_card2: TLabel;
    procedure btn_card2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  main: Tmain;
  cardsout_2: integer = 0;

implementation

{$R *.dfm}

procedure Tmain.btn_card2Click(Sender: TObject);
begin
  cardsout_2 := cardsout_2 + 1;
  txt_card2.caption := IntToStr(cardsout_2);
end;

end.

aber das nicht:

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:
unit Unit1;

interface

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

type
  Tmain = class(TForm)
    txt_card2: TLabel;
    procedure btn_card2Click(Sender: TObject);
    procedure aktualisieren;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  main: Tmain;
  cardsout_2: integer = 0;

implementation

{$R *.dfm}

procedure aktualisieren;
begin
  txt_card2.caption := IntToStr(cardsout_2);
end;

procedure Tmain.btn_card2Click(Sender: TObject);
begin
  cardsout_2 := cardsout_2 + 1;
  aktualisieren;
end;

end.


Narses - Di 01.12.09 00:31

Moin und :welcome: im Forum!

user profile iconBesth hat folgendes geschrieben Zum zitierten Posting springen:
warum geht das
Weil die Funktion hier eine Methode der Formularklasse ist. ;)

user profile iconBesth hat folgendes geschrieben Zum zitierten Posting springen:
aber das nicht
Diese Funktion kennt die Elemente deiner Formularklasse nicht, deshalb kannst du das z.B. so machen:

Delphi-Quelltext
1:
2:
3:
4:
procedure aktualisieren;
begin
  main.txt_card2.caption := IntToStr(cardsout_2);
end;

Hier würde sich aber eher anbieten, aus deinem Punktezähler eine Eigenschaft der Formularklasse zu machen und im Setter den Wert in der GUI zu aktualisieren. :idea:

cu
Narses


Delete - Di 01.12.09 00:31

Deine Prozedur aktualisieren ist keine Methode deiner Form-Klasse. Deswegen ist das Label in der Prozedur unbekannt.


Besth - Di 01.12.09 00:39

danke für die schnelle antwort :)
also das kleine wörtchen
main.
hat mir sozusagen gefehlt :)

nur zum verständnis noch:
wie mach ich denn aus meiner aktualisieren prozedur eine methode meiner form-klasse?
bzw wie mach ich eine neue eigenschaft in meiner formularklasse ^^


Narses - Di 01.12.09 00:50

Moin!

user profile iconBesth hat folgendes geschrieben Zum zitierten Posting springen:
wie mach ich denn aus meiner aktualisieren prozedur eine methode meiner form-klasse?

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:
type
  Tmain = class(TForm)
    txt_card2: TLabel;
    procedure btn_card2Click(Sender: TObject);
    procedure aktualisieren;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  main: Tmain;
  cardsout_2: integer = 0;

implementation

{$R *.dfm}

procedure Tmain.aktualisieren;
begin
  txt_card2.caption := IntToStr(cardsout_2);
end;


user profile iconBesth hat folgendes geschrieben Zum zitierten Posting springen:
bzw wie mach ich eine neue eigenschaft in meiner formularklasse ^^
Das darfst du gerne mal in der DOH nachschlagen oder hier im Forum danach suchen. :idea: ;)

cu
Narses


Delete - Di 01.12.09 01:54

Oder besser noch ein Tutorial über Klassen lesen.


Zorro - Fr 04.12.09 11:26

Und meiner Ansicht nach ist der Weg, aus der Proc "aktualisieren" eine Methode zu machen (a), weitaus besser, als das Voransetzen von "main", um eine Methode aus einer "freigliegenden" Proc aufzurufen(b). Spätestens wenn du Variante b oft verwendest und dann mal deine Form von "main" in etwas anderes umbenennst, weißt du warum...

Gruß Zorro


jaenicke - Fr 04.12.09 11:46

user profile iconZorro hat folgendes geschrieben Zum zitierten Posting springen:
Spätestens wenn du Variante b oft verwendest und dann mal deine Form von "main" in etwas anderes umbenennst, weißt du warum...
Das ist ja nicht schlimm, das Refactoring von Delphi passt das doch eh automatisch beim Umbenennen an (*), insofern ist das an der Stelle doch vollkommen egal. :gruebel:

Schlimm wird es, wenn man mehrere Instanzen des Formulars verwendet und sich über die seltsamen Effekte wundert, weil mit main natürlich nur die eine Instanz in der globalen Variable angesprochen wird. :idea:

(*) Ja, ich weiß: erst ab Delphi 2005 Professional / Turbo Delphi