Im Projekt eine 2.Form laden

Für Fragen von Einsteigern und Programmieranfängern...
Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Im Projekt eine 2.Form laden

Beitrag von Jakane »

Guten Morgen :D

Mein Programm wird mir langsam zu unübersichtlich, sowohl im Code als auch in der Darstellung.
Deswegen möchte ich einige Funktionen auf eine andere Form übertragen.
Das ist soweit auch kein Problem, aber ich weiss nicht wie ich dem sage das er bei Button-Click die Form starten soll.

Ich glaube zu wissen, das irgendwas hier rein muss, aber "einfach" Form_01 kopieren ist nicht:

Code: Alles auswählen

uses
  ...;
 
type
 
  { TfmForm_01 }
  TfmForm_01 = class(TForm)  
  { TfmForm_02 }
  TfmForm_02 = class(TForm)
Ich habs auch so versucht, wie ich eine andere Komponente eingebaut habe

Code: Alles auswählen

uses
 ...;
 
type
 
  { TfmKaiko_01 }
 
  TForm_02 = class(TForm)
    public
      procedure DoButtonClick (Sender: TObject);
  end;
kann mir jemand verraten wie ich das schreiben müsste damit es klappt?
Damit ich über meinen TestButton1 Form_02 öffnen kann?

Danke für die Hilfe im vorraus :D
Zuletzt geändert von Lori am Di 15. Mär 2011, 21:35, insgesamt 1-mal geändert.
Grund: Highlighter
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
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: Im Projekt eine 2.Form laden

Beitrag von m.fuchs »

Jakane hat geschrieben:kann mir jemand verraten wie ich das schreiben müsste damit es klappt?
Damit ich über meinen TestButton1 Form_02 öffnen kann?

Danke für die Hilfe im vorraus :D
Im OnClick von TestButton1 einfach folgendes aufrufen:

Code: Alles auswählen

Form_02.Show;
Dabei ist noch zu beachten, dass die Unit die Form_02 enthält auch in der uses-Liste der Unit von Form_01 auftaucht.

hth
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: Im Projekt eine 2.Form laden

Beitrag von Jakane »

Dann nenn ich Blitzhilfe.
Und bei so einer einfachen Sache mach ich mir so eine Platte :D

Danke :D
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Im Projekt eine 2.Form laden

Beitrag von Maik81ftl »

Jakane hat geschrieben:Guten Morgen :D

Mein Programm wird mir langsam zu unübersichtlich, sowohl im Code als auch in der Darstellung.
Deswegen möchte ich einige Funktionen auf eine andere Form übertragen.
Das ist soweit auch kein Problem, aber ich weiss nicht wie ich dem sage das er bei Button-Click die Form starten soll.

Ich glaube zu wissen, das irgendwas hier rein muss, aber "einfach" Form_01 kopieren ist nicht:
uses
...;

type

{ TfmForm_01 }
TfmForm_01 = class(TForm)
{ TfmForm_02 }
TfmForm_02 = class(TForm)
Ich habs auch so versucht, wie ich eine andere Komponente eingebaut habe
uses
...;

type

{ TfmKaiko_01 }

TForm_02 = class(TForm)
public
procedure DoButtonClick (Sender: TObject);
end;
kann mir jemand verraten wie ich das schreiben müsste damit es klappt?
Damit ich über meinen TestButton1 Form_02 öffnen kann?

Danke für die Hilfe im vorraus :D

zugegeben. meine programme sind auch besonders sauber geschrieben, aber 2 Form in einer Unit?

ok. is am Ende deine entscheidung aber da mach ich lieber eine 2te auf. um den Überblick da nicht zu verlieren.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: Im Projekt eine 2.Form laden

Beitrag von Jakane »

Zum einen geht es darum es zu wissen,
zum anderen brauch ich in meinen eigendlichen Programm (was mit 3 Klicks zu durchlaufen ist) die Zusätze nicht immer, die sind quasi nur für die erweiterte Nutzung da :mrgreen:

Aber beim Arbeiten tauchte ein kleines Problem auf.

Wenn ich in Form01 die Verbindung zu Form11 mache, kann ich auf Form11 keine Rückverbindung machen :(

Code: Alles auswählen

kaiko_11.pas(11,11) Fatal: Circular unit reference between Form_11 and Form_01[/quote]
[quote]procedure TfmForm01.btnButton1Click(Sender : TObject);
begin
fmForm11.Show;
end;

Code: Alles auswählen

procedure TfmForm11.btnButton1Click(Sender : TObject);
begin
fmForm01.Show;
end;
Weiss jemand Rat?
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Im Projekt eine 2.Form laden

Beitrag von Maik81ftl »

Hmmm, mal zum allgemeinen Verständnis, damit ich das jetzt richtig verstehe.

du willst in Einer Unit 2 Formulare anlegen?

hab das gard mal bei mir versucht, aber wärend der Programmierung, zeigt er ja nur ein Formular an.

vondaher und da lass ich mich gerne eines Besseren Beleeren, geht das schon mal garnich oder? essei denne nu erstellst die Form2 komlett zu fuß.

mich gerade selber beleert ^^

geht doch.

Ähmmm hast du die Zeilen

Code: Alles auswählen

program Eintrag;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, LResources, Unit1
  { you can add units after this };
 
{$IFDEF WINDOWS}{$R Eintrag.rc}{$ENDIF}
 
begin
  {$I Eintrag.lrs}
  Application.Initialize;
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm5, Form5);
  Application.Run;
end.
in der Projektdatei wie o.b angelegt?

Edit2*

Nach weiteren Versuchen, kann ich dir nur raten, des wird sehr schwer werden.

mit ausschlaggebend ist auch folgender Dateiausschnitt.

Code: Alles auswählen

object Form4: TForm4
  Left = 706
  Height = 300
  Top = 186
  Width = 400
  ActiveControl = Button1
  Caption = 'Form4'
  ClientHeight = 300
  ClientWidth = 400
  LCLVersion = '0.9.28.2'
  object Button1: TButton
    Left = 66
    Height = 25
    Top = 53
    Width = 75
    Caption = 'Button1'
    OnClick = Button1Click
    TabOrder = 0
  end
end
einzige mgl. Form2 alles zu fuß machen.

was anderes kann ich dir da auch nicht geben.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: Im Projekt eine 2.Form laden

Beitrag von Jakane »

Von meiner Haupt-Form auf die 2. zu kommen ist klein Problem, wenn ich die Komponenten ausklammere in der Haupt-Form, kann ich auch von der 2. Form zurück zur Haupt-Form, aber beides gleichzeitig geht nicht :|

Also das ich von meiner Haupt-Form mich über ein Button in die 2. Form clicke und von dieser dann über einen weiteren Button wieder zurück auf die Haupt-Form :|

Sehr seltsam...
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Re: Im Projekt eine 2.Form laden

Beitrag von schnullerbacke »

Man könnte ja auch...

in der Unit ein Dummy anlegen, etwa so...

Code: Alles auswählen

MyUnknownObjekt: TObject;
Da alles in der LCL von TObject abstammt, darf man darin auch ein beliebiges Formular speichern. Das könnte man auf Knopfdruck(Click) machen und dann:

Code: Alles auswählen

if TypeOf(MyUnknownObjekt) = TForm then TForm(MyUnknownObjekt).Show else 'blablubb';
veranstalten.

Dann darf man das Formular in einer anderen Unit zusammenbauen und kann es trotzdem im Aufrufer laden... :shock:
Zuletzt geändert von Lori am Mi 16. Mär 2011, 18:54, insgesamt 1-mal geändert.
Grund: Highlighter
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
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: Im Projekt eine 2.Form laden

Beitrag von m.fuchs »

