procedure 'deinnamehierfür'

Für Fragen von Einsteigern und Programmieranfängern...
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

procedure 'deinnamehierfür'

Beitrag von MAC »

soweit ich weis kann man so eine procedure erstellen

Code: Alles auswählen

procedure Menuwahl;
begin
if 1 + 1 = 'hallo' then Label1.Caption := 'irgendwas stimmt nicht' ;
end;


da meldet mit Lazarus keinen Fehlern. Aber wie binde ich sowas richtig ein ?

denn folgendes geht nicht

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
Menuwahl;
end;


Weil das nicht geklappt hat hab ich bisjetzt bei alles 10 auslößern einen 50 Zeilen text geschrieben(Strg+C Strg+V), aber das ist ja schrott...

So steht es zumindest in einem Delphi text, aber Delphi ist ja 'total' was anderes...
Was mache ich falsch ? Danke

Code: Alles auswählen

Signatur := nil;

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: procedure 'deinnamehierfür'

Beitrag von Euklid »

Hallo Mac,

ich habe die Überschrift zu deinem Beitrag und den Beitrag selbst nicht ganz in Verbindung bringen können. Was genau möchtest du erreichen?

Viele Grüße, Euklid

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: procedure 'deinnamehierfür'

Beitrag von monta »

Was geht nicht?

Du musst die Procedure natürlich im Interface auch bekannt geben.

Also entweder global, wie du oben schon angefangen hast, so:

Code: Alles auswählen

type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
  procedure Menuwahl;
 
var
  Form1: TForm1;
 
implementation
 
procedure Menuwahl;
begin
//  if 1 + 1 = 'hallo' then Label1.Caption := 'irgendwas stimmt nicht' ;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Menuwahl;
end;


Oder etwas schöner als Teil von TForm dann so:

Code: Alles auswählen

type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure Menuwahl;
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Menuwahl;
begin
//  if 1 + 1 = 'hallo' then Label1.Caption := 'irgendwas stimmt nicht' ;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Menuwahl;
end;


Nebenbei, was ist das eigentlich fürn if? ;)
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6214
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: procedure 'deinnamehierfür'

Beitrag von af0815 »

MAC hat geschrieben:So steht es zumindest in einem Delphi text, aber Delphi ist ja 'total' was anderes...
Was mache ich falsch ? Danke

Abseits der Lösung von monta :-)

Die Problembeschreibung ist nicht vollständig. Was für eine Fehlermeldung spuckt der Lazarus aus. Ich versuche aus Deinen Fragmenten etwas nach zu vollziehen.

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
procedure Menuwahl;
begin
  if 1 + 1 = 'hallo' then Label1.Caption := 'irgendwas stimmt nicht' ;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Menuwahl;
end;
 
initialization
  {$I unit1.lrs}
 
end.

Compilieren -> Ergebnis

Code: Alles auswählen

unit1.pas(31,8) Error: Incompatible types: got "ShortInt" expected "ShortString"
unit1.pas(31,33) Error: Identifier not found "Label1"
unit1.pas(46) Fatal: There were 2 errors compiling module, stopping

Damit sagt dir der Kompiler, das du Typen verwendest die nicht zusammenpassen und das er das Label nicht finden kann, weil deine Prozedure nicht im Bereich des Objektes liegt.

Konklusion: Definiere Dein Problem mit mehr Info und versuche die Fehlermeldung zu lesen, zu verstehen und abzuarbeiten.
Eine mögliche (aber nicht sinnvolle) Lösung:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
procedure Menuwahl;
begin
  if '1' + '1' = 'hallo' then Form1.Label1.Caption := 'irgendwas stimmt nicht' ;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Menuwahl;
end;
 
initialization
  {$I unit1.lrs}
 
end.

Gibt die folgen Meldung aus

Code: Alles auswählen

unit1.pas(32,31) Warning: unreachable code
Projekt "project1" erfolgreich gebaut. :)

Das heisst, der Code läuft, die Meldung wird aber nie kommen, da die if-Bedingung nie erfüllt werden kann. Mit eine doppelclick auf die Meldung zeigt er soger genau die Zeile an.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: procedure 'deinnamehierfür'

Beitrag von MAC »

Das mit der Meldung stimmt, was ja auch nur nen Beispiel.
Danke, ich habs bis jetzt erstmal so gemacht das die prozedur ganz oben , als aller erstes(im vergleich zu den prozeduren die sie nutzen) steht.

Ich werde es jetzt trotzdem ins intervace schreiben, weil wenn ich es unter Tform1 geschrieben habe hats nicht geklappt, danke

Problem gelöst.

Code: Alles auswählen

Signatur := nil;

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: procedure 'deinnamehierfür'

Beitrag von pluto »

weil wenn ich es unter Tform1 geschrieben habe hats nicht geklappt,

Was genau hast du gemacht ? du musst natürlich bestimmte regeln dabei beachten. Zeigt doch mal ein Beispiel-Soruce-Code wie du es gemacht hast. Weil sowas innerhalb von TForm zu schreiben ist eigentlich allgemein so. Gerade wenn auf Komponenten der Klasse TForm zugegrieffen wird, wie in deinem Beispiel.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6214
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: procedure 'deinnamehierfür'

Beitrag von af0815 »

pluto hat geschrieben:Was genau hast du gemacht ? du musst natürlich bestimmte regeln dabei beachten. Zeigt doch mal ein Beispiel-Soruce-Code wie du es gemacht hast.
Schon den Post von mir angeschaut ?! Ich nehme an, das ich dort geklärt habe, was passiert ist - mit Code.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: procedure 'deinnamehierfür'

