Variable aus Unit1 für Unit15 übernehmen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
McReier
Beiträge: 48
Registriert: Sa 17. Aug 2013, 11:35

Variable aus Unit1 für Unit15 übernehmen

Beitrag von McReier »

Hallo zusammen,
komme grad' gar nicht weiter. Ich will in einen neuen Form (Unit15) eine Variable von Unit1 anzeigen lassen. Hört sich einfach an, ich bekomms aber nicht hin.....
Hier mein Quellcode der Unit15:

Code: Alles auswählen

unit Unit15;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm15 }
 
  TForm15 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
  private
    { private declarations }
  public
    { public declarations }
 
var
  Form15: TForm15;
  end;
 
implementation
 
{$R *.lfm}
 
uses Unit1;
 
begin
  Label1.caption:=form1.AUG;
end. 
Die Fehlermeldungen lauten:
unit15.pas(39,9) Error: Identifier not found "Label1"
unit15.pas(39,25) Error: identifier idents no member "AUG"
unit15.pas(42) Fatal: There were 2 errors compiling module, stopping

Warum kennt er meinen Label1 nicht? Auch mit der Variable "AUG" kann er nix anfangen. In der Unit1 hab' ich "uses Unit15" drinnen.
Ich danke EUCH!!!

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von hde »

McReier hat geschrieben:begin
Label1.caption:=form1.AUG;
end.
woher soll der Compiler wissen dass du Label1 aus der Unit1 meinst?

hde

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

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von theo »

Normalerweise schwirrt so ein TLabel auch nicht in einer Unit herum, sondern hat ein Formular als Parent.
Das muss man mit angeben.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von m.fuchs »

Du hast da einige Probleme. Erstens sagst du dem Compiler nicht wo er nach Form1 suchen soll.
Dann schreibst du Quellcode an seltsame Stellen in dein Unit15, da gehört der ganz sicher nicht hin.
Dann kommt noch der restliche kaputte Quelltext...

Im Zusammenhang mit deinen anderen Fragen empfehle ich dir dringend etwas Grundlagenliteratur zu studieren. Das kann dir im Forum hier keiner abnehmen und jeden Fehler einzeln erklären ist auch doof.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von Michl »

@McReier: Ich kann mich noch daran erinnern, dass der Umgang mit einer zweiten Form in einem Projekt, für mich damals ein kleiner Meilenstein war. Darum wollt ich dir ein Tutorial empfehlen, zum Umgang mit einer zweiten Form. Nach 15Minuten Recherche im Netz habe ich für dein Problem nicht wirklich was Brauchbares gefunden. Daher versuche ich dir ein kleines Beispiel zu geben, was du dann für dein aktuelles Projekt entsprechend umnutzen kannst (generell stimme ich mit M.Fuchs jedoch überein):

- Neues Projekt erstellen -> Anwendung
- jetzt unter Datei -> neues Formular ein zweites Formular erstellen
- nun hast du zwei Formulare (Form1, Form2) in der jeweiligen Unit1 bzw. Unit2
- da Form1 die HauptForm darstellen soll, mit der dann die Form2 angezeigt werden soll, muss noch bei Unit1 in die Uses-clause die Unit2 eingefügt werden z.B:

Code: Alles auswählen

unit Unit1;
...
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Unit2;
- jetzt fügst du noch einen Button auf die Form1 ein (in der Komponentenpalette den TButton auswählen und durch ein Klick zur Form1 zufügen)
- nun erstellst du eine Procedure zum Ereignis eines Button-Klicks, indem du einfach auf den neu erstellen Button doppelklickst
- es wird die Procedure TForm1.Button1Click(Sender: TObject) im Quellcode der Unit1 erstellt
- der Buttonklick soll die Form2 öffnen, daher musst du einfach noch den Code dazu schreiben "Form2.Showmodal"
- der Code in Unit1 sollte jetzt so aussehen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Showmodal;
end;
- Jetzt hast du ein Projekt mit 2 Formen (in einer jeweils separaten Unit), welches jetzt gestartet werden kann

Nun willst du noch Variablen in beiden Units nutzen. Man könnte globale Variablen in der Unit2 deklarieren. Damit hättest du Zugriff in der Unit1 und Unit2 auf ein und die selbe Variable (da in der Unit1 unter uses die Unit2 mit einbunden wurde). Dies ist aber kein guter Programmierstil, da man schnell bei größeren Projekten nicht mehr weiss, was die einzelnen Variablen für eine Bedeutung haben bzw. wo man überall darauf zugreift (Fehlerquote erhöht sich).
Besser ist es lokale Variablen zu nutzen, diese als Property in einer Klasse oder hilfsweise als Variable in einer Klasse zu definieren.

Als Beispiel könnte man eine Telefonnummervervollständigung (Telefonnummer in der Hauptform, Vorwahl in der Form2 einzugeben) machen:
- müsstest auf die Form1 noch ein TEdit und ein TLabel platzieren
- auf die Form2 ein TEdit und ein TButton
- im Objektinspektor die Eigenschaft "Caption" vom TButton ändern auf "Fertig"
- im Quellcode von Unit2 fügst du noch eine Variable in die Klasse TForm2 unter "public", mit dem Namen "Telefonnummer" von Typ String, ein:

