Prozedur ohne Direktverknüpfung zu TForm

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Prozedur ohne Direktverknüpfung zu TForm

Beitrag von Theozh »

Hallo,
das ist sicher eine Anfängerfrage doch ich finde kein passendes Beispiel und kein geeignetes Tutorial. Ich weiß auch gar nicht, wonach ich suchen müsste...

Hier die vereinfachte Aufgabenstellung:
- Drei Schieberegler. Die Summe der Regler-Positionen soll addiert werden.
Wenn einer davon verändert wird, soll die Summe neu berechnet werden.

Ich dachte, ich könnte z.B. eine "procedure Summiere" schreiben, die jeweils in den Prozeduren TForm1.Trackbar1.Change, TForm1.Trackbar2.Change, TForm1.Trackbar3.Change aufgerufen wird. Es wäre ja unsinnig den Summen-Programmcode in jeder TrackBarChange-Prozedur zu duplizieren.

Was ist im unteren Code falsch? Wie und wo platziere ich die "procedure Summiere"? Diese Prozedur ist ja nicht direkt mit einem Objekt oder einem Event auf TForm1 verknüpft.
In welchem Tutorial unter welchem Thema werde ich fündig... oder hier vielleicht?

Code: Alles auswählen

unit Summe_unit;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Label1: TLabel;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    TrackBar3: TTrackBar;
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
    procedure TrackBar3Change(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1;
  Summe: integer;
 
implementation
 
procedure Summiere;
begin
  Summe := TrackBar1.Position + TrackBar2.Position + TrackBar3.Position;
  Label1.Caption := IntToStr(Summe);
end;
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Summiere;
end;
 
procedure TForm1.TrackBar2Change(Sender: TObject);
begin
  Summiere;
end;
 
procedure TForm1.TrackBar3Change(Sender: TObject);
begin
  Summiere;
end;
 
end.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Prozedur ohne Direktverknüpfung zu TForm

Beitrag von theo »

Entweder die Prozedur wird eine Methode von TForm1 (also in Private deklarieren und dann procedure TForm1.Summiere schreiben) oder
du gibst in der Prozedur jeweils an, wessen Trackbar du meinst.

Also Form1.Trackbar1...

Prozedur Summiere weiss sonst nicht, welchen Trackbar du meinst, da sie ja nicht zu TForm1 gehört.

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Prozedur ohne Direktverknüpfung zu TForm

Beitrag von Theozh »

...alles klar! Danke, funktioniert!

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Prozedur ohne Direktverknüpfung zu TForm

Beitrag von MAC »

Schlau gedacht, aber es geht noch einfacher. Momentan ruft Trackbar1 ja Trackbar1Change, Trackbar2 ruft Trackbar2Change ,.. auf. Du kannst im Objektinspektor aber einstellen das alle 3 Trackbars die funktion "Trackbar1Change" aufrufen und schon hast du noch nen stück gespart...

Code: Alles auswählen

Signatur := nil;

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Prozedur ohne Direktverknüpfung zu TForm

Beitrag von Theozh »

Aha, Danke, man lernt nie aus. Das setzt aber voraus, dass bei TrackBar 1,2,3 nicht jeweils noch spezifische Änderungen gemacht werden sollen. Aber für das obere Beispiel ist es so kürzer.
Warum kann ich aber im Objektinspektor nicht direkt einstellen, dass "Summiere" ausgeführt werden soll?
Wie muss ich "TForm1.Summiere" anlegen, dass es dort in der Auswahl erscheint?

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Prozedur ohne Direktverknüpfung zu TForm

Beitrag von MmVisual »

Bei einer Objektorientierten Programmierumgebung muss das Objekt auch in dem Objekt drin sein damit man es in dem Objektinspektor von dem einen Objekt auswählen kann.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Prozedur ohne Direktverknüpfung zu TForm

Beitrag von theo »

Theozh hat geschrieben:Wie muss ich "TForm1.Summiere" anlegen, dass es dort in der Auswahl erscheint?
Rate mal? Einfach so wie der entsprechende Eventhandler

Code: Alles auswählen

procedure TForm1.Summiere(Sender: TObject);

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Prozedur ohne Direktverknüpfung zu TForm

Beitrag von Euklid »

zudem sollte, wie Theo weiter oben beschrieben "procedure Summiere(Sender: TObject);" unter "private" gesetzt werden. An dieser Stelle eben ohne das TForm1 davor.

Antworten