Beitrag von pluto »

Ich werde es jetzt trotzdem ins intervace schreiben, weil wenn ich es unter Tform1 geschrieben habe hats nicht geklappt, danke

Ich habe mich hier drauf bezogen und nicht auf dein Soruce-Code
MFG
Michael Springwald

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: procedure 'deinnamehierfür'

Beitrag von MAC »

ich habe es wie dein "möglichen aber nicht sinvollen code gemacht" ,af0815.
Zuerst hab ich es so geschrieben , das hat aber nicht geklappt:

Code: Alles auswählen

var
  a,b : integer;
 
implementation
 
{ TForm1 }
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Menuwahl;
end;
 
procedure Menuwahl;
begin
  if b = 1 then Form1.Label1.Caption := 'wenn b null ist kann man nicht teilen.' ;
end


Auch nach einigen Versuchen Menuewah da anzukündigen wo alle anderen proceduren angekündigt werden klappte nicht:

Code: Alles auswählen

type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
procedure menuewahl ;
  private
    { private declarations }
  public
    { public declarations }
  end;


Dann habe ich es sorum geschrieben. Solange Menuwahl über der funktion steht die menuewahl benutzt hat es geklappt.

Code: Alles auswählen

var
  a,b : integer;
 
implementation
 
{ TForm1 }
 
procedure Menuwahl;
begin
  if b = 1 then Form1.Label1.Caption := 'wenn b null ist kann man nicht teilen.' ;
end
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Menuwahl;
end;




ABER jetzt klappt es: weil ich es so geschrieben habe :

Code: Alles auswählen

type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
  procedure menuewahl ;
 
var
  Form1: TForm1;
  a,b : integer;
 
implementation
 
{ TForm1 }
 
procedure Menuwahl;
begin
  if b = 1 then Form1.Label1.Caption := 'wenn b null ist kann man nicht teilen.' ;
end
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Menuwahl;
end;



Was jetzt mein Problem ist, ich weis nicht wie ich ein einer TStatusBar z.b. Item1 was den Text 'Knopf nicht gedrückt' in 'Knopf gedrückt' änderen kann...

Code: Alles auswählen

Signatur := nil;

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: procedure 'deinnamehierfür'

Beitrag von pluto »

Code: Alles auswählen

type
 
      { TForm1 }
 
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
    procedure menuewahl ;
      private
        { private declarations }
      public
        { public declarations }
      end;
 
 
    var
      a,b : integer;
 
    implementation
 
    { TForm1 }
 
    procedure TForm1.Menuwahl; // GANZ WICHTIG bei Methoden immer die Klasse angeben.
    begin
     // Hier kann Form1 auch weggelassen werden
      if b = 1 then Form1.Label1.Caption := 'wenn b null ist kann man nicht teilen.' ;
    end

Versuch den mal. Dein Fehler war du hast Vergessen TForm1 vor deiner Funktion zu schreiben. Aber bei einer Methode ist es wichtig.

EDIT01:
Eigene Methode sollten immer im RICHTIGEN Sichtbarkeits Feld der Klasse sein. In deinen Fall währe das im Private Teil.
MFG
Michael Springwald

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: procedure 'deinnamehierfür'

Beitrag von shokwave »

Was jetzt mein Problem ist, ich weis nicht wie ich ein einer TStatusBar z.b. Item1 was den Text 'Knopf nicht gedrückt' in 'Knopf gedrückt' änderen kann...

Probiers doch mal so.

Code: Alles auswählen

Statusbar1.Panels.Items[1].Text:='Test';
mfg Ingo

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: procedure 'deinnamehierfür'

Beitrag von pluto »

Oder:

Code: Alles auswählen

Statusbar1.SimpelText:='hallo';
Statusbar1.ShowPanel:=True;

ich würde vorschlagen du liest dir mal das hier aufmerksam durch:
http://www.delphi-treff.de/sprachen/object-pascal/
Das ist zwar für Delphi geschrieben, aber die meisten sachen die dort erklärt und beschrieben werden treffen auch auf Lazarus zu. Hast du schon mal mit OOP gearbeitet ?
MFG
Michael Springwald

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: procedure 'deinnamehierfür'

Beitrag von MAC »

stimmt , das mit den Form1 hab ich (nur hier) vergessen zu schreiben...

thx

Das hab ich mir mal so Teilweise durchgelesen, werd aber nochmal tun...
OOP ? nö , absolut keine Ahnung wie man irgendwas mit Opp macht... ich bin so ziemlich neu hba nen bisschen FMSLOGO rumgefummelt, aber das ist auch nur so nen einstiegsprogramm...

Code: Alles auswählen

Signatur := nil;

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: procedure 'deinnamehierfür'

Beitrag von pluto »

Wenn du Lazarus verwenden möchtest, wirst du nur an OOP "dingen" stoßen. z.b. Große teile der LCL sind mit OOP geschrieben. Ohne die OOP Währe Lazarus in dieser Form gar nicht möglich..... TForm1 ist hier die Klasse.....
MFG
Michael Springwald

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: procedure 'deinnamehierfür'

Beitrag von MAC »

aha, also ich konnte mir das denken, als ich dann gemerkt habe das es nicht klappt... Liegt wahrscheinlich daran das die procedur nicht direkt als procedur von Form1 erstellt wird...

Code: Alles auswählen

Signatur := nil;

Antworten