Code: Alles auswählen

  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
  private
    { private declarations }
  public
    { public declarations }
    Telefonnummer: String;  //hier könnten auch noch andere Variablen, Properties, 
                            //Methoden (Funktionen/Proceduren) etc. eingefügt werden
  end;   
Jetzt erstellst du wieder die Procedure für das Ereignis TForm2.Buttonklick und schreibst dort noch die Zuweisung für die Vervollständigung der Telefonnummer und Schließen der Form:

Code: Alles auswählen

procedure TForm2.Button1Click(Sender: TObject);
begin
  Telefonnummer:=Edit1.Text+' / '+Telefonnummer;
  Close;
 
// Hier könnte auch folgendes stehen (da Button1Click eine Procedure von 
// TForm2 ist, sind jedoch auch Zugriffe auf alle Bestandteile der Klasse ohne 
// Klassenbezeichner möglich):
  Form2.Telefonnummer:=Form2.Edit1.Text+' / '+Form2.Telefonnummer;  
  Form2.Close;
 
// Der Zugriff auf "Form2" sollte vermieden werden, da so immer nur auf
// Form2 und nicht auf eine beliebige Instanz dieser Klasse zugegriffen wird! 
// Besser wäre da (so sind mehrere Instanzen der Klasse möglich):
  Self.Telefonnummer:=Self.Edit1.Text+' / '+Self.Telefonnummer; 
  Self.Close;
end; 
- nun schreibst du noch folgenden Code in Form1.Button1klick:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Telefonnummer:=Edit1.Text;
  Form2.Showmodal;
  Label1.Caption:=Form2.Telefonnummer;
 
//hier könnte wieder Form1. oder besser Self. stehen:
 
//  Form2.Telefonnummer:=Self.Edit1.Text;
//  Form2.Showmodal;
//  Self.Label1.Caption:=Form2.Telefonnummer;
end;
Jetzt kannst du das Projekt starten und einmal als Telefonnummer "123456" in Edit1 der Form1 eingeben, Button klicken. Jetzt als Vorwahl "0987" in Edit1 der Form2 eingeben und Button klicken. Im Label1 der Form1 sollte die Telefonnummer mit Vorwahl "0987 / 123456" stehen.

Ich hoffe, das hilft dir! Viel Erfolg :)

Alle Anderen sind herzlich dazu eingeladen, Alternativen und Ergänzungen zu posten und somit dieses Forum etwas schlauer zu machen! Lazarus mit Freepascal eignet sich sehr für Einsteiger, dieses sollte beachtet und entsprechend Rücksicht (auch für nachfolgende Leser) genommen werden!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

McReier
Beiträge: 48
Registriert: Sa 17. Aug 2013, 11:35

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von McReier »

Hi Michl,
habe gestern dann eine Pause eingelegt, die sicherlich sinnvoll war und bin deshalb erst soeben zum testen Deines Beispiels gekommen.
Funktioniert einwandfrei!! Ich werde das Beispiel nun für meinen Fall "umbauen". Super Sache, vielen Dank für Deine Bemühungen!! :D :D
Für Anfänger ist solch ein Beispiel Gold wert und ich bin ja im Bereich der Einsteigerfragen...

An dieser Stelle noch eine Frage:
Ich habe mir folgendes Buch beschafft: http://www.amazon.de/Lazarus-Klassenbib ... 3936546630
Das hilft mir aber nicht wirklich weiter, dort wird zwar die Bedienung der Oberfläche von Lazarus erklärt aber mir fehlen ja die Programmiergrundlagen.
Welches Buch ist empfehlenswert?

Vielen Dank!

wp_xyz
Beiträge: 5129
Registriert: Fr 8. Apr 2011, 09:01

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von wp_xyz »

hast du dir schon mal die "offiziellen" Lazarus-Tutorials angesehen? http://wiki.lazarus.freepascal.org/Cate ... torials/de (auch ohne /de), oder http://wiki.freepascal.org/Lazarus_Documentation/de

Die folgenden beispielsweise erscheinen mir für Anfänger geeignet:
http://wiki.lazarus.freepascal.org/Lazarus_Tutorial/de
http://wiki.lazarus.freepascal.org/Obje ... l_Tutorial

und es gibt auch eine Reihe Videos, z.B. http://www.youtube.com/watch?v=fo9nXbziIEI und die dort verlinkten.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von m.fuchs »

Wenn es die Grundlagen der Pascal-Programmierung sind die fehlen, ist das auch ein recht gutes Buch: http://www.marcocantu.com/epascal/German/default.htm

Und auch noch gratis und auf Deutsch.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von idefix »

Hallo!

@Michl

Danke auch von mir!

Gruß!
idefix

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von Aliobaba »

... tolles Step-by-Step-Beispiel! Mit viel Verständnis auch für die Leute, die noch nicht so "fit" mit Lazarus sind.
Danke!!
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Variable aus Unit1 für Unit15 übernehmen

Beitrag von Michl »

Freut mich, wenn ich helfen konnte. Und danke für das Feedback!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten