Auf eine neue Form zugreifen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Auf eine neue Form zugreifen

Beitrag von DAduNgZ »

Hallo erstmal,

ich weiß, dass es zu diesem Thema bereits sehr viele Fragen gibt, aber nichtmal nach 2 Stunden Suche im Internet und ausprobieren, funktioniert es bei mir nicht.

Also: Ich habe eine Form1: Ich möchte, dass wenn ich hier auf den Button BtMenue Klicke eine zweite Form (Form2) geöffnet wird.
Ich habe Unit2 in die Uses Klause eingetragen!
Das ist die Prozedur, wenn ich den Button anklicke.

Code: Alles auswählen

 procedure TForm1.BtMenueClick(Sender: TObject);
 begin
  Hide;
  Form2:=TForm2.create(Self);
  Form2.Show;
 end; 
Soweit ich weiß soll nun Folgendes passieren:
Form1 wird unsichtbar.
Form2 wird erzeugt und dann sichtbar.

Aber, wenn ich das Programm kopiliere und dann den Button klicke, passiert einfach nix.

Vielen Dank im Voraus für Hilfe.
DAduNgZ

PS: Bitte keinen zu komplizierten Quelltext. Ich arbeite noch nicht sehr lange mit Lazarus und möchte gerne auch verstehen, was ich da mache.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
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: Auf eine neue Form zugreifen

Beitrag von m.fuchs »

Es passiert gar nichts? Ist denn deine TForm1.BtMenueClick überhaupt mit dem OnClick-Ereignis des Buttons verknüpft? (Button in Lazarus auswählen -> Ereignisse im Objektinspektor anklicken -> nachschauen ob etwas bei OnClick steht).

BTW: Auf

Code: Alles auswählen

Form2:=TForm2.create(Self);
kannst du vermutlich verzichten.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Auf eine neue Form zugreifen

Beitrag von Michl »

Falls das immer noch nicht funktioniert, hatte ich hier mal ein kleines Bsp. gepostet...

Code: Alles auswählen

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

DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Re: Auf eine neue Form zugreifen

Beitrag von DAduNgZ »

Ok, erstmal danke für die schnelle antwort.

Ja daran könnte es liegen. Ich probiere es mal aus.
Wäre ich nicht drauf gekommen :D

DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Re: Auf eine neue Form zugreifen

Beitrag von DAduNgZ »

Erstmal danke :) Problem gelöst.
Aber neues Problem entstanden :/

Ich wollte jetzt mit einem Button das ganze in die andere Richtung machen:

Code: Alles auswählen

procedure TForm2.Button1Click(Sender: TObject);
begin
  Close;
  Form1.show;
end;   
Dabei ist aber folgender Error entstanden.
Identifier not found "Form1"

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Auf eine neue Form zugreifen

Beitrag von creed steiger »

Deine 2te Unit/Form kennt die unit1/Form1 halt nicht.
Unter uses wird sowas eingetragen.
Bevor dann noch die Frage mit Circular unit reference kommt:
http://forum.lazarus.freepascal.org/ind ... pic=4015.0

iTn_Revolution
Beiträge: 3
Registriert: Mi 4. Sep 2013, 21:01
OS, Lazarus, FPC: Windows, Linux[Ubuntu 12.04]
CPU-Target: 64Bit
Wohnort: Hamburg
Kontaktdaten:

Re: Auf eine neue Form zugreifen

Beitrag von iTn_Revolution »

Du musst diese Verbinden, das geht, indem du unter Implementation etwas einfügst (Du fügst nur das Uses unit1; ein, den rest müsstest du schon haben)

Code: Alles auswählen

Implementation
 
Uses unit1;
 
{ TForm2 }
Und in der Anderen Unit dann einfach:

Code: Alles auswählen

Implementation
 
Uses unit2;
 
{ TForm1 }
Dann müsste es dann auch wieder gehen, mit dem:

Code: Alles auswählen

Form2.Close;
Form1.show;
LG
Passi

TemporeMovie
Gründer
temporemovie@gmail.com
http://temporemovie.tk

DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Re: Auf eine neue Form zugreifen

Beitrag von DAduNgZ »

Danke, das war der Fehler :)

DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Re: Auf eine neue Form zugreifen

Beitrag von DAduNgZ »

Und schon ist das nächste Problem entstanden -.-
Tut mir Leid, wenn ich zu dumme Fehler mache.

Ich habe inzwischen Form2 zur Mainform gemacht und alles funktionierte wie gehabt.
Dann habe ich eine dritte Form erzeugt, auf die ich auch von Form2 as zugreifen will.

Code: Alles auswählen

procedure TForm2.BtZufallClick(Sender: TObject);
begin
  Hide;
  Form3.show;
end;          
Ich habe auch Unit3 in die Uses eingefügt.
In Unit3 habe ich auch unter Implementation

Code: Alles auswählen

Uses Unit2;
stehen.

Aber wenn ich auf den Butto klicke, der mich in Form3 bringen soll, bekomme ich eine Fehlermeldung:

Projekt projekt1 hat Exeption-Klasse External SIGSEGV ausgelöst.

Dann verweist mich Lazarus in customform.inc in folgenden Abschnitt:

Code: Alles auswählen

procedure TCustomForm.Show;
begin
  Visible := True;
  BringToFront;
end;        
Dabei ist

Code: Alles auswählen

Visible:=True;
makiert.

Aber Visible von Form3 ist auf false am Anfang.

Das was ich bisher gefunden habe, war, dass die Form nicht createt sei. Aber ich habe sie über Datei/Neues Formular erzeugt.

Vielen Dank für die Hilfe im Vorraus.

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

Re: Auf eine neue Form zugreifen

Beitrag von Michl »

Das was ich bisher gefunden habe, war, dass die Form nicht createt sei. Aber ich habe sie über Datei/Neues Formular erzeugt.
So sollte es sein, den Fehler bekomme ich nachgestellt, wenn die Form zuvor nicht created wurde. Schau mal in Deiner Project.lpr nach, ob die Form dort erstellt wurde?! Falls nicht, dann kannst Du den entsprechenden Code noch einfügen oder die Form selber zur Laufzeit erstellen. Die *.lpr müsste in etwa so aussehen:

Code: Alles auswählen

program Project1;
... 
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);  //Wahrscheinlich fehlt diese Zeile!
  Application.Run;
end.

Code: Alles auswählen

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

DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Re: Auf eine neue Form zugreifen

Beitrag von DAduNgZ »

program project1;

Ne, hier ist dieser Teil vorhanden :/
Hatte ich auch extra nachgeschaut.
Was mich wundert ist, dass die Zeile mit Visible makiert wurde.

Code: Alles auswählen

{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1, Unit2, unit3
  { you can add units after this };
 
{$R *.res}
 
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm3, Form3);
  Application.Run;
end.                       
Edit: zu unfähig den ganzen Code als Code zu markieren :D

DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Re: Auf eine neue Form zugreifen

Beitrag von DAduNgZ »

Ich glaube die einfachste Lösung (so hab ich es jetzt gemacht) ist, wenn in dem Formular noch nicht allzu viel drin ist einfach das Formular zu löschen und ein neues zu erzeugen, in das dann alles übertragen wird. (Von Hand :/)

Antworten