Jakane hat geschrieben:Von meiner Haupt-Form auf die 2. zu kommen ist klein Problem, wenn ich die Komponenten ausklammere in der Haupt-Form, kann ich auch von der 2. Form zurück zur Haupt-Form, aber beides gleichzeitig geht nicht :|
Also das ich von meiner Haupt-Form mich über ein Button in die 2. Form clicke und von dieser dann über einen weiteren Button wieder zurück auf die Haupt-Form :|
Sehr seltsam...
Was meinst du mit ausklammern? Und mit wieder zurück? Dein Hauptform sollte doch die ganze Zeit weiterlaufen.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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: Im Projekt eine 2.Form laden

Beitrag von MAC »

mit ausklammern meint er wahrscheinlich

Code: Alles auswählen

{ ausgeklammert }
Ich vermute jetzt mal einfach du hast in unit 1 stehen:

Code: Alles auswählen

unit1;
 
uses ,...,...,...unit2;
und in unit 2 steht

Code: Alles auswählen

unit2;
 
uses ,...,...,...unit1;
Wenn das nicht geht, dann ist das ganz normal, der compiler geht durch sieht in unit 1, unit 2 wird benötigt, geht in unit 2 sieht dort unit 1 wird benötigt ,...
Was dagegen hilft ?

unit1 und unit 2 erst im implementation teil deklarieren. Mindestens eine davon ...

Code: Alles auswählen

unit 1;
uses ... unit2;// unit 1bleibt...

Code: Alles auswählen

unit2;
uses ,....,...,...,... ; //kein unit1
type
   TForm2 = class...
   ...
 
var
   Form2:TForm2;
 
implementation   
uses Unit1; // hier hin kommt das

Code: Alles auswählen

Signatur := nil;

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: Im Projekt eine 2.Form laden

Beitrag von Jakane »

Danke für die guten Tipps :) ich habs übern Dummy gemacht danke
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: Im Projekt eine 2.Form laden

Beitrag von Jakane »

Ich hoffe das Folgeproblem passt hier rein :roll:

Ich hab ja jetzt 2 Formen, jetzt hab ich in der einen Form eine TStringList mit Inhalt, die ich aber in der 2. Form ausgeben möchte in einer ListBox.
Ich hab versucht diese TStringList als globale Variable laufen zu lassen, aber irgendwie hab ich das mit denen wohl noch nicht so begriffen :mrgreen: zumindest kennt meine 2. Form die TStringList nicht und will sie ständig deklariert haben :mrgreen:

Kann mir das jemand erklären? irgendwie schein ich die Tutorials nicht zu verstehen :?

Danke
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: Im Projekt eine 2.Form laden

Beitrag von baba »

Jakane hat geschrieben:Ich hoffe das Folgeproblem passt hier rein :roll:

Ich hab ja jetzt 2 Formen, jetzt hab ich in der einen Form eine TStringList mit Inhalt, die ich aber in der 2. Form ausgeben möchte in einer ListBox.
Ich hab versucht diese TStringList als globale Variable laufen zu lassen, aber irgendwie hab ich das mit denen wohl noch nicht so begriffen :mrgreen: zumindest kennt meine 2. Form die TStringList nicht und will sie ständig deklariert haben :mrgreen:

Kann mir das jemand erklären? irgendwie schein ich die Tutorials nicht zu verstehen :?

Danke

... man schreibe z.B. in form2 - form1.stringgrid.cells etc.

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: Im Projekt eine 2.Form laden

Beitrag von Jakane »

Form2.pas(40,33) Error: Identifier not found "Form1"
:(
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Re: Im Projekt eine 2.Form laden

Beitrag von schnullerbacke »

Also dann mal wieder der Tipp für's einfache Gemüt...

in Form2 deklarierst du deine Stringlist als public property. Das hat den Vorteil, dass man darauf aus Form1 direkt zugreifen kann.
Nun bleibt es dir überlassen, ob du in Form1 die Stringlist aus Form2 erben willst, das wäre aber einfach möglich indem man in Form1 ein property anlegt:

Code: Alles auswählen

private
      property MyUnknownStrList: TStringList;
 
  // und irgendwann dann:
 
procedure MyForm1.MachWasSpannendes;
begin
   MyUnknownStrList:= Form2.DieseStrList;
     {oder wie immer das Monstrum da heisst}
end;
:P
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Antworten