Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Probleme beim Zugreifen auf 2. Form (https://www.delphipraxis.net/175525-probleme-beim-zugreifen-auf-2-form.html)

Acuaplano 28. Jun 2013 12:59

Probleme beim Zugreifen auf 2. Form
 
Heyho,

ich arbeite grad' an einem Tool für ein Spiel und brauche dafür 2 Formulare. Hat soweit gut funktioniert, bis ich mich dem 2. Formular gewidmet hab:
Das 2. Formular konnte ich soweit einbinden, sodass es auch angezeigt wird. Genauso ließen sich auch einfache Sachen für das Interface im 2. Formular erstellen (Button wird gedrückt -> Edit-Feld wird angezeigt).
Das eigentliche Problem ist aber, dass sich manche Sachen in der 2. Form einfach nicht aufrufen lassen wollen. Damit meine ich z.b. ein Label, dass ich darauf platziert hab und ich es, was ich auch mache, nicht zur Laufzeit verändern kann.

In der 1. Form funktioniert dabei alles wunderbar. Anderes Beispiel: Ich wollte anfangs die Größe eines Panels zur Laufzeit verändern, was im 2. Formular wieder nicht ging. Oder hier noch'n seltsames Beispiel: Das Deaktivieren von Edit-Feldern funktioniert, wenn ich es durch einen RadioButton INNERhalb des 2. Formulars mache. Wenn ich jetzt aber versuche aus der 1. Unit bzw. Form darauf zuzugreifen passiert nix. Selbst wenn ich ne extra Funktion schreibe, die das selbe tut, aber in der 2. Form steht (TForm2.Test), geht es nicht.
Kann da jemand vielleicht irgendwelche logischen Zusammenhänge erkennen? :D

Sir Rufo 28. Jun 2013 13:07

AW: Probleme beim Zugreifen auf 2. Form
 
Ja, aber zeig doch mal den Code-Teil, wo du die zweite Form zum Leben erweckst

(Erinnert mich ein wenig an "Wenn ich mit dem Finger auf den Arm drücke tut es weh, und auch am Bein, am Kopf, am Fuß, usw. Was ist da los?" A: "Der Finger ist gebrochen!")

Acuaplano 28. Jun 2013 13:19

AW: Probleme beim Zugreifen auf 2. Form
 
Da gibt's nicht viel zu zeigen :D

Delphi-Quellcode:
procedure TForm2.Test2;
begin
  Form1.Label1.Caption := 'Test'; // Funktioniert
end;

...

procedure TDialogBox.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: integer);
begin
  Form2.Label1.Caption := 'Test'; // Funktioniert nicht
end;
Zitat:

Zitat von Sir Rufo (Beitrag 1219934)
(Erinnert mich ein wenig an "Wenn ich mit dem Finger auf den Arm drücke tut es weh, und auch am Bein, am Kopf, am Fuß, usw. Was ist da los?" A: "Der Finger ist gebrochen!")

Ja... Nur ist es glaub ich so, dass ich mit ganz vielen Fingern auf einen Arm drücke :D

p80286 28. Jun 2013 13:28

AW: Probleme beim Zugreifen auf 2. Form
 
Also wenn das wirklich so ist wie Du in Deinem Beispiel beschreibst, dann solltet Du eigentlich ein paar Fehlermeldungen "...unbekannt.." bekommen.

Der Zugriff von Form1 auf Form2 funktioniert nur wenn Form1 auch in den USES aufgenommen wurde.
Gleiches gilt auch umgekehrt.
Nur der Zugriff von Form1 auf Form2 und von Form2 auf Form1 kann wegen zirkulärer Bezüge nicht funktionieren.

Also zeig bitte auch mal die USES Einträge.

Gruß
K-H

P.S.
Was heißt hier überhaupt "funktioniert nicht"?
Der Compiler wirft mit Fehlermeldungen um sich, es erscheint ein BlueScreen, statt des erwarteten Ergebnisses schaltet sich das Radio ein.......

Acuaplano 28. Jun 2013 13:32

AW: Probleme beim Zugreifen auf 2. Form
 
Unit1:

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Unit2,
  ExtCtrls, Menus, StdCtrls, ActnList, Windows, Contnrs;

type                                                    

...

Unit2:
Delphi-Quellcode:
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, Buttons, Windows;

type

  { TForm2 }

  TForm2 = class(TForm)
    ...
  end;

var
  Form2: TForm2;

implementation

uses
  Unit1;
So sollte es doch auch in der Theorie funktionieren, oder nicht?

Edit: "Funktioniert nicht" heißt in diesem Fall einfach nur, dass nix passiert! Ich wär ja froh, wenn da wenigstens ne Fehlermeldung irgendwo auftauchen würde, aber es tut sich ja nichts

Edit2: Und mit den Uses sollte es ja nichts zu tun haben. Ich kann ja das Label, egal aus welcher Unit, nicht verändern

Uwe Raabe 28. Jun 2013 13:51

AW: Probleme beim Zugreifen auf 2. Form
 
So wird das nichts. Zip das ganze Projekt und hänge es hier an.

Acuaplano 28. Jun 2013 13:57

AW: Probleme beim Zugreifen auf 2. Form
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zu Befehl.

Tut mir Leid dafür, dass da nichts kommentiert ist. Wollte das eigentlich zum Ende hin machen, aber ich hoffe das sollte nicht zu Schlimm sein.
Hab da auch teilweise ein paar Zeilen eingefügt zum Testen eingefügt, falls da mal was sinnlos erscheint.

Edit: Es muss zuerst eine neue Dialogbox im Graphen erstellt werden (Neue Dialogbox -> 1 Verzweigung), bevor was im anderen Fenster (2. Form) verändert werden kann.

Uwe Raabe 28. Jun 2013 14:03

AW: Probleme beim Zugreifen auf 2. Form
 
Funktioniert doch.

Form2.Test2 wird in TForm1.DeleteClick ausgeführt. Ich erzeuge also über Neue DialogBox - 1 Verzweigung ein Neues Objekt und wähle dann über das Kontextmenü "Löschen" an. Danach steht im Label1 ein "No". Das alles mit der EXE im Zip.

Acuaplano 28. Jun 2013 14:12

AW: Probleme beim Zugreifen auf 2. Form
 
Ja, es funktioniert mit Label1 auf Form1, aber nicht mit Label1 auf Form2 (dort wo links "brum" steht :D).
Es stehen beide Befehle zum ändern in der gleichen Prozedur und es funktionieren tut nur einer :?

Uwe Raabe 28. Jun 2013 14:48

AW: Probleme beim Zugreifen auf 2. Form
 
Sorry Lazarus habe ich nicht. Die ProcessMessages-Aufrufe kommen mir allerdings recht überflüssig vor.

Acuaplano 28. Jun 2013 15:20

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1219946)
Sorry Lazarus habe ich nicht. Die ProcessMessages-Aufrufe kommen mir allerdings recht überflüssig vor.

Die hab' ich auch nur zum Test reingepackt... ich werd' nachher einfach mal versuchen ein komplett neues Projekt zu erstellen und den Code dann dareinkopieren. Vielleicht ist es ja ein Bug von Lazarus aus.

Acuaplano 28. Jun 2013 16:15

AW: Probleme beim Zugreifen auf 2. Form
 
Ich hab's eben nochmal mit einem neuen Projekt probiert und entweder ist mein Lazarus verbuggt oder ich mache was falsch:
Neues Projekt erstellt - 2 Formulare - Zweites Formular in's erste eingebunden - Button und Labels darauf platziert und gleiches Problem: tut sich nix

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unit2;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Label1.Caption := 'Form2';
  Label1.Caption := 'Form1';

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(self);
  Form2.Show;
end;

end.
Delphi-Quellcode:
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm2 }

  TForm2 = class(TForm)
    Label1: TLabel;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form2: TForm2;

implementation


{$R *.lfm}

end.
Irgendwas muss ich doch falsch gemacht haben :?

p80286 28. Jun 2013 16:41

AW: Probleme beim Zugreifen auf 2. Form
 
Wo ist das Problem:
Delphi-Quellcode:
program Project2;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

(* *************************************** *)
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption:='Labello1';
  form2.label1.Caption:='labello2';
  form2.show;
end;

end.
(* ********************************************************* *)
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Label1: TLabel;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.
funktioniert!
Gruß
K-H

Acuaplano 28. Jun 2013 18:33

AW: Probleme beim Zugreifen auf 2. Form
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt bin ich komplett verwirrt o.O

Wär nett wenn jemand das hier ausprobieren könnte. Falls es an meiner Lazarus-Version liegt (die ich übrigens eben gepatcht hab), sollten sich beide Labels ändern...

Olli73 28. Jun 2013 20:16

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Acuaplano (Beitrag 1219949)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(self);

Du hast aber schon dafür gesorgt, dass Form2 nicht bereits auch automatisch erstellt wird? (Ich habe keine Ahnung, ob Lazarus sich da standardmäßig so verählt wie Delphi, d.h. die Forms selber erstellt)

Acuaplano 28. Jun 2013 20:33

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Olli73 (Beitrag 1219969)
Zitat:

Zitat von Acuaplano (Beitrag 1219949)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(self);

Du hast aber schon dafür gesorgt, dass Form2 nicht bereits auch automatisch erstellt wird? (Ich habe keine Ahnung, ob Lazarus sich da standardmäßig so verählt wie Delphi, d.h. die Forms selber erstellt)

Also wenn ich die Zeile lösche gibt's ne Fehlermeldung. Von daher würde ich einfach mal sagen, dass Lazarus die Forms nicht selber erstellt.

Sir Rufo 28. Jun 2013 20:36

AW: Probleme beim Zugreifen auf 2. Form
 
Welche Fehlermeldung und in welcher Zeile taucht die auf (gesamte Methode bis dahin posten)

Olli73 28. Jun 2013 20:42

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Acuaplano (Beitrag 1219949)
Also wenn ich die Zeile lösche gibt's ne Fehlermeldung. Von daher würde ich einfach mal sagen, dass Lazarus die Forms nicht selber erstellt.

Die einzige logische Erklärung die mir für dein Problem einfällt: TForm1.create wird aufgerufen bevor Form2 automatisch erstellt wird. Dieses verhalten würde mich zwar arg wundern, aber das Ergebnis wäre genau das was du jetzt hat; denn Form2 würde danach auf eine zweite Instanz von TForm2 zeigen, die aber unsichtbar ist.

Wie sieht denn die Projektdatei aus?

Acuaplano 28. Jun 2013 20:47

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Sir Rufo (Beitrag 1219972)
Welche Fehlermeldung und in welcher Zeile taucht die auf (gesamte Methode bis dahin posten)

"Projekt project1 hat Exception-Klasse >External:SIGSEGV< ausgelöst.
Bei Adresse 41B771"

Dann zeigt er mir ne Stelle in 'nem Assembler-Fenster an, wobei ich aber nicht sehr viel damit anfangen kann. Ich kann ja trotzdem einfach mal die Zeile zitieren:
Code:
(FORMS_TCUSTOMFORM_$__SHOW (19)<- Zeile im Assembler)
0041B771 8b09                     mov   (%ecx),%ecx
Sieht ja für mich einfach aus, dass er da auf ne Form zugreifen will, die nicht vorhanden ist... aber ich halt mich da lieber raus :D

Edit:
@Olli: Das ist ja mal eine interessante These! :D

Delphi-Quellcode:
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces,
  Forms,Unit1, Unit2;

{$R *.res}

begin
  Application.Initialize;
  RequireDerivedFormResource := True;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.
Jetzt merk ich's auch... Form2 sollte ja eigentlich schon erstellt sein. Aber müsste es dann nicht ein Namenskonflikt geben?

Edit2: JAAA! :D
Es muss wirklich so gewesen sein. Ich hab jetzt nen Button eingefügt, der die andere Form erstellt und es funktioniert endlich! Vielen Dank für die Hilfe! :thumb:

Uwe Raabe 28. Jun 2013 21:00

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Acuaplano (Beitrag 1219975)
Jetzt merk ich's auch... Form2 sollte ja eigentlich schon erstellt sein. Aber müsste es dann nicht ein Namenskonflikt geben?

Wieso denn? In TForm1.FormCreate weist du der Variablen Form2 einer Instanz von TForm2 zu. Danach wird in der Projekt-Datei der gleichen Variablen eine weitere Instanz von TForm2 zugewiesen. Da gibt es keinen Namenskonflikt.

Olli73 28. Jun 2013 21:03

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Acuaplano (Beitrag 1219975)
@Olli: Das ist ja mal eine interessante These! :D
Delphi-Quellcode:
  ...
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  ...

Wusst ich es doch, dass da beide automatisch erstellt werden.

Zitat:

Zitat von Acuaplano (Beitrag 1219975)
Jetzt merk ich's auch... Form2 sollte ja eigentlich schon erstellt sein. Aber müsste es dann nicht ein Namenskonflikt geben?

Wie schon geschrieben: Du änderst quasi nur den "Zeiger" Form2 von der ersten auf die zweite Instanz, die erste hängt dann in der Luft, kann also nicht mehr angesprochen werden, weil du die Speicheradresse nicht mehr kennst (wenn du dir sie nicht sonst irgendwo gemerkt hast oder ermitteln kanst).

Olli73 28. Jun 2013 21:09

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Acuaplano (Beitrag 1219975)
Edit2: JAAA! :D
Es muss wirklich so gewesen sein. Ich hab jetzt nen Button eingefügt, der die andere Form erstellt und es funktioniert endlich! Vielen Dank für die Hilfe! :thumb:

"erstellt"? Entweder nur show aufrufen oder (bei erstellen/create) das automatische Erstellen entfernen, sonst hast du immer noch 2 Instanzen.

Acuaplano 28. Jun 2013 21:22

AW: Probleme beim Zugreifen auf 2. Form
 
Zitat:

Zitat von Olli73 (Beitrag 1219983)
"erstellt"? Entweder nur show aufrufen oder (bei erstellen/create) das automatische Erstellen entfernen, sonst hast du immer noch 2 Instanzen.

Ja ich meinte mit Show aufrufen. Hab' jetzt bisschen rumgebastelt und im eigentlichen Projekt funktioniert jetzt alles wie es soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz